Padrão de Camada AnticorrupçãoAnti-Corruption Layer pattern

Implemente uma camada de fachada ou de adaptador entre diferentes subsistemas que não compartilham a mesma semântica.Implement a façade or adapter layer between different subsystems that don't share the same semantics. Essa camada move solicitações feitas por um subsistema para o outro subsistema.This layer translates requests that one subsystem makes to the other subsystem. Use esse padrão para garantir que o design do aplicativo não seja limitado por dependências em subsistemas externos.Use this pattern to ensure that an application's design is not limited by dependencies on outside subsystems. Esse padrão foi descrito pela primeira vez por Eric Evans em Design orientado ao domínio.This pattern was first described by Eric Evans in Domain-Driven Design.

Contexto e problemaContext and problem

A maioria dos aplicativos depende de outros sistemas para alguns dados ou funcionalidade.Most applications rely on other systems for some data or functionality. Por exemplo, quando um aplicativo herdado é migrado para um sistema moderno, talvez ainda precise de recursos herdados existentes.For example, when a legacy application is migrated to a modern system, it may still need existing legacy resources. Os novos recursos devem ser capazes de chamar o sistema herdado.New features must be able to call the legacy system. Isso é especialmente verdadeiro para migrações graduais, onde os diferentes recursos de um aplicativo maior são movidos para um sistema moderno ao longo do tempo.This is especially true of gradual migrations, where different features of a larger application are moved to a modern system over time.

Geralmente, esses sistemas herdados sofrem problemas de qualidade, como esquemas de dados diferentes ou APIs obsoletas.Often these legacy systems suffer from quality issues such as convoluted data schemas or obsolete APIs. Os recursos e tecnologias usados em sistemas herdados podem variar amplamente em sistemas mais modernos.The features and technologies used in legacy systems can vary widely from more modern systems. Para interagir com o sistema herdado, pode ser necessário que o novo aplicativo dê suporte a infraestrutura, protocolos, modelos de dados, APIs ou outros recursos desatualizados que você não colocaria em um aplicativo moderno.To interoperate with the legacy system, the new application may need to support outdated infrastructure, protocols, data models, APIs, or other features that you wouldn't otherwise put into a modern application.

Manter o acesso entre sistemas herdados e novos pode forçar o novo sistema a aderir a pelo menos algumas das APIs do sistema herdado ou outras semânticas.Maintaining access between new and legacy systems can force the new system to adhere to at least some of the legacy system's APIs or other semantics. Quando esses recursos herdados tiverem problemas de qualidade, o suporte a eles "corrompe" o que, caso contrário, seria um aplicativo moderno projetado corretamente.When these legacy features have quality issues, supporting them "corrupts" what might otherwise be a cleanly designed modern application.

Problemas semelhantes podem surgir com qualquer sistema externo que sua equipe de desenvolvimento não controle, não apenas com sistemas herdados.Similar issues can arise with any external system that your development team doesn't control, not just legacy systems.

SoluçãoSolution

Isole os diferentes subsistemas colocando uma camada anticorrupção entre eles.Isolate the different subsystems by placing an anti-corruption layer between them. Essa camada move as comunicações entre os dois sistemas, permitindo que um sistema permaneça inalterado, enquanto o outro pode evitar comprometer seu design e sua abordagem tecnológica.This layer translates communications between the two systems, allowing one system to remain unchanged while the other can avoid compromising its design and technological approach.

Diagrama do padrão da Camada Anticorrupção

O diagrama acima mostra um aplicativo com dois subsistemas.The diagram above shows an application with two subsystems. O Subsistema A chama para o Subsistema B por meio de uma camada anticorrupção.Subsystem A calls to subsystem B through an anti-corruption layer. A comunicação entre o Subsistema A e a camada anticorrupção sempre usa o modelo de dados e a arquitetura do subsistema A. Chamadas da camada anticorrupção para o Subsistema B estão em conformidade com o modelo de dados ou os métodos desse subsistema.Communication between subsystem A and the anti-corruption layer always uses the data model and architecture of subsystem A. Calls from the anti-corruption layer to subsystem B conform to that subsystem's data model or methods. A camada anticorrupção contém toda a lógica necessária para traduzir entre os dois sistemas.The anti-corruption layer contains all of the logic necessary to translate between the two systems. A camada pode ser implementada como um componente do aplicativo ou como um serviço independente.The layer can be implemented as a component within the application or as an independent service.

Problemas e consideraçõesIssues and considerations

  • A camada anticorrupção pode adicionar latência para chamadas feitas entre os dois sistemas.The anti-corruption layer may add latency to calls made between the two systems.
  • A camada anticorrupção adiciona outro serviço que deve ser gerenciado e mantido.The anti-corruption layer adds an additional service that must be managed and maintained.
  • Considere como a camada anticorrupção será dimensionada.Consider how your anti-corruption layer will scale.
  • Considere se você precisa de mais de uma camada anticorrupção.Consider whether you need more than one anti-corruption layer. Talvez você queira decompor a funcionalidade em vários serviços usando tecnologias ou linguagens diferentes, ou pode haver outros motivos para particionar a camada anticorrupção.You may want to decompose functionality into multiple services using different technologies or languages, or there may be other reasons to partition the anti-corruption layer.
  • Considere como a camada anticorrupção será gerenciada em relação com outros aplicativos ou serviços.Consider how the anti-corruption layer will be managed in relation with your other applications or services. Como ele será integrado aos processos de monitoramento, versão e configuração?How will it be integrated into your monitoring, release, and configuration processes?
  • Certifique-se de que a transação e a consistência de dados sejam mantidas e que possam ser monitoradas.Make sure transaction and data consistency are maintained and can be monitored.
  • Leve em consideração se a camada anticorrupção precisa lidar com toda a comunicação entre diferentes subsistemas ou apenas com um subconjunto de recursos.Consider whether the anti-corruption layer needs to handle all communication between different subsystems, or just a subset of features.
  • Se a camada anticorrupção fizer parte de uma estratégia de migração, leve em consideração se ela será permanente ou se será desativada depois que todas as funcionalidades herdadas forem migradas.If the anti-corruption layer is part of an application migration strategy, consider whether it will be permanent, or will be retired after all legacy functionality has been migrated.

Quando usar esse padrãoWhen to use this pattern

Use esse padrão quando:Use this pattern when:

  • Haja um plano de migração que acontecerá em vários estágios, mas a integração entre os sistemas novo e herdado precisará ser mantida.A migration is planned to happen over multiple stages, but integration between new and legacy systems needs to be maintained.
  • Dois ou mais subsistemas têm semânticas diferentes, mas ainda precisam se comunicar.Two or more subsystems have different semantics, but still need to communicate.

Esse padrão poderá não ser adequado se não houver nenhuma diferença significativa semântica entre os sistemas herdados e novos.This pattern may not be suitable if there are no significant semantic differences between new and legacy systems.