Ett abstraktionslager är ett sätt att dölja implementeringsdetaljerna för en viss funktionalitet. Det används för att kontrollera komplexiteten hos det designade systemet under nedbrytning , när systemet representeras som en hierarki av abstraktionsnivåer.
Exempel på programvarumodeller som använder abstraktionslager inkluderar sju-lagers OSI-modellen för kommunikationsprotokoll för datornätverk , OpenGL -grafik primitiva bibliotek, Unix byte stream I/O - modellen som används i MS DOS , Linux och många andra moderna operativsystem. .
I Unix-operativsystemet behandlas de flesta typer av I/O-operationer som strömmar av byte som läses från eller skrivs till en enhet . Denna byteströmmodell används för fil- , socket- och datorterminal- I/O för att tillhandahålla enhetsoberoende för I/O. För att läsa från och skriva till en enhet på applikationsnivå anropar programmet en enhetsöppningsfunktion, som kan motsvara en verklig enhet, såsom en terminal, eller en virtuell enhet , såsom en nätverksport eller en fil i ett filsystem . De fysiska egenskaperna hos enheten överförs till operativsystemet, vilket i sin tur ger ett abstrakt gränssnitt som gör att programmeraren kan läsa och skriva bytes till enheten. Operativsystemet utför sedan de åtgärder som krävs för att arbeta med en viss enhet.
De flesta grafikbibliotek , som OpenGL, tillhandahåller en abstrakt grafikmodell som gränssnitt. Biblioteket ansvarar för att översätta programkommandon till speciella enhetskommandon som behövs för att rita grafiska element och objekt. De plotterspecifika kommandona skiljer sig från monitorkommandona , men grafikbiblioteket döljer de enhetsspecifika implementeringsdetaljerna genom att tillhandahålla ett abstrakt gränssnitt som innehåller en uppsättning primitiver som vanligtvis används för att rita grafikobjekt.
I domänorienterad design kan en storskalig struktur (ämnesområde) använda mönstret för ansvarslager . Till exempel kan en domänmodell delas in i nivåer (uppifrån och ned) "Beslutsstöd", "Operations" och "Produktionskapacitet", där enheter på högre nivå förlitar sig på enheter på lägre nivå, men den lägre nivån inte gör det. beror på den övre [1] .
En berömd aforism av David Wheeler säger: Alla problem inom datavetenskap kan lösas på en annan nivå på ett omvägande sätt ; [2] detta är ofta felciterat med "omväg" ersatt med "abstraktion". En fortsättning från Kevlin Henney lyder "... förutom problem med en stor nivå av inriktning."
Ofta är abstraktionsnivåer organiserade i en hierarki av abstraktionsnivåer. OSI-nätverksmodellen innehåller sju abstraktionsnivåer. Varje lager i ISO OSI-modellen tar hänsyn till en separat del av kommunikationskraven, vilket minskar komplexiteten i de associerade tekniska besluten.
Idealt sett skyddar abstraktionen helt det övre lagret från implementeringsdetaljerna i det nedre lagret. Ändå är det i mer eller mindre komplexa fall nästan omöjligt att uppnå idealet, som Joel Spolsky uttryckte i form av lagen om läckande abstraktioner[3] [4] :
Alla icke-triviala abstraktioner är fulla av hål.
När det gäller datorarkitektur representeras ett system ofta som en modell av fem abstraktionsnivåer: datorhårdvara (se hårdvaraabstraktionslager ), firmware , assemblerspråk , operativsystemkärna och applikationer . [5]