Dela via


Abstraktioner (abstrakta typer och gränssnitt)

Kommentar

Det här innehållet skrivs om med behörighet från Pearson Education, Inc. från Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Den utgåvan publicerades 2008, och boken har sedan dess reviderats helt i den tredje utgåvan. En del av informationen på den här sidan kan vara inaktuell.

En abstraktion är en typ som beskriver ett kontrakt men som inte ger en fullständig implementering av kontraktet. Abstraktioner implementeras vanligtvis som abstrakta klasser eller gränssnitt, och de levereras med en väldefinierad uppsättning referensdokumentation som beskriver den nödvändiga semantiken för de typer som implementerar kontraktet. Några av de viktigaste abstraktionerna i .NET Framework är Stream, IEnumerable<T>och Object.

Du kan utöka ramverk genom att implementera en konkret typ som stöder kontraktet för en abstraktion och använda den här konkreta typen med ramverks-API:er som använder (fungerar på) abstraktionen.

En meningsfull och användbar abstraktion som klarar tidstestet är mycket svår att utforma. Den största svårigheten är att få rätt uppsättning medlemmar, inte mer och inte färre. Om en abstraktion har för många medlemmar blir det svårt eller till och med omöjligt att implementera. Om den har för få medlemmar för den utlovade funktionen blir den värdelös i många intressanta scenarier.

För många abstraktioner i ett ramverk påverkar också ramverkets användbarhet negativt. Det är ofta ganska svårt att förstå en abstraktion utan att förstå hur den passar in i den större bilden av de konkreta implementeringarna och API:erna som arbetar med abstraktionen. Dessutom är namn på abstraktioner och deras medlemmar nödvändigtvis abstrakta, vilket ofta gör dem kryptiska och oåtkomliga utan att först förstå det bredare sammanhanget för deras användning.

Abstraktioner ger dock extremt kraftfull utökningsbarhet som de andra utökningsmekanismerna inte ofta kan matcha. De är kärnan i många arkitekturmönster, till exempel plugin-program, inversion av kontroll (IoC), pipelines och så vidare. De är också mycket viktiga för att kunna testa ramverk. Bra abstraktioner gör det möjligt att stub ut tunga beroenden för enhetstestning. Sammanfattningsvis ansvarar abstraktioner för den eftertraktade rikedomen i de moderna objektorienterade ramverken.

❌ Tillhandahåll INTE abstraktioner om de inte testas genom att utveckla flera konkreta implementeringar och API:er som förbrukar abstraktionerna.

✔️ Välj noga mellan en abstrakt klass och ett gränssnitt när du utformar en abstraktion.

✔️ ÖVERVÄG att tillhandahålla referenstester för konkreta implementeringar av abstraktioner. Sådana tester bör göra det möjligt för användare att testa om deras implementeringar implementerar kontraktet korrekt.

Portioner © 2005, 2009 Microsoft Corporation. Med ensamrätt.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, publicerad 22 okt 2008 av Addison-Wesley Professional som en del av Microsoft Windows Development Series.

Se även