DIP
Princípio da Inversão de Dependências (DIP)
"Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações. Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações." - Martin, Robert C.
Exemplo:
Usando log fixo, alta dependência.
%% Log fixo e acoplamento direto
classDiagram
class DoClass {
+do(atributo)
}
DoClass : do() --> System.out.println
Mesmo criando uma classe Log para "separar a responsabilidade" ainda vamos ter um forte acoplamento.
%% Acoplamento via classe Log
classDiagram
class Log {
+escrever(mensagem)
}
class DoClass {
-Log log
+do(atributo)
}
DoClass --> Log
Log : escrever() --> System.out.println
Neste caso, o método está diretamente acoplado ao console. Se quiser mudar para arquivo ou banco, precisa alterar a classe.
%% Depois: aplicando DIP
classDiagram
class Logger {
<<interface>>
+escrever(mensagem)
}
class Logging {
<<interface>>
+log(mensagem)
}
class ConsoleLogger {
+escrever(mensagem)
}
class Log {
-Logger logger
+log(mensagem)
}
class DoClass {
-Logging logging
+do(atributo)
}
Logger <|.. ConsoleLogger
Logging <|.. Log
Log --> Logger
DoClass --> Logging
- O código está aberto para extensão (novos tipos de logger) e fechado para modificação.
- A classe Log não precisa saber como ou onde o log será salvo, apenas usa a abstração.
- Segue o DIP: depende de abstrações, não de implementações concretas.