2007-01-13

Facade

Jag förstår att Facade är ett design pattern som ska användas i en viss situation: man vill förenkla ett tillkrånglat API, och göra den underliggande funktionaliteten tillgänglig för programmerare som inte är intresserade av att sätta sig in i alla detaljer, utan bara vill utföra de vanligaste funktionerna på ett så enkelt sätt som möjligt. Men det handlar bara om vettig API-design, och man måste vända på det också. API:er har en förmåga att hålla sig på en viss abstraktionsnivå. Antingen är det väldigt detaljerat och krångligt att lära sig, eller så är det enkelt att lära sig men inte tillräckligt kraftfullt för att man ska kunna göra precis det man vill.

Vem minns inte de bevingade orden från vår gamla kursare Chainsaw (obs! "Chainsaw" heter egentligen något annat), då han konfronterades med uttalandet "Det är ett dåligt API"? "Det går att skriva en wrapper", sa han. Jo, det gör det alltid om det finns tillräckligt med funktionalitet att wrappa. Värre är det om det är så förenklat från början att man inte kan skriva en wrapper. Utanför open source-världen, där jag är uppväxt, har man inte tillgång till källkod, utan får nöja sig med det någon ouppnåelig auktoritet har bestämt sig för att exponera.

Om man designar ett API som ska användas av andra än en själv, så bör man för det första göra det så generellt att det inte begränsar användarens möjligheter. Sen bör man wrappa funktionaliteten i funktioner som gör de grundläggande mekanismerna enkla att använda. Till exempel så borde det i libjpeg finnas en API-funktion för att ladda och avkoda en jpeg-fil, för det är antagligen det de flesta användare vill använda det till. Man vill kunna svara "Det behövs inte" när någon smyger upp bakom en och väser "Det går att skriva en wrapper".

Inga kommentarer: