em conjunto os componentes relacionados (altacoesao), e fazer com que estes possuam o minimo de conhecimento sobre os outros componentes (baixo acoplamento). Para alcancar o baixo acoplamento e uma alta coesao e importante entender o conceito de Separacao de Responsabilidades.Separacao de Responsabilidades (Separation of Concerns)O termo Separacao de Responsabilidades foi criado pelo pai do algoritmo de caminho minimo, o cientista Edsger W. Dijkstra em 1974, e tem como objetivo dividir a aplicacao em funcionalidade distintas com a menor similaridade possivel entre elas. Para aplicar com sucesso este principio, o mais importante e minimizar os pontos de interacao para obter alta coesao e baixo acoplamento entre os componentes do sistema. Para tanto, e recomendado, primeiro dividir suas responsabilidades e organiza-las em elementos bem definidos, sem repeticao de codigo ou de funcionalidade.O tipo de separacao de conceito mais difundido e o da separacao horizontal, onde dividimos a aplicacao em camadas logicas de funcionalidades, como por exemplo, o protocolo TCP/IP (modelo OSI), que e separado pelas camadas de aplicacao, transporte, rede, enlace e fisica. Neste modelo, cada camada tem sua propria responsabilidade e nao precisa conhecer as camadas adjacentes. Voltando ao nosso mundo, em uma aplicacao Java EE, as camadas mais conhecidas sao a de Apresentacao, Servico, Dominio e Infraestrutura, como ilustra a Figura 1.Figura 1. Separacao Horizontal de Conceitos (Camadas logicas de uma aplicacao).Podemos tambem aplicar o tipo de separacao vertical, onde dividimos a aplicacao em modulos ou funcionalidades que sao relacionadas a um subsistema ou grupo de operacoes dentro de um sistema.Veja um exemplo na Figura 2.Figura 2. Separacao Vertical de Conceitos.Separar as funcionalidades de uma aplicacao em modulos deixa claro as responsabilidades e dependencias de cada funcionalidade, o que ajuda na execucao dos testes e na manutencao dosoftware. Na Figura 2 fazemos um agrupamento por modulos; neste caso a separacao foi feita pelos modulos de RH, Contabil e Marketing.Alem disso, podemos utilizar o conceito de separacao vertical em conjunto com o conceito de separacao horizontal. Veja um exemplo na Figura 3.Figura 3. Aplicacao da Separacao de Conceitos Vertical e Horizontal.Um papel importante da separacao de conceitos e o da separacao de comportamento, que envolve a divisao dos processos do sistema em unidades logicas de codigo reutilizaveis e gerenciaveis. Ao organizar o comportamento, alcancamos os seguintes beneficios:Eliminamos a duplicacao de funcionalidades;Minimizamos as dependencias externas;Maximizamos o potencial para reuso;Restringimos o escopo do trabalho para os limites de cada modulo.Como vimos, e importante entender a separacao de conceitos pois ao modelarmos uma aplicacao devemos ter conhecimento das responsabilidades de cada um de seus componentes. Alem disso, devemos ter uma ideia de como sera feita esta separacao e como sera feita a distribuicao destes componentes na arquitetura disponivel pelo cliente.Para tanto, e preciso levar em consideracao outros fatores, como infraestrutura e recursos disponiveis, conforme veremos a seguir, no proximo artigo da serie.ReferenciasExcelente artigo sobre separacao de responsabilidadeshttp://www.aspiringcraftsman.com/2008/01/art-of-separation-of-concerns/Biografia de Edsger Dijkstra.http://pt.wikipedia.org/wiki/Edsger_DijkstraGuia de Arquitetura de Aplicacoes da Microsoft.http://www.codeplex.com/AppArchGuide