Teknologi

I Bouvet er vi flere hundre teknologer som brenner for å programmere og utforme gode, digitale løsninger. I denne bloggen utforsker vi teknologien og deler det vi finner med dere.

repository active record

Patternskolen del 8 – Active Record vs Repository

Forrige gang så vi på Decorator-patternet i forhold til arv, slik vi kjenner det fra objektorientering.

Denne gangen tar vi for oss to forskjellige patterns for håndtering av dataaksess, nemlig Active Record (kjent bl.a. fra Ruby on Rails) og Repository (kjent fra bl.a. boka Domain Driven Design av Eric Evans). For å illustrere implementasjonene tar jeg utgangspunkt i en veldig enkel domeneklasse for Person:

Person

Active Record pattern

Kort fortalt: Active Record pakker inn en rad fra en databasetabell, innkapsler dataaksessen og legger til domenelogikk på dataene.

Eksempelimplementasjon i C#:

Her ligger metoder for dataaksess på domeneklassen. Metoder for å lese ett eller flere objekter vil vanligvis være statiske, mens metoder for lagring og sletting opererer på den gitte instansen.

Repository pattern

Et repository ligger mellom domenet og datalaget. Det tilbyr et collection-lignende grensesnitt mot en database. Et repository er implementert separat fra domenet og slik oppnår man separasjon av domenelogikk og dataaksess. Ofte er grensesnittet til et repository definert i et interface.

Eksempelimplementasjon i C#:

Fordeler og ulemper

En fordel med Active Record er at det blir veldig lite ekstra kode for å gjøre dataaksess. Alternativt må denne koden flyttes ut i en egen Repository-klasse og vi må trekke ut et interface for den i tillegg.

En annen fordel som ofte fremheves med Active Record, er at all koden tilhørende et objekt blir samlet i samme klasse. Både domenelogikk og dataaksess ligger på samme sted. Det gjør det enkelt å konsumere koden og å endre den. Dette medfører innkapsling, som vi har lært er en bra ting i objektorientering. På den andre siden bryter Active Record med flere andre prinsipper: En klasse skal bare gjøre én ting (single responsibility principle) og kode som ikke hører sammen bør adskilles (separation of concerns). Vi må altså gjøre endringer i domeneklasser hvis vi endrer koden for databaseaksess. En kan derfor argumentere for at Active Record fører til god objects; det vil si at domeneklassene har for mange ansvarsområder eller gjør for mye. Repository, derimot, følger alle disse prinsippene.

Den definitivt største ulempen med Active Record er at den gjør enhetstesting vanskelig. Repository, kombinert med dependency injection, gjør det lett å lage en mock for repositoryets interface og slik teste uten å gå mot en faktisk database. For Active Record er det vanskelig å mocke vekk dataaksesslogikken som ligger i domeneobjektet, og særlig når enkelte av metodene er statiske. Dette lar seg riktignok løse ved f.eks. å bruke Static gateway, som vi har sett på tidligere.

Med mindre jeg bruker et rammeverk som setter føringer for dataaksess, vil jeg personlig alltid velge Repository. Fordelene er så mange at de overveier eventuelle ulemper i alt annet enn de mest trivielle systemer.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Magic Mirror – version 1

Introduction A while back I discovered the exciting world of “magic mirrors”. I don’t remember how or where it caught my attention, but..

DevOpsDays Oslo 2016

5.-6. september hadde eg gleden av å delta på den første norske DevOpsDays i Oslo. Her er en oppsummering av høydepunktene..

Bouvet at JavaZone 2016

This year JavaZone celebrated it’s 15th year with with 3000 attendees and over 170 sessions. As one of Norway’s premier Java..

IT years are like dogs years

One of the characteristics of the IT industry is that time works differently for us. This is challenging and fun,..

The Future of SharePoint

Den 4. mai holdt Microsoft en virtuell event om fremtiden til SharePoint, jeg fikk heldigvis anledning til å delta de..

SharePoint 2016 er på vei!

Som lovet var Microsoft ferdig med utviklingen av SharePoint Server 2016 (RTM – release to manufacturing) rett før påske, og..

En skybasert integrasjonsplattform

SAP HANA Cloud Integration SAP HANA Cloud Integration (HCI) er en skybasert integrasjonsplattform. Denne kan benyttes i stedet for SAP..

IoT Juleverksted

Tradisjonen tro var det i starten av desember tid for det årlige juleverkstedet hos Bouvet i Sandvika. Dette var tredje..

Bouvet Battle Royale – Rematch

Vår årlige fagdag ble i fjor kjørt som showdown mellom våre avdelinger som jobber med Java- og Microsoft-teknologi. Uten å..

Key takeaways fra JavaOne 2015!

JavaOne er verdens største Java-konferanse og arrangeres hvert høst i San Francisco. Her kan du oppleve foredrag fra noen av de..

Teknologi

I Bouvet er vi flere hundre teknologer som brenner for å programmere og utforme gode, digitale løsninger. I denne bloggen utforsker vi teknologien og deler det vi finner med dere.