Prova ”ren” OO!
- ons 29 apr, 2009 kl 17:09
- 5 kommentarer
- Java
Jag är inte mycket för ”renhet” i ordets religiösa mening när det gäller programmering. Jag ser inga fel i att spräcka paradigm, eller att ta genvägar, eller att rent av fulhacka om det krävs.
Men det kan vara väldigt klargörande ibland att tillämpa ett programmeringsparadigm strikt. Begränsningar föder innovation och klarar tanken. Så är det till exempel välgörande att tänka helt i REST-banor när man gör webbapplikationer. Eller att tänka ”allt är en fil” när man skriver operativsystem.
I ett tankemässigt snårigt problem jag nyligen sattes att lösa blev det klargörande att tillämpa en väldigt strikt form av OO. En intressant och effektiv arkitektur uppstod.
Dessa regler följde jag:
Metoder var antingen inspektioner eller anrop. Antingen getters, och då alltså rena getters, utan parametrar:
public String getName()
Eller så var de rena anrop, alltså metoder utan returtyp:
public void doStuff( String foo, int baz)
Detta fick till följd att en lätthanterlig och logisk objektmodell uppstod nästan av sig själv. Vill man ändra tillstånd i applikatiionen måste tillståndet bo inuti ett objekt, och det enda sättet att titta på tillståndet är att använda de rena accessormetoderna. Antingen GET eller POST alltså, om man talar HTTP.
Jag funderade över att komplettera med denna regel, (vilket jag alltså inte gjorde): Anropsmetoder får bara ta en enda parameter. Det hade fått till följd att jag tvingats modellera meddelandena mellan objekten lite tydligare.
Den andra regeln var inspirerad av rent funktionell programmering: Statiska metoder är rena funktioner och får inte anropa något annat än de objekt som kommer in i metoden. Jag tillät mig att titta på andra objekt, men inte anropa.
Resultatet blev en ren och lättförståelig modell, lätt att utöka, lätt att programmera i, trots att problemet var ganska hårigt från början.
”There are no hard problems, just hard solutions” -Gerald M. Weinberg
En annan ”ren” regel är att inte använda mer än en punkt per rad.
Bra, Fredrik
Att ”inte använda else” är en annan ren-regel som påverkat hur jag skriver kod.
Jag gillar dina ‘regler’ Fredrik. Du formulerade en del av mina magkänslor kan man nog säga… Jag skriver inte heller många punkter på samma rad och ‘else’ ger mig alltid en lite olustig känsla. Men jag har aldrig riktigt tänkt så konkret på det förrän nu!
En annan bra regel som jag skulle vilja experiementera med att ha som rättesnöre i något framtida projekt är Demeters lag. Nån som har testat?
Undrar om det går att kontrollera Demeters lag programmatiskt med t.ex. FindBugs eller liknande…