Compartilhar via


Abstrações (tipos abstratos e interfaces)

Observação

Esse conteúdo é reimpresso por permissão da Pearson Education, Inc. das Diretrizes de Design da Estrutura: Convenções, Idiomas e Padrões para Bibliotecas .NET Reutilizáveis, 2ª Edição. Essa edição foi publicada em 2008, e desde então o livro foi totalmente revisado na terceira edição. Algumas das informações nesta página podem estar desatualizadas.

Uma abstração é um tipo que descreve um contrato, mas não fornece uma implementação completa do contrato. As abstrações geralmente são implementadas como classes abstratas ou interfaces e vêm com um conjunto bem definido de documentação de referência que descreve a semântica necessária dos tipos que implementam o contrato. Algumas das abstrações mais importantes no .NET Framework incluem Stream, IEnumerable<T>e Object.

Você pode estender frameworks implementando um tipo concreto que dá suporte ao contrato de uma abstração e usando esse tipo concreto com APIs do framework que operam sobre a abstração.

Uma abstração significativa e útil que é capaz de suportar o teste do tempo é muito difícil de projetar. A principal dificuldade é obter o conjunto certo de membros, não mais nem menos. Se uma abstração tiver muitos membros, torna-se difícil ou até mesmo impossível de implementar. Se ele tiver poucos membros para a funcionalidade prometida, ele se tornará inútil em muitos cenários interessantes.

Muitas abstrações em uma estrutura também afetam negativamente a usabilidade da estrutura. Geralmente, é muito difícil entender uma abstração sem entender como ela se encaixa no quadro maior das implementações concretas e das APIs que operam na abstração. Além disso, nomes de abstrações e seus membros são necessariamente abstratos, o que muitas vezes os torna enigmáticos e inacessível sem primeiro entender o contexto mais amplo de seu uso.

No entanto, as abstrações fornecem extensibilidade extremamente poderosa que os outros mecanismos de extensibilidade geralmente não podem corresponder. Eles estão no centro de muitos padrões de arquitetura, como plug-ins, inversão de controle (IoC), pipelines e assim por diante. Eles também são extremamente importantes para testar as estruturas. Boas abstrações possibilitam a eliminação de dependências pesadas para fins de teste de unidade. Em resumo, as abstrações são responsáveis pela riqueza procurada das estruturas modernas orientadas a objetos.

❌ NÃO forneça abstrações, a menos que sejam testadas desenvolvendo várias implementações concretas e APIs consumindo as abstrações.

✔️ ESCOLHA cuidadosamente entre uma classe abstrata e uma interface ao projetar uma abstração.

✔️ CONSIDERE fornecer testes de referência para implementações concretas de abstrações. Esses testes devem permitir que os usuários testem se suas implementações implementam corretamente o contrato.

Partes © 2005, 2009 Microsoft Corporation. Todos os direitos reservados.

Reimpresso por permissão da Pearson Education, Inc. de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition de Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 pela Addison-Wesley Professional como parte da série Microsoft Windows Development Series.

Consulte também