PRACTICUMOPGAVE 2

Gegeven is een simulatie van een postkantoor. De simulatie houdt balies (desks) bij waar bedienend personeel (servants) klanten (clients) helpen. Dit is hieronder aan de linkerkant te zien. Voor de desks en de clients zijn aparte kleuren gebruikt: desks zijn oranje gekleurd en clients groen. Zowel desk als client zijn met een rechthoek gepresenteerd waarin de naam terug te vinden is.

De simulatie verloopt in tijdstappen: elke tick betekent "een volgend moment". De simulatie doet een stap door op de button "Step" te klikken. De teller die de current tick aangeeft wordt dan met 1 verhoogd. De simulatie kan ook continu verlopen; dit wordt bewerkstelligd door op de button "Run" te klikken. De snelheid van de simulatie kan dan worden geregeld door midden van de schuifregelaar.

Na 6 stappen ziet de simulatie er uit zoals hieronder te zien is.

In de report area is nu te zien dat bij tick 1 elke desk een client van de wachtende rij clients heeft afgehaald en nu aan het bedienen is. De clients die geholpen worden zijn in de user interface geplaatst tussen de desk en de nog wachtende clients. Een client die geholpen wordt, wordt met de kleur geel aangegeven.

Gedurende de simulatie kunnen zowel nieuwe desks als clients worden toegevoegd. Het commando
    c david dirk
voegt aan de desk "dirk" een nieuwe client "david" toe. Het effect hiervan is hieronder te zien.

In de report area is hier ook nog te zien dat op tick 11 drie klanten afgehandeld zijn; meteen komt dan de volgende in de rij aan de beurt.

Er kunnen ook nieuwe desks worden toegevoegd. De syntax van zo'n commando is
    d <desk name> <serving time> <deviation interval of serving time>
Met het commando
    d boris 10 4
is initieel de desk met bediende "boris" toegevoegd. De gemiddelde bedieningstijd is 10 ticks en de maximale afwijzing daarvan is 2, naar boven of naar beneden. De simulatie kiest random een getal tussen 8 en 12 voor de desk. In het voorbeeld kwam dit klaarblijkelijk neer op 11 ticks voor de allereerste client.
 

Opdrachtomschrijving

In het gegeven programma moeten enkele aanpassngen worden gemaakt. Naast gewone baliemedewerkers (normal servants) zijn er ook nog luie baliemedewerkers (lazy servants). Zo'n luie medewerker stopt eens in de zoveel tijd met werken. Dat betekent dat de klant die bediend wordt nog wel geholpen wordt maar de rest van de rij moet wachten. Een balie met een luie medewerker wordt met het commando "l" (lazy desk) toegevoegd:
    l <desk name> <serving time> <deviation interval of serving time> <switchtime>
De extra waarde "switchtime" geeft het aantal ticks aan dat achter elkaar wel of niet gewerkt wordt. Een voorbeeld hiervan is
    l dumbo 5 2 14
De luie bediende "dumbo" wisselt elke 14 ticks tussen werken en niet werken. In de user interface wordt dat dan aangegeven met een horizontale streep aan de bovenkant van de rechthoek die de desk vertegenwoordigt. Wanneer een desk nonactief is, wordt deze met een donkerder variant van de originele kleur weergegeven.

Ook zijn er aangepaste clients. Naast de normale klant (normal clients) zijn er ook nog ongeduldige klanten (impatient clients) en onoplettende klanten (unattentive clients). Een ongeduldige klant wordt in de interface met een donkerder kleur en een schuine streep in de linkerbovenhoek aangegeven. Een onoplettende klant wordt getoond in de complementaire kleur van de normale klantenvariant.

Een onoplettende klant staat altijd achteraan een wachtrij: door de onoplettendheid weten andere klanten namelijk altijd voor te dringen. Een onoplettende klant wordt dus pas geholpen als alle andere klanten in de rij al geholpen zijn. Ongeduldige klanten daarentegen zijn constant aan het bepalen welke rij de minste klanten bevat. Een ongeduldige klant wisselt dan ook van rij wanneer een andere rij minder klanten voor hem/haar bevat. Het effect hiervan is hieronder te zien: let op hoe "aafje" van rij is gewisseld.

Wanneer een ongeduldige klant echter ziet dat een balie met een kortere rij inactief is doordat een luie bediende even niet bedient, zal de ongeduldige klant de wisseling naar die balie niet maken. Wanneer een baliemedewerker stopt met werken, zal de ongeduldige klant ook naar een andere rij overgaan.

Voeg een commando "i" toe dat een ongeduldige klant introduceert in een aangegeven rij, en een commando "u" dat een onoplettende klant introduceert in een aangegeven rij.
 

Modellering en ontwerp

Het gegeven programma houdt datastructuren bij zoals in het onderstaande UML-diagram te zien is.

Zowel Client (klant) als Servant (bediende) zijn Persons. Een Desk (balie) weet welke Servant daar aanwezig is; de Servant houdt de gemiddelde bedieningstijd (meanTime) en de lengte van het interval van mogelijke bedieningstijden (deviationTime) bij, evenals het tijdstip waarop de bediening van de huidige klant afgelopen is (readyTime). De Desk houdt de klanten bij, zowel degene die nu bediend wordt (currentClient) als de wachtrij (queue); deze laatste wordt bijgehouden in een Vector.

De simulatie zelf is gemodelleerd door middel van de klasse PokasimModel. Deze houdt het huidige moment (currentTime) bij en is in staat een commando (via doCommand()) uit te voeren en een stap in de tijd te doen (via doStep()).

De impuls tot het uitvoeren van de simulatie is in handen van de user interface PokasimController en de thread PokasimRunner. De PokasimRunner doet óf op eigen gelegenheid eens per delay milliseconden een tick (via doStep()) óf doet dat wanneer dat vanuit de user interface PokasimController wordt gevraagd (klik op een button door gebruiker).

De PokasimView is een component van de user interface waarin de Desks en Clients vormgegeven worden. De details van de vormgeving worden gedelegeerd aan een aparte klasse Icon, die via Person wordt benaderd.

Het te verrichten werk bestaat vooral uit het maken van uitbreidingen op de klassenhiërarchie van de Clients en Servants. Bijgevoegd is een klasse PokasimTest waarmee de werking van PokasimModel via JUnit is te controleren. Gevraagd wordt PokasimTest zo uit te breiden dat de nieuwe functionaliteit van het model ook gecontroleerd wordt. Ook moet voor de nieuwe klassen documentatie worden gegenereerd.

Delivarables

De volgende zaken moeten worden ingeleverd;
  1. Een aangepaste versie van het programma, die bovenstaande extra functionaliteit heeft. (Alleen Java-broncode, geen gecompileerde class files.)
  2. Documentatie, gegenereerd door javadoc, voor de nieuwe of gewijzigde klassen in het programma.
  3. Een nieuwe versie van PokasimTest die de nieuw toegevoegde functionaliteit controleert.
  4. In GIF-vorm: een aangepaste versie van het klassendiagram van de Clients en Servants.

  5.  

Startversie

De broncode is hier te downloaden. De documentatie is hier online in te zien.