Prinsippet om avhengighetsomvending

Et viktig utviklingsprinsipp er prinsippet om avhengighetsomvending [«Dependency inversion principle» (DIP) på engelsk] som gir dekobling av viktige programvarekomponenter, såkalte høynivåkomponenter.

I stedet for at disse skal konsumere mange små "arbeidskomponenter" (dvs. lavnivåkomponenter) direkte, for å fungere, velger man å heller gjøre seg avhengig av abstraksjoner. Dette gjelder begge typer komponenter, både lavnivå og høynivå. I praksis vil man da gjerne benytte grensesnitt.

DIP er det siste viktige designmønsteret i SOLID.

Prinsipp for grensesnittoppdeling

Et veldig fornuftig designmønster er prinsippet for grensesnittoppdeling [«Interface segregation principle» (ISP) på engelsk] som enkelt og greit sier at en klient/bruker ikke skal måtte være avhengig av grensesnitt som ikke brukes.

For å løse dette problemet forholder man seg til oppdelte spesialiserte grensesnitt så vedkommende ikke påvirkes når annen funksjonalitet skal defineres og utvikles.

ISP er det fjerde viktige designmønsteret i SOLID.

Liskovs substitusjonsprinsipp

Et prinsipp som kan minne om Åpen/lukket-prinsippet er Liskovs substitusjonsprinsipp [«Liskov substitution principle» (LSP) på engelsk], men dette prinsippet handler egentlig mer om hva instanser av underklasser skal kunne gjøre.

Helt konkret sier prinsippet at hvis klasse B arver fra klasse A, så skal instanser av B kunne erstatte instanser av A, uten at dette byr på problemer.

Et mye brukt eksempel:

Hvis en klasse for (geometrisk) kvadrat arver fra en klasse for rektangel må man forholde seg til bredde og lengde selv om alle sider i et kvadrat er like lange. Dette blir litt kleint fordi det er sidelengde som burde vært brukt.

Hvis bredde og lengde likevel brukes er det naturlig at begge settes til samme verdi, men da kan ikke en kvadratinstans lenger erstatte en rektangelinstans. Og dette bryter da med Liskovs substitusjonsprinsipp.

LSP er det tredje viktige designmønsteret i SOLID.

Ettansvars-prinsippet

Ettansvars-prinsippet [som er «Single responsibility principle» (SRP) på engelsk] setter visse krav til enhver modul, klasse, osv. som har ansvar for hvordan noe skal fungere:

  1. Når modulen, klassen, funksjonen osv. endres skal det bare være èn grunn til dette.
  2. Man har 100% ansvar for å få jobben gjort, derfor skal man "pakke inn" (dvs. enkapsulere) all funksjonalitet. Direkte hjelp fra utsiden skal ikke være nødvendig.

Hvis disse kravene innfris blir komponenten mer stabil / det blir sjeldnere endringer. I tillegg blir vanligvis vedlikeholdet enklere fordi den blir mer lettforståelig.

SRP er det første viktige designmønsteret i SOLID.

Åpen/lukket-prinsippet

Åpen/lukket-prinsippet [som er «Open/closed principle» (OCP) på engelsk] sier at ferdige moduler, klasser, funksjoner osv. bør være stengt for endringer, men åpen for utvidelser.

Forklaringen er enkel: Hvis en bestemt funksjonalitet er brukt mange ganger og den endres må man refaktorere all gammel kode som er avhengig av den, dette blir en (enorm) tidstyv. Man bør i stedet utvide med ekstra funksjonalitet.

OCP er det andre viktige designmønsteret i SOLID.

Kodemønstre

Innenfor programvareutvikling, også kalt systemutvikling, støter man ofte på kjente problemer som det allerede finnes vedtatte gode løsninger for. Dette er mønstre.

Hovedsaklig er det designmønstre og arkitekturmønstre man forholder seg til.

For designmønstre finnes det tre kategorier: 1) Mønstre for hvordan noe skal opprettes, 2) hvordan noe skal struktureres og 3) hvordan noe skal oppføre seg.

Lærer man seg GRASP og S O L I D er man godt i gang.