Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Relevanta dokument
HT1 2013, FÖRELÄSNING 5

HT1 2015, FÖRELÄSNING

Dagens program. Objektorienterad modellering och diskreta strukturer / design. Model/View/Control-implementering. Model/View/Control-arkitektur

Dagens program. Objektorienterad modellering och diskreta strukturer / design. Model/View/Control-implementering. Model/View/Control-arkitektur

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

HT1 2015, FÖRELÄSNING 14 (INFÖR TENTAN)

HT2 2015, FÖRELÄSNING 15 (XL-PROJEKTET)

Lösningar till tentamen i EDAF25

Lösningar till tentamen i EDAF25

4.7 Observatörsmönstret

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Seminarierna Instruktioner. Övningarna Viktiga relationer

HT1 2013, FÖRELÄSNING 14 (INFÖR TENTAN)

Förra föreläsningen. Dagens agenda. Jojo-kort med två strategier Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

HT1 2013, FÖRELÄSNING

Förra föreläsningen. Dagens agenda. Jojo-kort med två strategier Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Kursombud. Objektorienterad modellering och diskreta strukturer / design. Agile? Designprinciper EDAF10 EDA061. Lennart Andersson. Grupper för projekt

JUnit. Ska kompletteras med kodexempel på JUnit. DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012

Computer projekttid. Objektorienterad modellering och diskreta strukturer / design. Rapporter från verkligheten. EDAF10 i HT2

HT1 2015, FÖRELÄSNING

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

Tentamen i Objektorienterad modellering och diskreta strukturer

DAT043 - Föreläsning 7

Förra föreläsningen. Dagens agenda. Vecka Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Tentamen i Objektorienterad modellering och diskreta strukturer

HT1 2015, FÖRELÄSNING

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Objektorienterad modellering och design (EDAF25) Föreläsning 5. Repetition Grafer Traversering bredden först med kö

Tentamen i Objektorienterad modellering och design

Projekt 2 XL. Observer-mönstret

Designmönster/Design patterns

Lösningsförslag till tentamen

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

LÖSNINGSFÖRSLAG

Properties. Användbara metoder som kan anropas i propertychanged:

LULEÅ TEKNISKA UNIVERSITET

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen i Objektorienterad modellering och design Helsingborg

Tentamen i Objektorienterad programmering

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Information. Computer

Objektorienterad programutveckling, fk

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Föreläsning 10. ADT:er och datastrukturer

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

Lösningsförslag: Övning 5.

Instuderingsuppgifter läsvecka 2

Design Patterns. En kort introduktion

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Tentamen LÖSNINGSFÖRSLAG

Svaret kan ges i Javakod (eller i UML-klassdiagram). public class A { B minb;... } public class B { <B:s många variabler och metoder> } Lösning:

Föreläsning 15: Repetition DVGA02

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Observer Pattern och MVC. Objekt-orienterad programmering och design Alex Gerdes, 2016

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Föreläsningsbilder EDAF10/EDA061 Ht 2015 HT1 2015, FÖRELÄSNING 3

MVC-mönstret. model-view-control i Swing

Förra föreläsningen. Dagens agenda. Command Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Laboration 3 GUI-programmering

DAT043 - föreläsning 8

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Tentamen LÖSNINGSFÖRSLAG

Objektorienterad Programmering (TDDC77)

Programmering för språkteknologer II, HT2014. Rum

2I1049 Föreläsning 8. Grafiska gränssnitt i Java. AWT-komponenter. Grafiska gränssnitt, Java interface och händelsehantering

Lösningsförslag till exempeltenta 2

Föreläsning 3: Händelsestyrda program och användargränssnitt

Laboration 2: Designmönster

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Laboration 2: Designmönster

Tentamen i Objektorienterad modellering och diskreta strukturer

Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Förra föreläsningen. Dagens agenda. Dagens agenda. Föreläsningsbilder EDAF10/EDA Ulf Asklund, Datavetenskap/LTH 1

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Transkript:

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2014, FÖRELÄSNING 5 Datavetenskap/LTH EDAF10/EDA061 HT2014 Ulf Asklund

Förra föreläsningen Designmönster Strategy Singleton Null object Facade Decorator ISP Interface Segregation Principle Muterbar vs. Ej muterbar Intro till Payroll

Dagens agenda Projektredovisningar denna vecka! Glöm inte 3-minuterspresentationen Layout av klassdiagram Designmönster Decorator (repetition) Model-View-Control Observer LSP Substitutionsprincipen Paketdesign Namngivning

AutoArrange

Ordna manuellt

Decorator - exempel StandardPayStation implementerar en metod pay vilken anropas när man betalar en resa med TravelCard över ett visst antal zoner. public interface PaySation { public double pay(travelcard travelcard, int zones); public StandardPayStation implements PayStation { private double sum; public double pay(travelcard travelcard, int zones) { double price = travelcard.price(zones); sum += price; return price;

Decorator - exempel <<interface>> PayStation + pay(travelcard, int) StandardPayStation - sum:double + pay(travelcard, int) paystation = new StandardPayStation(); paystation.pay(mytc, 3);

Decorator-mönstret Skånetrafiken vill nu kunna logga alla köp av biljetter under oktober. Hur gör vi??

Flagga? <<interface>> PayStation + pay(travelcard tc, int zones) StandardPayStation - sum:double - logg:boolean + pay(travelcard, int) If logg { dologg paystation = new StandardPayStation(logg); paystation.pay(mytc, 3);

Subklass? <<interface>> PayStation + pay(travelcard tc, int zones) DeLuxePayStation - sum:double + pay(travelcard, int) StandardPayStation - sum:double + pay(travelcard, int) SimplePayStation - sum:double + pay(travelcard, int) LoggedStandardPayStation - sum:double - Logg + pay(travelcard, int) Implementera loggningen i en subklass?

Decorator! <<interface>> PayStation + pay(travelcard tc, int zones) DeLuxePayStation - sum:double + pay(travelcard, int) StandardPayStation - sum:double + pay(travelcard, int) LoggingPayStation - PayStation - Logg + pay(travelcard, int) standardpaystation = new StandardPayStation(); paystation = new LoggingPayStation(standardPayStation); paystation.pay(mytc, 3);

Decorator! <<interface>> PayStation + pay(travelcard tc, int zones) DeLuxePayStation - sum:double + pay(travelcard, int) StandardPayStation - sum:double + pay(travelcard, int) LoggingPayStation - PayStation - Logg + pay(travelcard, int) Endast en Decorator även om det finns många subklasser till PayStation Tillståndet i StandardPayStation bevaras Multipla Decorators? Se kap. 28 i Martin Visitor-mönstret.

Decorator-mönstret Den nya funktionaliteten: public LoggingPayStation implements PayStation { private PayStation paystation; private List<String> log; public LoggingPayStation(PayStation paystation, List<String> log) { this.paystation = paystation; this.log = log; public double pay(travelcard travelcard, int zones) { log.add(travelcard.tostring() + zones); return paystation.pay(travelcard, zones);

Loggningen kan göras dynamiskt PayStation standardpaystation = new StandardPayStation(); PayStation paystation = standardpaystation; I början av oktober lägger vi till loggningen: paystation = new LoggingPayStation(standardPayStation); I slutet av oktober tar vi bort den: paystation = standardpaystation; Tillståndet i standardpaystation bevaras.

Model/View/Control

Model/View/Control-arkitektur Modellen beskriver systemets tillstånd. Vyn visar upp systemets tillstånd. Control förändrar systemets tillstånd. View Model Control

Model/View/Control-implementering JFrame <<interface>> ActionListener JButton View Model Control Paketberoenden View Model Control

Model/View/Control Varför? Principen om enkelt ansvar. Integritet: Modellen behöver inte känna till vyn. Flera vyer av en modell. Om Control saknar tillstånd slår vi ofta ihop vyn och control till ett grafiskt användargränssnitt, GUI.

Observer Observer-mönstret används för att separera modellen från användargränssnittet, vyn. Vyn implementerar gränssnittet Observer. Modellen utvidgar klassen Observable. När modellens tillstånd förändras informeras alla observatörer om att det skett en förändring och vyerna uppdaterar sig genom att hämta information från modellen. Observer/Observable är ett ramverk; klasserna finns färdiga.

Observer & Observable Finns i java.util public class Observable { public void addobserver(observer observer) public void deleteobserver(observer observer) protected void setchanged() public void notifyobservers(object object) public void notifyobservers() // omissions public interface Observer { public void update(observable observable, Object object);

Observer-mönstret Metoden state() i modellen är en sorts getter. Det är bra om denna inte avslöjar hur tillståndet representeras.

Observer-mönstret public class Model extends Observable { private int state; public void changestate() { state++; setchanged(); notifyobservers(); public String state() { return String.valueOf(state); Metoden state() i modellen är en sorts getter. Det är bra om denna inte avslöjar hur tillståndet representeras.

Observer-mönstret Metoden state() i modellen är en sorts getter. Det är bra om denna inte avslöjar hur tillståndet representeras. public class View extends JLabel implements Observer { private Model model; public View(Model model) { this.model = model; model.addobserver(this); public void update(observable observable, Object object) { settext(model.state()); Tydlig koppling till modellen.

Observer-mönstret Metoden state() i modellen är en sorts getter. Det är bra om denna inte avslöjar hur tillståndet representeras. public class View extends JLabel implements Observer { public View(Model model) { model.addobserver(this); public void update(observable observable, Object object) { Model model = (Model) observable; settext(model.state()); Mindre tydlig koppling till modellen.

Ihopkoppling av vy och modell Skapa model och vy enligt exemplet ovan: Model model = new Model(); View view = new View(model); Kopplingen mellan vy och modell kan också göras där vy och modell skapas: Model model = new Model(); View view = new View(); model.addobserver(view); Någon nackdel?

Java.util.Observable implementering public class Observable { private boolean changed = false; private Vector<Observer> vector = new Vector<Observer>(); public synchronized void addobserver(observer observer) { if (!vector.contains(observer)) { vector.add(observer); protected synchronized void setchanged() { changed = true;...

java.util.observable Något förenklad: public class Observable { private boolean changed = false; private Vector<Observer> vector = new Vector<Observer>(); public void notifyobservers() { notifyobservers(null); public synchronized void notifyobservers(object arg) { if (!changed) { return; changed = false; for (Observer observer: vector) { observer.update(this, arg);

MVC med Observer En eller flera vyer registrerar sig som observatörer av modellen via addobserver. OCP Open-Closed Principle Ett kommando modifierar modellens tillstånd. Modellen informerar Observable att tillståndet förändrats via setchanged. Modellen begär att observatörerna informeras genom notifyobservers. notifyobservers i Observable informerar observatörerna via update om att modellen förändrats. Observatörerna hämtar modellens nya tillstånd och uppdaterar vyerna.

Sekvensdiagram Anrop av en metod i modellen som ändrar dess tillstånd så att vyerna ska uppdateras.

Observer, update-parametrarna public interface Observer { public void update(observable observable, Object object); När man anropar notifyobservers(object) i modellen kommer update(observable, Object) att anropas i alla observatörer. Vad skall man använda argumenten till?

Update(observable, ) Observable kan användas för att komma åt modellen. Det är tydligare att ge observatören tillgång till modellen via observatörens konstruerare.

Update(, object) Object kan användas för att skicka information från modellen till vyn. Fråga: Hur kan modellen veta vad vyn vill ha? Svar: Det kan den inte veta. Fråga: Det kan finnas flera observatörer som vill veta olika saker. Hur skall informationen förpackas? Svar: Det är svårt att veta om man inte känner till alla observatörer som kan vara aktuella. Det finns ingen naturlig plats att dokumentera förpackningen.

Designprincip för Observer.update Undvik att använda parametrarna.

LSP Liskov Substitution Principle

LSP Substitutionsprincipen Liskov Substitution Principle Subtypes must be substitutable for their base types. När man konstruerar en subklass till en superklass så skall man göra det så att alla metoder som har superklassen som parametertyp även fungerar när argumentet är en instans av subklassen. Exempel: Model ersätter Observable, View ersätter Observer.

Brott mot LSP public class IntPair { private int i1, i2; public boolean equals(object object) { IntPair other = (IntPair) object; return i1==other.i1 && i2==other.i2; IntPair är en subklass till Object. Den bryter mot LSP på två sätt: Metoden kastar ett undantag om object har fel typ. Den borde returnera false när detta händer. Klassen fungerar ej som nyckel i en hashtabell. Lika objekt skall ha samma hashkod.

Reparation av IntPair public final class IntPair { private int i1, i2; public int hashcode() { return i1 + 13 * i2; public boolean equals(object object) { if(object instanceof IntPair) { IntPair other = (IntPair) object; return i1==other.i1 && i2==other.i2; return false;

Paketdesign Martin, kapitel 20 och 22

Designprinciper för paket Sammanhangsprinciper (package cohesion) Common reuse principle (CRP) Reuse-release equivalence principle (REP) Common closure principle (CCP) Stabilitetsprinciper (package coupling) Acyclic dependencies principle (ADP) Stable dependencies principle (SDP) Stable abstractions principle (SAP)

Common reuse principle (CRP) Klasserna i paketet är så nära relaterade att om man behöver en av dem så behövs i regel även de övriga. Exempel: Mjukvarupaketet i Computer. Om man behöver en instruktion så behövs också de andra instruktionerna och Program-klassen. Motsvarighet: Principen om enkelt ansvar.

Reuse-release equivalence principle (REP) The granule of reuse is the granule of release Återanvändning (reuse) innebär att det är paketägaren som underhåller och ger ut (release) paketet. Den som använder paketet skall inte behöva ändra på paketet och inte behöva titta på implementeringen och bestämmer själv när en ny utgåva skall integreras. Exempel: När hårdvarugruppen i det stora Computerprojektet kommer med en ny version av hårdvaran så kan simuleringsgruppen själv bestämma när den skall uppgradera hårdvaran och kan göra det utan att titta på implementeringen. Motsvarighet: Lokalitets- och integritetsprinciperna

Common closure principle (CCP) Klasserna i ett paket skall vara stängda resp. öppna tillsammans gentemot samma slags förändringar. Förändringar som påverkar en klass i paketet får påverka andra klasser i paketet men inga klasser utanför paketet. Exempel: När vi vill introducera VeryLongWord i Computerprojektet skall man bara behöva ändra i hårdvarupaketet. Motsvarighet: öppen/sluten-principen. Single-responsibility principen.

Stabilitetsprinciper Acyclic dependencies principle (ADP) Paket skall ej vara cykliskt beroende. Stable dependencies principle (SDP) Beroenden skall gå mot stabila paket. Stable abstractions principle (SAP) Stabila paket skall vara abstrakta.

Cykelproblem Paketstrukturen kan inte byggas top down inte det första man gör i sin systemdesign. Ett paket som ingår i en cykel går inte att återanvända utan att ta med hela cykeln och allt som cykelns paket beror på.

Med cykel package a; import b.b; public class A { public void methoda(b b) { b.method(); package b; import a.a; public class B { private A a; public void method() { a.methoda(this);

Utan cykel package a; public interface AI { public void method(); public class A { public void methoda(ai ai) { ai.method(); package b; import a.*; public class B implements AI { private A a; public void method() { a.methoda(this);

Stabilitetsprinciper Acyclic dependencies principle (ADP) Paket skall ej vara cykliskt beroende. Stable dependencies principle (SDP) Beroenden skall gå mot stabila paket. Stable abstractions principle (SAP) Stabila paket skall vara abstrakta.

Exempel - DIP Policy layer Mechanism Layer Utility Layer

Exempel - DIP Policy layer <<interface> Mech IF Mechanism Layer <<interface> Util IF Utility Layer

Exempel - SDP Policy Policy layer Mechanism Mechanism Layer Utility Utility Layer

Exempel - SDP Policy Policy layer Mechanism <<interface> Mech IF Mechanism Layer Utility <<interface> Util IF Utility Layer

Exempel - SDP Policy Policy layer <<interface> Policy Service Mechanism Mechanism Layer <<interface> Mech Service Utility Utility Layer

Stabilitetsprinciper Acyclic dependencies principle (ADP) Paket skall ej vara cykliskt beroende. Stable dependencies principle (SDP) Beroenden skall gå mot stabila paket. Stable abstractions principle (SAP) Stabila paket skall vara abstrakta.

Stabilitetsmetrik Paketets stabilitet S = C a / (C e + C a ), där C a är antalet klasser utanför paketet som beror på klasser i paketet. a står för afferent (inåtriktad). C e är antalet klasser i paketet som beror på klasser utanför paketet. e står för efferent (utåtriktad). S=0 innebär inget ansvar S=1 innebär inget beroende Paketets instabilitet I = 1 S = C e / (C e + C a ) I=0 är ett maximalt stabilt paket. Oberoende paket

Stabilitetsmetrik Paketets Abstrakthet A = N a / N c, där N a är antalet abstrakta klasser (gränssnitt) i paketet. N c är antalet klasser i paketet.

A-I grafen A = I = 1 är meningslösa zonen (useless zone) A = I = 0 är problemzonen (zone of pain) A = 0, I =1 och A = 1, I = 0 är önskvärda zoner

Ramverk och Namngivning

Paketstrukturer Komponenter Paketen är komponenter i systemet. Exempel: memory och program i Computer. Ramverk Systemet byggs genom att utvidga klasser i andra paket. Exempel: javax.swing, java.awt. Ett användargränssnitt konstrueras genom att utvidga och fylla i klasserna i ramverket. Eclipse. Observer/Observable

Ramverk Ramverk är mycket svårare att bygga. You have to build at least three frameworks and reject them before you can be reasonably confident that you have build the right archictecture for one domain. [Paraphrasing Rebecca Wirfs-Brock.] Martin: Kapitel 30. Educational Testing Service.

Namngivning Bra namngivning är fundamental för att göra program begripliga. public class MyList { private List<int[]> thelist; public List<int[]> getlist() { List<int[]> list = new ArrayList<int[]>(); for (int[] is : thelist) { if (is[0] < 4) { list.add(is); return list; Vad handlar det om?

Det handlar om projektgrupper I vilka grupper finns det plats för ytterligare studenter? public class Groups { private List<Group> groups; public List<Group> incompletegroups() { List<Group> list = new ArrayList<Group>(); for (Group group : groups) { if (! group.iscomplete()) { list.add(group); return list;

En grupp ska bestå av fyra studenter public class Group extends ArrayList<Student> { private static final int MAXSIZE = 4; public boolean iscomplete() { return size() >= MAXSIZE;

Dokumentation av MyList De reviderade klasserna behöver knappast någon särskild dokumentation. MyList gör det: MyList innehåller en lista av grupper av studenter. En grupp representeras med en heltalsarray där det första elementet innehåller antalet studenter i gruppen och de övriga innehåller id-nummer för studenterna. Metoden getlist returnerar en lista med de grupper som har plats för ytterligare studenter.

Datavetenskap/LTH EDAF10/EDA061 HT2014 Ulf Asklund