Condividi tramite


Astrazioni (interfacce e tipi astratti)

Nota

Questo contenuto viene ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idiomsn and Patterns for Reusable .NET Libraries, 2nd Edition. Tale edizione è stata pubblicata nel 2008 e il libro è stato completamente rivisto nella terza edizione. Alcune informazioni in questa pagina potrebbero non essere aggiornate.

Un'astrazione è un tipo che descrive un contratto, ma non fornisce un'implementazione completa del contratto. Le astrazioni vengono in genere implementate come classi o interfacce astratte e vengono fornite con un set ben definito di documentazione di riferimento che descrive la semantica necessaria dei tipi che implementano il contratto. Alcune delle astrazioni più importanti in .NET Framework includono Stream, IEnumerable<T> e Object.

È possibile estendere i framework implementando un tipo concreto che supporta il contratto di un'astrazione e usando questo tipo concreto con le API del framework che utilizzano l'astrazione (ovvero operano su di essa).

Un'astrazione significativa e utile che è in grado di resistere nel tempo è molto difficile da progettare. La difficoltà principale è ottenere il set giusto di membri, non uno di più e non uno di meno. Se un'astrazione ha troppi membri, diventa difficile o persino impossibile implementare. Se ha troppi pochi membri per la funzionalità promessa, diventa inutile in molti scenari altrimenti interessanti.

Troppe astrazioni in un framework influiscono negativamente anche sull'usabilità del framework stesso. Spesso è piuttosto difficile comprendere un'astrazione senza comprendere anche come questa si inserisce nell'immagine più ampia delle implementazioni concrete e delle API che operano su di essa. Inoltre, i nomi delle astrazioni e dei loro membri sono necessariamente astratti, cosa che spesso li rende criptici e poco approcciabili senza prima comprendere il contesto più ampio del loro utilizzo.

Tuttavia, le astrazioni offrono un'estendibilità estremamente potente che gli altri meccanismi di estendibilità non possono spesso fornire. Sono alla base di molti modelli architetturali, ad esempio plug-in, inversione del controllo (IoC), pipeline e così via. Sono anche estremamente importanti per la verificabilità dei framework. Le astrazioni valide consentono di eseguire stub per le dipendenze pesanti allo scopo di testing unità. In sintesi, le astrazioni sono responsabili della ricchezza ricercata dei framework moderni orientati agli oggetti.

❌ NON fornire astrazioni a meno che non vengano testate sviluppando diverse implementazioni e API concrete che le utilizzano.

✔️ SCEGLIERE attentamente tra una classe astratta e un'interfaccia durante la progettazione di un'astrazione.

✔️ VALUTARE la possibilità di fornire test di riferimento per implementazioni concrete di astrazioni. Tali test devono consentire agli utenti di verificare se le implementazioni gestiscono correttamente il contratto.

Parti protette da copyright © 2005, 2009 Microsoft Corporation. Tutti i diritti sono riservati.

Ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2a edizione di Krzysztof Cwalina and Brad Abrams, pubblicato il 22 ottobre 2008 da Addison-Wesley Professional nella collana Microsoft Windows Development Series.

Vedi anche