Princípio da Inversão de Dependência: Entendendo como componentes de baixo nível e componentes de alto nível dependem de abstrações

10

Estou aprendendo sobre o Princípio da Inversão de Dependências. Diz que:

Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações.

Por um tempo, tentei entender o que significa que os componentes de alto nível e os de baixo nível dependem das abstrações e são dependentes delas .

Suponho que ambos devam depender da mesma abstração de alguma forma. Por favor, corrija-me se isso estiver errado.

Eu cheguei a alguma conclusão sobre o que isso significa. Confirme se está correto.

insira a descrição da imagem aqui

" Os componentes de alto nível dependem da abstração" - Significado:

Os componentes de alto nível conversam com uma interface para se comunicar com os componentes de baixo nível , em vez de se comunicar diretamente com os componentes de baixo nível de concreto. Os componentes de baixo nível implementam essa interface.

" Os componentes de baixo nível dependem da abstração" - Significado:

Os componentes de baixo nível são definidos e projetados nos termos da interface. Eles são projetados para caber na interface . Eles dependem da interface, da maneira que a interface define como eles são projetados. (Geralmente, as classes de baixo nível implementam essa interface).

Dessa forma, os componentes de alto nível e os de baixo nível são 'dependentes da abstração', mas de maneiras diferentes.

Essa é uma boa compreensão?

Aviv Cohn
fonte
8
Você é muito bonito no local. A última peça do quebra-cabeça é que a interface é definida pelo componente de alto nível , e não pelo de baixo nível. Em outras palavras, a preocupação de alto nível (por exemplo, o modelo de domínio) consegue escolher a maneira mais conveniente de conversar com o código de baixo nível (como código de acesso a dados), e é o trabalho do código de baixo nível estar em conformidade para essa interface. Quando você entende que a interface faz parte do comportamento de alto nível, o termo 'inversão de dependência' faz muito mais sentido.
Benjamin Hodgson
1
@BenjaminHodgson eu vejo. Deixe-me ver se eu entendo. Obviamente, um objeto não pode definir uma interface, esse é o trabalho do programador. Portanto, por "a interface é definida pelo componente de alto nível" , suponho que você queira dizer "o programador define a interface em termos do que será uma maneira conveniente para os componentes de alto nível falarem com os de baixo nível ". Você confirma?
Aviv Cohn
(já que os de baixo nível mais tarde implementarão essa interface e serão construídos de acordo com ela).
Aviv Cohn
Sim, obviamente, todo o código é escrito pelo programador. Eu estava tentando transmitir a ideia de que a interface faz parte conceitualmente da preocupação de alto nível; você deve colocá-lo no mesmo pacote do seu código de alto nível e deve mudar de acordo com os requisitos de negócios, não em resposta a alterações nos detalhes da implementação.
Benjamin Hodgson
1
Gostaria apenas de acrescentar uma ressalva de que, embora seja ideal, você nem sempre tem o luxo de definir a interface de baixo nível em termos de quais sejam os requisitos do componente de alto nível. Por exemplo, se você estiver integrando uma biblioteca existente que fornece algumas funcionalidades úteis ao seu aplicativo, é provável que tenha componentes de alto nível que representam a função comercial que você está tentando realizar. Eles usam essa biblioteca de baixo nível (como talvez o iText, por exemplo) para realmente fazer o trabalho. Você provavelmente não terá o luxo de definir a abstração sem levar em consideração o que o iText precisa.
Calphool

Respostas:

6

Sua compreensão do conceito é muito precisa.

Apontar exceções, casos especiais ou minúcias filosóficas agora mesmo o desviaria da sua atual clareza de conceito.

Sugiro, porém, que você use símbolos UML:

insira a descrição da imagem aqui

  • Seta aberta: usa
  • Seta fechada: herda ou implementa
  • << nome entre colchetes >>: interface ou classe abstrata
Tulains Córdova
fonte
0

Sim, muitas pessoas pensam na construção de software como na construção civil. O banco de dados é a "base" em que o DAL fica em cima dele, a camada de negócios fica no DAL, a interface do usuário fica na camada de negócios ...

Em vez disso, pense nisso como um celular pendurado. Onde as "camadas" ficam penduradas em uma âncora comum. A interface do usuário e a camada de negócios são suspensas na interface de negócios, a camada de negócios e o DAL são suspensos na interface do DAL, o DAL e o banco de dados se conectam através da interface do banco de dados.

Michael Brown
fonte