Abstrações (tipos e interfaces abstratos)
Observação
Este conteúdo é reimpresso com permissão da Pearson Education, Inc. 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 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 estruturas implementando um tipo concreto que dá suporte ao contrato de uma abstração e usando esse tipo concreto com APIs de estrutura consumindo (operando) a abstração.
É muito difícil projetar uma abstração significativa e útil que seja capaz de resistir ao teste do tempo. A principal dificuldade é obter o conjunto certo de membros, nem mais nem menos. Se uma abstração tiver muitos membros, será difícil ou até impossível 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. Por vezes, é muito difícil entender uma abstração sem entender como ela se encaixa no panorama geral das implementações concretas e das APIs que operam na abstração. Além disso, os nomes das abstrações e seus membros são necessariamente abstratos, o que muitas vezes os torna enigmáticos e inacessíveis sem antes entender o contexto mais amplo de seu uso.
No entanto, as abstrações fornecem uma extensibilidade extremamente poderosa que os outros mecanismos de extensibilidade geralmente podem não 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 a capacidade das 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 tão procurada riqueza 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 que consumam as abstrações.
✔️ ESCOLHA cuidadosamente entre uma classe abstrata e uma interface ao criar 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.
Portions © 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc. das Diretrizes de Design do Framework: convenções, linguagens e padrões para bibliotecas do .NET reutilizável, 2ª edição por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da série de desenvolvimento do Microsoft Windows.