Vad är principen om ett enda ansvar?
När det gäller datorprogrammering och design är principen om ett enda ansvar ett begrepp som stöder uppfattningen att varje klass i ett program endast ska utföra en funktion i den större applikationen. Denna idé främjar delvis några av idealen för objektorienterad programmering, till exempel inkapsling, eftersom en hel klass kommer att fokuseras på att utföra ett enda ansvar och kommer att ha lite beroende av utanför klasser. Samtidigt är det något antitetiskt för vissa av begreppen för tidig objektorienterad programmering, eftersom funktionen för ett enda objekt kopplas bort från de data som objektet hanterar, vilket innebär att många objekt i kombination kanske måste konstrueras för att upprätthålla några centrala data. Den enskilda ansvarsprincipen är grunden för en typ av designmodell som kallas ansvarsstyrd design.
Ett exempel på principen om ett enda ansvar kan ha formen av en traditionell telefonapparat. Vissa designprinciper skulle se telefonen som ett enda objekt som hanterar både inmatning från telefonlinjen och överföring av utgången från högtalaren. Enligt en enda ansvarsmodell, där ett enda objekt bara ska ha ett enda ansvar, då skulle handenheten bestå av flera separata objekt som var och en utförde en enda funktion, såsom att bara ta emot inmatning från telefonlinjen, eller bara mata ut data genom öronstycket.
En av fördelarna med att använda principen om ett enda ansvar är en mycket hög abstraktionsnivå och modularitet. I handenhetsexemplet kan antingen ingången från telefonlinjen eller hur signalen matas ut till användaren ändras utan att påverka de närliggande klasserna så länge de följer samma kontrakt för gränssnitt. Dessutom kan återanvändningsförmågan för vissa komponenter vara mycket hög, eftersom varje klass är helt inkapslad och förlitar sig väldigt lite, om inte alls, på omgivande objekt, i stället fokuserar på det enda ansvaret.
En komplikation som principen om enskilt ansvar kan skapa är en stor mängd klasser och objekt som alla använder samma data. Detta kan innebära en stor mängd overhead och en komplicerad designprocess. Det kan också göra felsökning av ett stort program svårt, eftersom en enda del av programmet kan bestå av tusentals små klassfiler.
När principen om ett enda ansvar tillämpas genom en ansvarsdriven design, separeras data och metoder som används för att manipulera uppgifterna för designändamål. Även om detta leder till en viss frihet, kapsling och modularitet i design, kan det också generera ett antal mellanliggande mönster och mönster som måste användas för att underlätta ett antal klasser som alla försöker interagera med data på en gång. Å andra sidan, om ett objekts data och metoderna som används för att manipulera det hela är bundna i ett enda objekt med flera ansvarsområden, kan koden bli svårare att ändra när system skalar, ändras eller blir mer komplex.