AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78608230
Accepted
CrystalSapphire
CrystalSapphire
Asked: 2024-06-11 22:35:04 +0800 CST2024-06-11 22:35:04 +0800 CST 2024-06-11 22:35:04 +0800 CST

A composição viola o D no SOLID?

  • 772

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;
    }
}
java
  • 1 1 respostas
  • 54 Views

1 respostas

  • Voted
  1. Best Answer
    Edwin Buck
    2024-06-11T22:57:16+08:002024-06-11T22:57:16+08:00

    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.

    Inversão de Dependência

    Só para deixar claro mais uma vez, um cliente do Façade usando dependências diretas teria que

    import facade;
    import log4j;
    

    para fornecer o log4jnível de log que facadeusa. Com a inversão de dependência, talvez seja necessário criar um segundo conjunto de facadeníveis de log, mas a importação do meu cliente será

    import facade;
    

    e mais tarde posso conectar um jar diferente para fornecer a log level interfaceimplementaçã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.

    • 4

relate perguntas

  • Lock Condition.notify está lançando java.lang.IllegalMonitorStateException

  • Resposta de microsserviço Muitos para Um não aparece no carteiro

  • Validação personalizada do SpringBoot Bean

  • Os soquetes Java são FIFO?

  • Por que não é possível / desencorajado definir um lado do servidor de tempo limite de solicitação?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve