Inversion of Control handlar inte om testbarhet

Varför skall man använda Inversion of Control i sin kod? Precis som Jeffery Palermo skriver på sin blogg Inversion of Control is NOT about testability så handlar Inversion of Control inte om testbarhet utan att man vill inte skapa kopplingar mellan konkreta klasser utan mellan en klass och ett kontrakt(interface) för en annan.

Vinsterna med att använda Inversion of Control är många och testbarheten är en av dessa men bör inte vara det ända syftet.

En av den största anledningen till att jag gillar Inversion of Control är att man kan tillämpa en av Lean Software Developments sju principer Decide as late as possible. Genom att bara koppla sig till ett kontrakt så behöver man inte bestämma sig hur man skall implementera kontraktet förän det är absolut nödvändigt. Man kan till och med ändra på implementationen i efterhand utan att påverka kopplingen mellan klasserna. Jag använder detta ofta genom att göra en mycket enkel och snabb konkret implementation av ett kontrakt för att senare gå tillbaka och förbättra implementationen när det behövs.

Ett av mina favoritexempel på detta tillvägagångssätt var när vi var i processen att bygga en WindowsForms klient som skulle kommunicera med en applikationsserver. Vi hade delar av applikationsservern på plats men inte hela infrastrukturen för att kommunicera över nätverket. För att utvecklaren av WindowsForms applikationen inte skulle behöva vänta på att infrastrukturen var på plats så definerade vi kontrakten som fanns mellan klienten och servern. Servern implementerade kontraktet och klienten använde sig direkt av serverkoden under större delen av utvecklingen. När sedan infrastrukturen för kommunikationen på servern vara på plats så implementerade vi proxy klasser med samma kontrakt men som använde sig av kommunikationsinfrastrukturen. Klient koden behövde inte ändras utan endast en inställning som talade om vilket konkret implementation av kontraktet som skulle användas och vips så blev klienten en tunn klient som kommunicerade med WebServices istället för att vara direktkopplad till databas m.m. på klientsidan.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s