O que, em referência ao DDD, é um contexto limitado?

40

Ao trabalhar no livro "Implementing Domain Driven Design", de Vaughn Vernon, não consegui entender bem o que é realmente um contexto limitado.

O livro define um contexto delimitado como "um limite conceitual onde um modelo de domínio é aplicável. Ele fornece uma linguagem onipresente que é falada pela equipe e expressa em seu modelo de software cuidadosamente projetado" (a seção de prefácio "Guia para este livro"). Essa definição faria parecer que um contexto delimitado é o modelo e a linguagem de um subdomínio, onde esse subdomínio pode ser o domínio principal (que parece que deve ser chamado de "subdomínio principal", mas é outra discussão ...). Isso ainda deixa alguma ambiguidade quanto ao que um contexto limitado fornece. É um agrupamento de um ou mais subdomínios? Se apenas um subdomínio corresponde a um contexto limitado, o que o contexto limitado está realmente nos dizendo?

O capítulo 3 do mesmo livro, no entanto, refere-se às técnicas de integração entre contextos limitados. Isso, no entanto, parece implicar que os contextos limitados são realmente sistemas de software ou artefatos de alguma variedade.

Martin Fowler discute brevemente a idéia de um contexto limitado ( http://martinfowler.com/bliki/BoundedContext.html ), mas na verdade não esclarece a questão.

No final do dia, o que é um contexto limitado? É um agrupamento de subdomínios? O modelo e o idioma de um subdomínio? A implementação de um subdomínio? Sem essas respostas, parece bastante difícil entender como decompor um espaço de problemas da vida real em contextos limitados.

Michael
fonte
2
Esse post realmente não deixa clara a definição, pelo menos para mim. Ele discute a ideia de contextos limitados, conforme eles podem se aplicar organizacionalmente, mas nunca liga isso de volta ao desenvolvimento de software.
Michael
11
ESTÁ BEM. Bem, embora eu não seja um especialista em DDD, achei esta descrição da Microsoft útil (no parágrafo Introdução): msdn.microsoft.com/en-us/library/jj591572.aspx . Ele diz: ...
Robert Harvey
11
Contextos limitados são componentes autônomos, com seus próprios modelos de domínio e sua própria linguagem onipresente. Eles não devem ter dependências entre si no tempo de execução e devem ser capazes de executar isoladamente. No entanto, eles são uma parte do mesmo sistema global e fazer necessidade de trocar dados com o outro ...
Robert Harvey
11
... Se você estiver implementando o padrão CQRS em um contexto delimitado, deverá usar eventos para este tipo de comunicação: seu contexto delimitado pode responder a eventos gerados fora do contexto delimitado e seu contexto delimitado pode publicar eventos que outros contextos limitados podem se inscrever. Eventos, permitem manter o acoplamento flexível entre seus contextos limitados.
Robert Harvey

Respostas:

38

Contextos e subdomínios limitados existem em diferentes níveis.

Um subdomínio é uma parte do espaço do problema, é um particionamento natural do sistema, geralmente refletindo a estrutura da organização. Portanto, a logística e as operações podem ser separadas do faturamento e cobrança . Eric diferencia subdomínios principais , de suporte e genéricos de acordo com a relevância dos negócios no cenário fornecido.

Contextos são partes do espaço das soluções. Eles são modelos . Seria bom tê-los, refletir a partição de domínios-subdomínios ... mas a vida nem sempre é fácil. E você pode ter um domínio legado inchado que abrange tudo, ou mais contexto no mesmo subdomínio (por exemplo, aplicativo legado antigo que o aplicativo substituto que alguém está criando).

Para ter um contexto limitado, você precisa ter um modelo e um limite explícito em torno dele. Exatamente o que está faltando em muitos aplicativos orientados a dados que usam bancos de dados para compartilhar dados.

Outra maneira - ortogonal - de ver isso pode ser a seguinte. Linguagem onipresente , a condição especial em que cada termo tem uma única definição inequívoca, não é escalável. Quanto mais você o amplia, maior a ambiguidade. Se você deseja obter modelos precisos e inequívocos, precisa tornar explícitos seus limites e falar muitas pequenas línguas onipresentes, cada uma dentro de um único contexto limitado, com um objetivo bem definido. .

ZioBrando
fonte
11
Então, em um mundo ideal, haveria uma relação de 1 para 1 entre subdomínios e contextos limitados? (Compreendendo, obviamente, que o que é ideal e o que é verdadeiro é diferente).
Michael
2
Não necessariamente: o principal é que um BC que se sobreponha a muitos subdomínios seja um mau cheiro. Bem ... não é limitado. Em termos de DDD, um modelo deve ser perfeitamente adequado ao seu objetivo, e subdomínios diferentes têm propósitos diferentes (e provavelmente até chefes diferentes com objetivos diferentes). Mas dentro do mesmo subdomínio, diferentes BC podem existir por diferentes razões. O aplicativo da Web e móvel pode ser o caso ou modelos diferentes de planejamento ou execução .
ZioBrando 5/05
Mas o importante é entender que existem duas famílias de problemas: 1) lendo o contexto existente (onde você só pode aceitar e categorizar os modelos e colaborações existentes), 2) projetando o software certo, dadas as restrições existentes, impondo limites de contexto entre pequenos modelos orientados para o propósito. No segundo cenário, você não sobrepõe intencionalmente as bordas dos subdomínios. ... em geral, procurar um software perfeito em uma organização não perfeita pode ser algo difícil. Mas resolver essas inconsistências pode valer a pena.
ZioBrando
8

As técnicas de Design Orientado a Domínio são usadas para nos ajudar a criar modelos do mundo em que vivemos. Esses modelos existem como idéias nas mentes das pessoas envolvidas em um projeto.

Como a telepatia ainda está em sua infância, essas idéias são comunicadas entre as pessoas usando palavras e frases.

Palavras e frases podem ser ambíguas na melhor das hipóteses. Para nos ajudar a reduzir a ambiguidade, usamos o 'contexto' para esclarecer seu significado.

Quando as pessoas ficam profundamente imersas em um projeto de software que se estende por anos, parecem esquecer o contexto de onde surgiram as idéias que se transformaram nas palavras que se transformaram nos nomes das variáveis ​​inseridas no código.

Os iniciantes chegam ao projeto e começam a usar e consumir seu idioma. Talvez eles sejam usuários, talvez sejam desenvolvedores. Se não houver contexto fornecido a eles, eles apresentarão seu próprio contexto (e, portanto, significado) a partir de sua própria experiência de vida.

Esse novo contexto aplicado orientará como os novos desenvolvedores refatoram ou desenvolvem o código. Se eles aplicarem o contexto errado, refatorarão e desenvolverão o código, talvez levemente, na direção errada. Direções incorretas, por mais leves que sejam, podem causar problemas muito maiores na linha.

A meu ver, um "contexto limitado" é meramente um "contexto esclarecido" que é entregue aos iniciantes do projeto, para que eles não apliquem seu próprio contexto arbitrário para manchar nosso modelo lindamente aperfeiçoado.

É algum reconhecimento explícito, pela equipe, que this phrase, no this part of the projectmeio exatamente this thing(e não, como você pode muito bem pensar, that thing).

Assim como é uma boa ideia marcar os limites entre o seu jardim e o jardim do seu vizinho. Você especifica explicitamente o limite para não ficar com raiva quando eles começam a cavar um canteiro de flores em seu gramado bem cuidado.

É isso. É uma idéia muito simples, tão importante que muito foi escrito sobre isso.

Então sim. Um contexto limitado é literalmente um limite, uma "cerca", que distingue entre o contexto de um subdomínio e o contexto de outro subdomínio em um projeto.

O modelo e a linguagem de um subdomínio são isolados de outros modelos e linguagens para evitar ambiguidades no significado.

Mas sim. O mundo não é tão simples.

Você e a equipe precisam ser rigorosos ao aderir ao contexto definido. É realmente fácil ser preguiçoso e re-imaginar o contexto para cortar custos durante a construção do software.

Além disso, as coisas interagem com outras e os contextos limitados também precisam interagir. Portanto, existem vários padrões para descrever como essas interações ocorrem. Consulte o livro de Eric Evan, capítulo 14, sobre o Design Orientado a Domínio, para obter vários padrões: Kernel Compartilhado, Fornecedor do Cliente, Conformista, Camada Anticorrupção, Maneiras Separadas, Serviço de Host Aberto, Idioma Publicado.

JW01
fonte
11
Portanto, é basicamente uma cerca em torno de um subdomínio.
Robert Harvey
11
Sim. Tanto quanto eu posso ver. É uma cerca.
JW01
0

Basicamente, o contexto limitado define alguns limites tangíveis de aplicabilidade de algum subdomínio. É uma área abstrata em que um certo subdomínio faz sentido, enquanto os outros não. Portanto, isso pode ser uma palestra, uma apresentação, um projeto de código com limites físicos definidos pelo artefato.

Em diferentes situações, uso três perspectivas diferentes, ou metáforas do conceito de contexto vinculado.

Da perspectiva do tempo de execução, ele representa limites lógicos, definidos pelo contrato de um serviço em que o modelo é implementado. O contrato pode ser representado como a API deste serviço ou um conjunto de eventos que publica e consome. Portanto, dessa perspectiva, o contexto limitado não tem nada a ver com limites físicos.

Da perspectiva de um especialista em domínio, o contexto limitado é uma área em que certos processos de negócios são implementados, a linguagem onipresente é aplicada e certos termos fazem um sentido claro, enquanto os outros não. Portanto, é apenas um retângulo desenhado em uma folha de papel ou em um quadro branco.

Para um desenvolvedor de software, ou seja, da perspectiva do código estático, um contexto limitado representa uma maneira de projetar meus modelos em torno dos subdomínios correspondentes. Com quantas bases de código um subdomínio específico é implementado? Em quais conceitos eles consistem? Quais conceitos são aplicáveis ​​em cada um deles? É por isso que se diz que contextos limitados pertencem a um espaço de solução.

Eu realmente gosto deste exemplo do conceito de contexto limitado.

Outra questão importante (se não a mais importante) é como identificar contextos limitados . Se você fizer isso de forma incorreta, você terminará com serviços faladores, inaceitáveis ​​e fortemente acoplados , também conhecidos como monólito distribuído .

Zapadlo
fonte