Exempel: Kontrollsystem f�r uppv�rmning

Sven-Olof Nystr�m
OOP med Java v�ren -25
Informationsteknologi
Uppsala Universitet

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.

Kontrollsystemet i stort.

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.

Intelligens

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.

V�rmepannan

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.

Hur l�ser man detta?

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.

Hur hittar vi l�mpliga klasser?

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.

En andra ansats

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, n�gra komplikationer

Om 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?

(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.

En l�sning:

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.

Insikter...

V�rmesystem, forts

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.

N�rvaro

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

Var placera kod som hanterar n�rvaro?

Notera att:

En viktig princip: En klass b�r inte arbeta med tv� komplexa, orelaterade problem.

N�rvaro, l�sningsalternativ

Tre alternativ:

  1. Varje rum hanterar sin egen n�rvaro
  2. f�r varje rum finns ett n�rvaro-objekt som hanterar n�rvaron f�r detta objekt
  3. ett objekt "n�rvaro", gemensamt f�r alla rum

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.

V�rmesystem, klasser

Ett l�sningsf�rslag:

V�rmesystem, kommentar

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.