Estou aprendendo o princípio SOLID. Ao aprender o "Princípio da Inversão de Dependência", descobri que a classe deve depender de interfaces em vez de classes concretas.
Isso significa que a composição não é permitida? Além disso, a agregação é igual ao DIP?
Composição:
class HPDesktop {
private BluetoothMouse bluetoothMouse;
private BluetoothKeyboard bluetoothKeyboard;
public HPDesktop(){
bluetoothMouse = new BluetoothMouse();
bluetoothKeyboard = new BluetoothKeyboard();
}
}
DIP: (Isso parece ser uma agregação)
class HPDesktop {
private Mouse mouse;
private Keyboard keyboard;
public HPDesktop(Mouse mouse, Keyboard keyboard){
this.mouse = mouse;
this.keyboard = keyboard;
}
}
Não, porque você não entende quais tipos de dependências estão sendo discutidas.
Inversão de Dependência é o conceito de que módulos de alto nível não devem depender de detalhes de módulos de baixo nível, esta "exposição" dos detalhes do módulo de baixo nível é chamada de "abstração vazada"
Por exemplo, digamos que estou agrupando uma implementação de registro em log com uma nova fachada, que me permite "fazer mais" com o registro em log do que fiz recentemente com o Log4j. Se eu expus os níveis de log Log4j como elementos em meu design, então terei uma dependência entre minha fachada e os níveis de log Log4j porque minha fachada requer Log4j.
Agora, se eu criasse meus próprios níveis de log de fachada, todos que usassem minha fachada não precisariam importar o Log4j para usar os níveis de log do Log4j. Isso significa que se eu quisesse alterar o que a fachada usava internamente, poderia fazê-lo sem impactar os usuários da minha fachada.
Como isso é feito? Bem, as interfaces fornecem os meios de inverter a direção da dependência. Eu dependo diretamente (na fachada) de uma interface que especifica meus níveis de log para os níveis de log Log4j, e algum módulo os fornece (dependendo diretamente da mesma interface.
Como o Log4j agora depende da interface, mas como provedor de serviços, em vez da fachada depender do log4j como provedor de serviços, a "prestação" de "serviços em nível de log" agora é invertida. Isso significa que no futuro, se eu quiser alterar a implementação, não terei que reescrever muito código, apenas o código que apresenta a prestação de serviços com meu novo provedor de nível de log.
Só para deixar claro mais uma vez, um cliente do Façade usando dependências diretas teria que
para fornecer o
log4j
nível de log quefacade
usa. Com a inversão de dependência, talvez seja necessário criar um segundo conjunto defacade
níveis de log, mas a importação do meu cliente seráe mais tarde posso conectar um jar diferente para fornecer a
log level interface
implementação, o que significa que o código do meu cliente não precisa mudar enquanto troco os provedores de nível de log de back-end.