Abstrações (Tipos Abstratos e Interfaces)
Nota
Este conteúdo é reimpresso com permissão da Pearson Education, Inc., a partir de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Essa edição foi publicada em 2008 e, desde então, o livro foi totalmente revisto 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 são geralmente implementadas como classes abstratas ou interfaces, e vêm com um conjunto bem definido de documentação de referência descrevendo 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 suporta o contrato de uma abstração e usando esse tipo concreto com APIs de framework consumindo (operando em) a abstração.
Uma abstração significativa e útil que seja capaz de resistir ao teste do tempo é muito difícil de projetar. A principal dificuldade é conseguir o conjunto certo de membros, nem mais nem menos. Se uma abstração tem muitos membros, torna-se difícil ou mesmo impossível de implementar. Se tiver poucos membros para a funcionalidade prometida, torna-se inútil em muitos cenários interessantes.
Muitas abstrações em uma estrutura também afetam negativamente a usabilidade da estrutura. Muitas vezes é muito difícil entender uma abstração sem entender como ela se encaixa no quadro mais amplo 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íveis sem primeiro entender o contexto mais amplo de seu uso.
No entanto, as abstrações fornecem uma extensibilidade extremamente poderosa que os outros mecanismos de extensibilidade muitas vezes não podem igualar. Eles estão no centro de muitos padrões arquitetônicos, como plug-ins, inversão de controle (IoC), pipelines e assim por diante. Eles também são extremamente importantes para a testabilidade de frameworks. Boas abstrações tornam possível eliminar dependências pesadas para fins de teste de unidade. Em resumo, as abstrações são responsáveis pela almejada riqueza das modernas estruturas orientadas a objetos.
❌ NÃO forneça abstrações a menos que elas 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 utilizadores testem se as suas implementações executam corretamente o contrato.
© Partes 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc., de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da Microsoft Windows Development Series.