Tilstandsmaskiner med UML og Java

Like dokumenter
Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

GUI («Graphical User Interface») del 2

OPPGAVE 5b og 8b Java Kode

Del 3: Evaluere uttrykk

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

INF1010 Sortering. Marit Nybakken 1. mars 2004

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

INF Løsning på seminaropppgaver til uke 8

INF2100. Oppgaver 23. og 24. september 2010

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Kapittel 9: Sortering og søking Kort versjon

Jentetreff INF1000 Debugging i Java

INF Seminaroppgaver til uke 3

INF2100. Oppgaver 26. september til 1. oktober 2007

INF2120 V2005. Trafikanten+ Innlevering

INF1010 våren januar. Objektorientering i Java

TDT4100 Objektorientert programmering

INF2440 Prøveeksamen, løsningsforslag, 20 mai Arne Maus PSE, Inst. for informatikk

GUI («Graphical User Interface») del 2

Forelesning inf Java 5

Forelesning inf Java 5

IN1010 våren januar. Objektorientering i Java

Kapittel 9. Distribusjon. Fjernbruker. Tjenermaskin LAN WAN. Nærbruker. Figur 9-1: En enkel klient/tjener distribusjon

IN våren 2019 Onsdag 16. januar

HØGSKOLEN I SØR-TRØNDELAG

IN våren 2018 Tirsdag 16. januar

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

INF1010 våren Arv og subklasser del 1

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

INF2100. Oppgaver uke 40 og

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Introduksjon til objektorientert programmering

Dagens tema Kapittel 8: Objekter og klasser

Socket og ServerSocket

INF våren 2017

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF1010 våren Arv og subklasser del 1

Data. Dette refereres til som objektets tilstander. Funksjonalitet. Dette refereres til som objektets metoder.

Feilmeldinger, brukerinput og kontrollflyt

Kapittel 8: Programutvikling

Klasser, objekter, pekere og UML. INF gruppe 13

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

La oss begynne med en repetisjon av hva som skjer når du kjører Javaprogrammet

INF2100. Oppgaver 6. og 11. oktober 2011 C 100 X 10

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

Kapittel 8: Sortering og søking

Synkronisering II. Kapittel 7. Betingelse oppfylt (0) liste. tråd-deskriptor. venteliste. tråd-deskriptor. tråd-deskriptor.

Fra krav til objektdesign

Løsningsforslag til eksamen i INF1000 våren 2006

Repitisjonskurs. Arv, Subklasser og Grensesnitt

UNIVERSITETET I OSLO

INF1010 Tråder II 6. april 2016

Spesifikasjon av Lag emne. Kursregistrering bruksmønstermodell (ny versjon) Dagens forelesning. Fra krav til objektdesign

Løsningsforslag Test 2

Eksamen Objektorientert Programmering 2012

INF1000: Forelesning 7

INF1010 våren Arv og subklasser - del 2

UNIVERSITETET I OSLO

En algoritme for permutasjonsgenerering

TOD063 Datastrukturer og algoritmer

Vårt system kan kjøres ved å skrive. STUD1 konto fredo 37 (holdeplass)

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

UNIVERSITETET I OSLO

Kapittel 8: Sortering og søking INF100

static int ant_steiner; //antall steiner static int teller2 = 0; //teller for printing til Thread^ murer; //murertråden

Kapittel 9: Sortering og søking Kort versjon

TDT4100 Objektorientert programmering

INF1010 Arv. Marit Nybakken 2. februar 2004

Eksamen i Internetteknologi Fagkode: ITE1526

Eksempel 1 Eksempel 2 Dramatisering. INF1000 uke 3. Sundvollen 7. september 2015 Dag Langmyhr. INF1000 Sundvollen

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

Kapittel 9: Sortering og søking Kort versjon

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Sortering med tråder - Quicksort

Synkronisering I. Kapittel 6. Tråd A. ferdig. t.varsle() u.vente() Tråd B. ferdig. tid

Oblig 4Hybelhus litt mer tips enn i oppgaven

INF1000: Forelesning 7. Konstruktører Static

Dagens tema: Mer av det dere trenger til del 1

Kapittel 5: Objektkommunikasjon

Kapittel 7: Mer om arv

UNIVERSITETET I OSLO

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

(MVC - Model, View, Control)

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

UNIVERSITETET I OSLO

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

Transkript:

Tilstandsmaskiner med UML og Java DAT2160 DAT2160 Høst Høst 2002 2002 Tilstandsmaskiner Tilstandsmaskiner med med UML UML og og Java Java

Hva er en (endelig) tilstandsmaskin? En tilstandsmaskin kan sees på som en komponent som kommuniserer med omverdenen ved å konsumere og produsere meldinger. Hvordan den reagerer på meldingene den mottar er avhengig av hvilken tilstand den er i. En tilstands maskin består av: Et sett av tilstander Lokale variable Transisjoner Et sett av meldinger den kan forstå

Finite state machine (Endelig tilstands maskin) Endelig Et endelig antall tilstander. I denne sammenheng et begrenset antall navngitte tilstander. Tilstand En stabil situasjon hvor en prosess venter på å motta et stimuli. En tilstand i en tilstandsmaskin representerer historien til et eksekveringsforløp. Maskin Bare stimuli (signal, melding) trigger (utløser) en handling. Handling utføres i det en tilstandsmaskin går i fra en tilstand til en annen (i transisjonen). En tilstandsmaskin kan også ha data/variable.

Hvorfor bruke tilstandsmaskiner? Tilstandsmaskiner har vist seg å være velegnet for å modellere, validere og implementere reaktive systemer med krav til sanntids oppførsel, parallellprossesering og høy grad av sikkerhet/forutsigbarhet. Tilstandsmaskiner gjør det enklere å lage systemer som er avhengig av synkronisering sammenlignet med sekvensiell trådprogrammering. Bruk av tilstandsmaskiner gjør det mulig å håndtere større kompleksitet. Bruk av asynkront kommuniserende tilstandsmaskiner er en naturlig måte å håndtere samtidighet. Bruk av tilstandsmaskiner vil ofte være mer effektivt sammenlignet med tradisjonell trådprogrammering. (Mindre context switching ).

Eksempel; bruk av tilstandsmaskiner til styring av legobil.

Hva vil det si at til tilstandsmaskiner kommuniserer asynkront? Scheduler Når hver tilstandsmaskin har en postkasse / meldingskø kan tilstandsmaskinene kommunisere asynkront. Det betyr at en tilstandsmaskin kan fortsette prosesseringen uten å måtte vente på at en melding den har sendt blir prosessert hos mottakeren. Meldingen blir liggende i postkassen til mottakeren har mulighet/tid til å behandle den. En scheduler bestemmer når tilstandsmaskinene får lov til å prosessere meldinger fra postkassen / meldingskøen. Slik deles systemressursene mellom alle tilstandsmaskinene.

JavaFrame lar oss lage tilstandsmaskiner i Java og UML 2.0 Et aktivt objekt representerer noe som kan handle på egenhånd. I JavaFrame finnes det to typer aktive objekter; tilstandsmaskiner og kompositter. Kompositt begrepet er innført for å gi bedre skalerbarhet. En kompositt kan inneholde tilstandsmaskiner og nye kompositter. All kommunikasjon til og fra aktive objekter går igjennom porter/mediatorer. Porter/mediatorer er meldingsgrensesnitt for de aktive objektene. Ved å bruke porter/mediatorer oppnår man uavhengighet mellom de aktive objektene.

Mapping mellom modell og kode ved bruk av patterns Vi kan bruke patterns for å lage kode av modellene våres. Å bruke et pattern for å omgjøre modellen til kode betyr at vi følger bestemte retningslinjer for hvordan vi skal programmere. Patterns er til for å hjelpe oss med å lage effektiv og konsistent kode og muliggjør et en-til-en forhold mellom modell og kode. UML 2.0 modell UML med JavaFrame vri mapping /transformasjon (i henhold til pattern) mapping (i henhold til pattern) modellering mens man programmerer (i henhold til pattern) JavaFrame Java JavaFrame Java JavaFrame Java

Modell, implementasjon og verifisering

Hvordan kan kildekoden til en tilstandsmaskin se ut? package hia.grm.dat2160.statemachines; import se.ericsson.eto.norarc.javaframe.*; import hia.grm.dat2160.statemachines.messages.*; public class CarControlCS extends CompositeState { public static State initializecar = new State( InitializeCar ); public static State carmovingforwards = new State( CarMovingForwards ); public static State carmovingbackwards = new State( CarMovingBackwards ); public CarControlCS() { super("carcontrolcs"); initializecar.enclosingstate = this; carmovingbackwards.enclosingstate = this; carmovingforwards.enclosingstate = this; public void enterstate(int nr, StateMachine statemachine) { CarControlSM carcontrolsm = (CarControlSM)stateMachine; TimerMsg initialisecarok = new TimerMsg(3000, carcontrolsm); Start transisjonen initialisecarok.starttimer(); initializecar.enterstate(statemachine); Den første tilstanden tilstandsmaskinen går i.

protected boolean exectrans(message message, State state, StateMachine statemachine) { CarControlSM carcontrolsm = (CarControlSM)stateMachine; System.out.println("execTrans: " + message); if(state == initializecar) { if(message instanceof TimerMsg) { output(new MoveForwardMsg(), carcontrolsm.carcontrolmediatorout, statemachine); carmovingforwards.enterstate(statemachine); return true; return false; else if(state == carmovingforwards) { if(message instanceof FrontSensorMsg) { output(new MoveBackwardMsg(), carcontrolsm.carcontrolmediatorout, statemachine); carmovingbackwards.enterstate(statemachine); Går i neste tilstand return true; if(message instanceof BackSensorMsg) { samestate(statemachine); return true; return false; else if(state == carmovingbackwards) { if(message instanceof BackSensorMsg) { output(new MoveForwardMsg(), carcontrolsm.carcontrolmediatorout, statemachine); carmovingforwards.enterstate(statemachine); return true; if(message instanceof FrontSensorMsg) { samestate(statemachine); return true; return false; return false; Her mottas meldingen og transisjonen utføres. Tester på hvilken tilstand tilstandsmaskinen er i Undersøker hvilken melding som er mottatt Sender ut en ny melding

Oppkobling av tilstandsmaskinens mediatorer: package hia.grm.dat2160.statemachines; import se.ericsson.eto.norarc.javaframe.*; public class CarControlSM extends StateMachine { public Mediator carcontrolmediatorout; public CarControlSM(Scheduler scheduler, Mediator carcontrolmediatorout, Mediator carcontrolmediatorin) { super(scheduler); this.carcontrolmediatorout = carcontrolmediatorout; carcontrolmediatorin.addaddress(this); protected void execstarttransition() { CarControlCS carcontrolcs = new CarControlCS(); carcontrolcs.enterstate(1, this); Her settes adresseringen for tilstandsmaskinen opp Denne metoden kalles når tilstandsmaskinen startes

Composites hjelper oss å håndtere stor kompleksitet: Eksempel: Mellom StateMachineY og StateMachineZ kan det gå hundrevis av meldinger som del av en kompleks protokoll mens det mellom CompositeA og omverdenen kanskje bare går noen få meldinger som del av en enkel protokoll. Resultat: Komposisjon lar oss abstrahere over kompleks oppførsel og arkitektur.

Hvordan kan kildekoden til en composite se ut? package hia.grm.dat2160.statemachines; import se.ericsson.eto.norarc.javaframe.*; public class CarControl extends Composite { private Mediator rcxmediatorin; private Mediator rcxmediatorout; private Mediator carcontrolin; private Mediator carcontrolout; private Scheduler scheduler; public CarControl(Scheduler scheduler, Mediator rcxmediatorin, Mediator rcxmediatorout) { this.scheduler = scheduler; this.rcxmediatorin = rcxmediatorin; this.rcxmediatorout = rcxmediatorout; carcontrolin = new Mediator(); carcontrolout = new Mediator(); rcxmediatorin.addaddress(carcontrolin); carcontrolout.addaddress(rcxmediatorout); CarControlSM carcontrolsm = new CarControlSM(scheduler, carcontrolout, carcontrolin);

Mediatorer: En mediator er et asynkront kommunikasjons grensesnitt/port. En mediator brukes i sin enkleste form til å koble sammen statemachines og composites. De enkleste mediatorene sender meldingene de mottar videre til mottakeren. Det finnes også mer avanserte mediatorer som for eksempel RMIMediator, CORBAMediator etc. Vi kan også lage våre egne mediatorer for å løse spesielle problemer, for eksempel en RCXMediator. En viktig fordel med mediatorer er at vi kan lage programlogikk uten å tenke for mye på hvordan lavnivå kommunikasjons protokoller er implementert.

Eksempel på bruk av mediatorer: Fra RCXMediatorIn mottar vi følgende meldinger: BackSensorMsg FrontSensorMsg Til RCXMediatorOut kan vi sende følgende meldinger: MoveBackwardMsg MoveForwardMsg StopMsg PlaySoundMsg TurnLeftMsg TurnRightMsg I dette eksempelet slipper vi å tenke på hvordan lavnivå kommunikasjons protokoll mot legobilen er realisert. Vi trenger bare å forholde oss til meldingene og kan heller fokusere på hvordan vi kan lage et godt styresystem ved hjelp av tilstandsmaskiner!

Hvordan kan kildekoden til en mediator se ut? package hia.grm.dat2160.statemachines; import se.ericsson.eto.norarc.javaframe.*; import hia.grm.dat2160.statemachines.messages.*; public class RCXMediatorOut extends Mediator { private RCXControl rcxcontrol; public RCXMediatorOut(RCXControl rcxcontrol) { this.rcxcontrol = rcxcontrol; Her mottas meldingen og meldings typen bestemmes public void forward(message signal) { System.out.println("In RCXMediatorOut, signal: " + signal); if(signal instanceof StopMsg) { rcxcontrol.sendrcxmsg("2983"); else if(signal instanceof MoveForwardMsg) { rcxcontrol.sendrcxmsg("e983"); rcxcontrol.sendrcxmsg("2983"); else if(signal instanceof MoveBackwardMsg) { rcxcontrol.sendrcxmsg("e943"); rcxcontrol.sendrcxmsg("2983"); else if(signal instanceof TurnLeftMsg) { rcxcontrol.sendrcxmsg("e941"); rcxcontrol.sendrcxmsg("e982"); rcxcontrol.sendrcxmsg("2983"); else if(signal instanceof TurnRightMsg) { rcxcontrol.sendrcxmsg("e981"); rcxcontrol.sendrcxmsg("e942"); rcxcontrol.sendrcxmsg("2983"); else System.out.println("Can't process message: " + signal + " in RCXMediatorOut!");

Oppstart av et JavaFrame system: package hia.grm.dat2160.statemachines; import se.ericsson.eto.norarc.javaframe.*; public class RCXControllerMain { public static void main(string[] args) { try { Mediator rcxmediatorin = new Mediator(); RCXControl rcxcontrol = new RCXControl("COM1", rcxmediatorin); RCXMediatorOut rcxmediatorout = new RCXMediatorOut(rCXControl); Trace trace = new Trace(true, "LegoBil.jft"); Scheduler scheduler = new Scheduler(trace); Thread thread = new Thread(scheduler); CarControl carcontrol = new CarControl(scheduler, rcxmediatorin, rcxmediatorout); thread.start(); System.out.println("CarControl is up and running..."); catch(exception e) { e.printstacktrace(); Lager mediatoren som mottar meldinger fra legobilen Lager mediatoren som sender meldinger til legobilen Angir navn på trace fil Lager en scheduler Lager styrings systemet Starter systemet

Hvordan undersøke hva som skjer i et system av tilstandsmaskiner? Svar: Vi bruker trace. JFTrace 2002-10-21 17:53:44.508 JFTrace: New SM: 0:CarControlSM@2f1921 110:Input: 1:CarControlSM@2f1921:null:StartMessage:Next state: 1:InitializeCar 3154:Input: 2:CarControlSM@2f1921:InitializeCar:TimerMsg:Output: 2:Mediator:MoveForwardMsg:Next state: 2:CarMovingForwards 7020:Input: 3:CarControlSM@2f1921:CarMovingForwards:FrontSensorMsg:Output: 3:Mediator:MoveBackwardMsg:Next state: 3:CarMovingBackwards 9714:Input: 4:CarControlSM@2f1921:CarMovingBackwards:BackSensorMsg:Output: 4:Mediator:MoveForwardMsg:Next state: 4:CarMovingForwards 10836:Input: 5:CarControlSM@2f1921:CarMovingForwards:FrontSensorMsg:Output: 5:Mediator:MoveBackwardMsg:Next state: 5:CarMovingBackwards 11927:Input: 6:CarControlSM@2f1921:CarMovingBackwards:FrontSensorMsg:Same state: 6:CarMovingBackwards 13860:Input: 7:CarControlSM@2f1921:CarMovingBackwards:FrontSensorMsg:Same state: 7:CarMovingBackwards 14811:Input: 8:CarControlSM@2f1921:CarMovingBackwards:BackSensorMsg:Output: 8:Mediator:MoveForwardMsg:Next state: 8:CarMovingForwards 16163:Input: 9:CarControlSM@2f1921:CarMovingForwards:BackSensorMsg:Same state: 9:CarMovingForwards

Trace n blir litt kan bli litt lettere lese hvis man bruker et verktøy:

Composite states / substate machine er tilstandsmaskiner inni tilstander. CarControlCS initialisecarok.starttimer() CarMovingCS 0 cartimeout.starttimer() / send lightsonmsg backsensormsg / InitializeCar frontsensormsg / backsensormsg / frontsensormsg / send moveforwardmsg initialisecarok / send stopmsg CarStopped CarMovingCS backsensormsg / send movebackwardmsg backsensormsg / send moveforwardmsg carmovingforwards cartimeout /send lightsoffmsg frontsensormsg / send movebackwardmsg, playsoundmsg 0 cartimeout /send lightsoffmsg carmovingbackwards 0 1 frontsensormsg / 0 cartimeout.starttimer() / send playsoundmsg, lightsonmsg / send stopmsg 1

Vi bruker Composite States fordi noen transisjoner er mer generelle enn andre: Man stopper Lego bilen på samme måte uansett om man kjører forover eller bakover. Når Lego bilen beveger seg kan den være i to tilstander; enten kjører den forover eller bakover. Den vil uansett være i en tilstand hvor den beveger seg. Hva er fordelene med å bruke Composite States? Bedre oversikt. Mer kompakt kode. Transisjoner kan beskrives færre steder. Composite states blir en slags komponent med mulighet for gjenbruk a tilstander. Composite states er tilstander som kan skiftes ut under run-time. Dette mulighet for å endre systemets oppførsel mens det kjører.