Det h�r exemplet �r l�nat fr�n Booch: Object-oriented Design With Applications. Jag kommer inte att ge en detaljerad l�sning. H�r �r det viktiga inte den f�rdiga l�sningen utan processen som tar oss dit.
Nej, s� h�r fungerar inte v�rmesystem (�tminstone inte i Sverige).
I detta exempel �r objektstrukturen statisk—vi skapar aldrig nya objekt.
Ett kontrollsystem f�r uppv�rmning av ett hus. Vi har f�ljande komponenter:
Anv�ndargr�nssnitt
H�r st�ller man in �nskad temperatur f�r varje rum. �ven annan interaktion implementeras h�r, till exempel metoder f�r att �vervaka och styra pannan.
Temperaturgivare
Varje rum har en temperaturgivare som ger oss rummets temperatur.
V�rmeledningsventil
Varje rum har en v�rmeledningsventil. Den kan �ppnas f�r att sl�ppa p� v�rme.
Timer
En timer som hj�lper systemet h�lla reda p� tid.
Sensor
Vi vill kunna avg�ra om n�gon befinner sig i ett av rummen. Detta kan l�sas med antingen en infrar�d sensor eller en r�relsesensor i varje rum.
V�rmepanna
V�rmepannan producerar v�rme som distribueras till rummen via ett vattenburet system. N�r ett visst rum beh�ver v�rme ska v�rmepannan sl�s p� och ventilen till det rummet �ppnas.
Om ett rum anv�nds (det finns n�n d�r) ska temperaturen vara enligt �nskad temp (+/- 2F). Om rummet ej anv�nds accepteras en n�got l�gre temperatur (5 fahrenheit eller 2.8 C l�gre)
Systemet f�rs�ker att f�rutse m�nniskornas beteende genom att komma ih�g hur rummen har anv�nts tidigare. Om systemet tror att ett rum kommer att befolkas inom 30 minuter h�js temperaturen.
Systemet anv�nder enkel regel f�r att f�rutse hur olika rum kommer att anv�ndas: En databas lagrar det f�rv�ntade levnadsm�nstret under en vecka samt rumsanv�ndningen tv� veckor bak�t i tiden. Om det f�rv�ntade levnadsm�nstret bryts tv� veckor i rad uppdateras databasen med det nya beteendet.
Kontrollen av pannan �r komplex. En korrekt uppstart kr�ver att fl�kt, oljepump och t�ndning startas i viss ordningsf�ljd och med visst tidsintervall.
Om pannan stoppats m�ste det ta minst 5 minuter innan den startas igen, annars kan pannan skadas.
Pannan startas n�r minst ett rum beh�ver v�rme.
En naturlig l�sning �r att skapa klasser utg�ende fr�n figuren ovan.
Med denna l�sning f�r vi en komplex klass (Heat-flow regulator), medan �vriga blir mycket enkla.
Detta �r ett utm�rkt exempel p� d�lig OOP! L�sningen l�gger hela ansvaret p� en klass.
Det finns n�gra strategier f�r att hitta l�mpliga klasser. Man kan till exempel
Vi m�ste f�renkla problemet—klasstrukturen b�r ge ledning i hur man bryter ner uppgiften i naturliga delproblem.
Ge klassen Furnace tv� metoder:
void setRunning(boolean b); boolean getRunning();
Klassen Furnace
implementerar
N�r vi vill starta pannan skickar vi meddelandet setRunning(true)
till
pannan, och n�r den ska stanna skickar vi setRunning(false)
.
Denna ansats har n�gra f�rdelar:
Furnace
f�r ett enklare gr�nssnittOm pannan just st�ngts av och setRunning(true)
anropas, vad ska
Furnace
g�ra?
Ska getRunning()
returnera true
eller false
n�r du v�ntar?
true
, det �r mera konsistent med hur get
och set
f�rv�ntas fungerafalse
, annars ljuger vi(Fundera lite p� de h�r fr�gorna innan du l�ser vidare.)
Om Furnace
inte implementerar 5-minutersregeln m�ste alla objekt som
kommunicerar med Furnace
implementera regeln. Detta inneb�r i
praktiken att 5-minutersregeln blir en del av gr�nssnittet f�r
klassen Furnace
.
Kalla metoderna n�t annat, tex
void setHeatRequired(boolean b) boolean getHeatRequired();
Metoden getHeatRequired()
kan f�rst�s returnera true
�ven om pannan
st�r stilla. Ansvaret f�r att implementera 5-minutersregeln faller
nu p� klassen Furnace
.
Id�: inf�r en klass Rum. Varje rum h�ller reda p�
Vilket ansvar �terst�r f�r v�rmefl�desregulatorn?
Nu har den centrala v�rmefl�desregulatorn en enkel uppgift: Om minst ett rum beh�ver v�rme, tala om det f�r pannan.
Ett rum ska betraktas som "i bruk" om antingen
Det �r antagligen l�mpligt att inf�ra en abstraktion "n�rvaro" som t�cker b�da fallen
Notera att:
En viktig princip: En klass b�r inte arbeta med tv� komplexa, orelaterade problem.
Tre alternativ:
Jag skulle r�sta p� att koppla n�rvaro till rummen, dvs f�rsta eller andra alternativet.
Om n�rvarohanteringen �r komplex l�ggs den l�mpligtvis i en separat klass, dvs alternativ 2 eller 3.
Ett l�sningsf�rslag:
Ett system �r l�ttare att f�rst� om varje klass inte �r alltf�r komplicerad.
Ibland �r det l�mpligt att introducera abstraktioner (I detta fall: "n�rvaro").
Val av namn p� klasser och metoder kan vara viktigt.
I problemspecifikationen �r hantering av n�rvaro �verspecificerad. Man kan t�nka sig m�nga olika strategier f�r att f�rutse hur rum kommer att anv�ndas. F�r att avg�ra vilken strategi som fungerar b�st i praktiken kr�vs experiment.
Det �r inte s� lyckat att binda sig f�r en typ av panna; specifikationen borde �ven h�r ha sett annorlunda ut.