En introduksjon til design patterns

Sat 22 May 2010

Patterns (eller mønster på norsk) er

Motivasjon

Patterns handler om å lære av andre sine feil og erfaringer. Vi vil at applikasjonen vår skal være fleksibel sånn at vi kan tilpasse den fremtidige krav / spesifikasjoner som måtte komme. Ofte ønsker vi også å kunne gjenbruke så mye av koden vår som mulig for å spare kostnader, og / eller, lette utviklingsarbeidet.

Definisjon

Et mønster er en generell, gjenbrukbar løsning på vanlige problemer en møter på under programvareutvikling. Et mønster er ingen ferdig lønsning, mer en beskrivelse på hvordan en kan løse et problem.

Vi kan definere et mønster slik:

"Et mønster er en løsning på et problem i en kontekst"

Kontekst: Er situasjonen hvor mønsterer kan anvendes. Dette er situasjoner som ofte oppstår i programvareutvikling.

Problemet: Er det du skal løse, samt eventuelle begrensinger som fremgår av konteksten.

Løsningen: Er den vi er ute etter. Et generellt design som alle kan bruke for å løse et problem i en gitt kontekst.

Kataloger

Ved å definere mønstre på denne måten kan vi ordne / katalogisere de slik at de blir lettere å finne frem til senere. Det finnes mange samlinger / kataloger med mønstre hvor man bruker denne type definering for å gjøre samlingen anvendelig i praksis. Det finnes kataloger for generelle mønstre, men også for domenespesifikke mønstre som EJB og andre Enterprise type teknologier.design-patterns-book-cover

Den mest kjente mønsterkatalogen er "GoF", som inneholder 23 grunnleggende og fundamentale mønstre. Denne boken kom ut første gang i 1994, men har jevnt og trutt blitt trykket og gitt ut på ny opp igjennom årene og har blitt solgt i mer en 500,000 eksemplarer.

I en katalog kan et mønster føres på denne måten:

Mønsterets navn: En finfin måte å huske mønstret på.

Klassifisering: Hvilken type mønster er dette?

Intensjon: Mønsterets definisjon.

Motivasjon: Et konkret scenario som beskriver et problem og hvordan mønsteret kan brukes for å løse problemet.

Applicability: Beskriver situasjoner hvor mønsteret kan brukes.

Struktur: Digram som viser relasjoner mellom klassene som deltar i mønstret.

Deltagere: Klasser og objekter i designet. Her beskrives også ansvar og rollefordelinger.

Collaborations: Beskriver hvordan deltagerene jobber sammen i mønstret.

Konsekvenser: Beskriver effekter en får ved å bruke mønstret. Konsekvenser kan være negative eller positive.

Implementasjon: Teknikker for å implementere mønstret, og potensielle problemer å se etter.

Eksempel kode: Kodesnutter som gir kan hjelpe deg å implementere mønsteret.

Kjente bruksområder: Eksempler på hvor mønsteret er brukt i reelle systemer.

Relaterte mønster: Beskriver relasjoner mellom dette mønsteret og andre mønster.

Kategorisering

De fleste kataloger kategoriserer mønsterene i noen få kategorier. De mest vanlige kategoriene er hentet fra "GoF" og deler mønsterene inn i tre kategorier basert på mønsterets egenskaper.

Creational: Involverer instansiering av objekter og måter å løskoble klienter fra objekter som instansieres.

Behavioral: Handler om hvordan klasser og objekter samhandler, og hvordan de fordeler ansvar.

Structural: Setter sammen klasser og objekter til mer komplekse strukturer.

En kan også dele inn mønstre i to kategorier basert på om de involverer klasser eller objekter.

Når skal vi bruke mønster?

Det å vite når en skal bruke et mønster, og e.v.t hvilket er noe som krever erfaring og kunnskap for å bestemme. Ofte vil en enklere løsning fungere bra nok, men ikke alltid.

mvcapp-archa4

Design: Om du ikke kan haugevis med mønstre på rams kan du sette deg ned med en katalog og kikke igjennom mønstre som kanskje kan hjelpe deg på vei. Det kan være lurt å ha en viss ide om hvilken begrensinger du har, samt om hele, eller deler av, applikasjonen din har spesielle behov for å være fleksibel.

Refaktorering: Om du er i en refaktoreringsprosess er du ute etter å omorganisere koden din. Du vil ofte prøve å få en bedre struktur uten å endre hva koden faktisk gjør. Dette kan ofte være et passende tidspunkt for å se om det finnes noen mønstere som kan gjøre koden din mer strukturert.

Det er ikke alltid man trenger å bruke et spesifikt mønster. Kan du komme i mål uten så vil det ofte være å foretrekke. Et mønster vil ofte innebære flere klasser, flere lag og generelt mer kompleksitet i applikasjonen din. Husk at et mønster er et verktøy og ikke en regel.

Noen vanlige patterns

  • Observer pattern
  • Decorator pattern
  • Factory pattern
  • Singleton pattern
  • Command pattern
  • Adapter / Facade pattern
  • Template method pattern
  • Iterator / Composite pattern
  • State pattern
  • Proxy pattern

Tagged as : diverse