Key Concepts
Notificação na Figura 1-2 de que cada uma das camadas da arquitetura está marcada como sendo fechada. Este é um conceito muito importante no padrão de arquitetura estratificada. Uma camada fechada significa que quando uma requisição se move de camada para camada, ela deve passar pela camada logo abaixo dela para chegar à próxima camada abaixo daquela. Por exemplo, uma solicitação originada da camada de apresentação deve primeiro passar pela camada de negócios e depois pela camada de persistência antes de finalmente atingir a camada de banco de dados.
Então por que não permitir o acesso direto da camada de apresentação à camada de persistência ou à camada de base de dados? Afinal, o acesso direto à base de dados a partir da camada de apresentação é muito mais rápido do que passar por um monte de camadas desnecessárias apenas para recuperar ou salvar informações da base de dados. A resposta a esta pergunta reside em um conceito chave conhecido como camadas de isolamento.
O conceito de camadas de isolamento significa que as alterações feitas em uma camada da arquitetura geralmente não impactam ou afetam componentes em outras camadas: a alteração é isolada para os componentes dentro dessa camada, e possivelmente outra camada associada (tal como uma camada de persistência contendo SQL). Se você permitir o acesso direto da camada de apresentação à camada de persistência, então as alterações feitas em SQL dentro da camada de persistência teriam impacto tanto na camada de negócios quanto na camada de apresentação, produzindo assim uma aplicação muito acoplada com muitas interdependências entre os componentes. Este tipo de arquitetura torna-se então muito difícil e caro de mudar.
As camadas do conceito de isolamento também significa que cada camada é independente das outras camadas, tendo assim pouco ou nenhum conhecimento do funcionamento interno das outras camadas na arquitetura. Para entender o poder e a importância deste conceito, considere um grande esforço de refatoração para converter a estrutura de apresentação de JSP (Java Server Pages) para JSF (Java Server Faces). Assumindo que os contratos (por exemplo, modelo) usados entre a camada de apresentação e a camada de negócios permanecem os mesmos, a camada de negócios não é afetada pela refatoração e permanece completamente independente do tipo de estrutura de interface de usuário usada pela camada de apresentação.
Embora as camadas fechadas facilitem as camadas de isolamento e, portanto, ajudem a isolar as mudanças dentro da arquitetura, há momentos em que faz sentido que certas camadas sejam abertas. Por exemplo, suponha que você queira adicionar uma camada de serviços compartilhados a uma arquitetura contendo componentes de serviços comuns acessados por componentes dentro da camada de negócios (por exemplo, classes utilitárias de dados e strings ou classes de auditoria e registro). Criar uma camada de serviços normalmente é uma boa idéia neste caso porque, arquitetonicamente, ela restringe o acesso aos serviços compartilhados à camada de negócios (e não à camada de apresentação). Sem uma camada separada, não há nada arquitetonicamente que restrinja o acesso da camada de apresentação a esses serviços comuns, tornando difícil governar essa restrição de acesso.
Neste exemplo, a nova camada de serviços provavelmente residiria abaixo da camada de negócios para indicar que os componentes desta camada de serviços não são acessíveis a partir da camada de apresentação. No entanto, isso apresenta um problema na medida em que a camada de negócios agora é obrigada a passar pela camada de serviços para chegar à camada de persistência, o que não faz sentido algum. Este é um problema antigo com a arquitetura em camadas, e é resolvido com a criação de camadas abertas dentro da arquitetura.
Como ilustrado na Figura 1-3, a camada de serviços neste caso é marcada como aberta, ou seja, os pedidos são permitidos para contornar esta camada aberta e ir diretamente para a camada abaixo dela. No exemplo a seguir, como a camada de serviços está aberta, a camada de negócios pode agora contorná-la e ir diretamente para a camada de persistência, o que faz todo o sentido.
Alavancar o conceito de camadas abertas e fechadas ajuda a definir a relação entre as camadas da arquitetura e os fluxos de requisição e também fornece aos projetistas e desenvolvedores as informações necessárias para entender as várias restrições de acesso às camadas dentro da arquitetura. A falha em documentar ou comunicar corretamente quais camadas da arquitetura são abertas e fechadas (e por quê) geralmente resulta em arquiteturas bem acopladas e quebradiças que são muito difíceis de testar, manter e implantar.