Pergunta

Eu estou tentando convencer um colega que uma função deve ter uma interface como um parâmetro, e não o próprio objeto. Eu acho que objetos pequenos podem ficar bem de atravessar, mas para grandes que eu iria dar-lhes uma interface e apenas passar o i / f acabou, não a coisa toda.

Note que não só vai ser uma dessas classes grandes - o i / f nunca vai ser usado para um objeto diferente. Este é apenas para esconder a implementação de um objeto.

Você concorda que separa uma grande classe em uma interface (s) é uma boa prática?
Há alguma desvantagem para fazer isso?

Exemplo:

public interface class IVeryLargeClass
{
    void DoSomething();
    ...
};

public ref class VeryLargeClass : public IVeryLargeClass
{
public:
    virtual void DoSomething() { ... }
    ...
};

public ref class AnotherClass
{
public:
    AnotherClass(VeryLargeClass^ vlc)  { vlc->DoSomething(); }
 // OR
    AnotherClass(IVeryLargeClass^ vlc) { vlc->DoSomething(); }
};
Foi útil?

Solução

Um dos primeiros princípios que aprender no desenvolvimento OO:

Programa a uma interface, não uma implementação.

Você indica que "não só vai ser uma dessas classes grandes - o i / f nunca vai ser usado para um objeto diferente". Isso pode ser verdade no seu caso, mas eu desejo que eu tive um níquel para cada vez que uma tal declaração acabou por ser errado.

Além de considerar se pode haver múltiplas implementações da sua interface, você também deve considerar se suas exportações objeto concreto (ou exportação poder) métodos adicionais que não compartilham uma afinidade lógica com as operações declarado na interface. Em tal caso, um, você poderia simplesmente declarar as operações adicionais em um ou mais interfaces. Um cliente, em seguida, só precisa de par com a interface que as exportações das operações em que está interessado.

Em termos simples, interfaces fornecem um meio de controlar o acoplamento entre clientes e fornecedores.

Outras dicas

O Dependência Princípio Inversão pode ser resumido como: É melhor depender de abstrações que concreções.

É quase sempre melhor para passar uma interface que é para passar uma classe concreta.

Dito isto, alta coesividade contra os tipos internos é ok dentro de um módulo particular, mas isso é muito subjetivo a respeito de quando e como você deve passar objetos concretos.

Eu prefiro evitar criar e interagir em prol da criação de uma interface. Se você pode usar essa interface em mais de um lugar, então você tem um vencedor - ou se esta é uma função pública e classe e você quer especificamente para simplificar

.

Se você passar uma implementação, você meio que um frouxo das vantagens do uso de interfaces, o que significa que separa a lógica da implementação real.

A interface de um módulo de software A é deliberadamente mantido separado do implementação desse módulo. o Este último contém o código real do procedimentos e métodos descritos em a interface, bem como outras variáveis ??"privadas", procedimentos, etc .. Qualquer outro módulo de software B (que pode ser referido como um cliente para A) que interage com um é forçado a fazê-lo somente através da interface. 1 vantagem prática deste arranjo é que a substituição do Implementação de um por outro que atenda as mesmas especificações de a interface não deve causar B para fail-contanto que seu uso da cumpre A com as especificações do Interface (ver também Liskov princípio da substituição).

http://en.wikipedia.org/wiki/Interface_(computer_science)

A outra questão é a sua classe muito grande em si. Isto pode não ser dentro do escopo do que você está fazendo, mas uma classe muito grande implica que ele poderia estar fazendo muito em primeiro lugar. você pode refatorar-lo em classess menor, onde as informações necessárias dentro da função que você está chamando é encapsulado em sua própria classe menor? Se você criar uma interface contra essa classe que você pode achar que é muito mais re-utilizáveis ??que contra a classe muito grande você tem atualmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top