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



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

HT1 2013, FÖRELÄSNING 5

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

HT1 2015, FÖRELÄSNING

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Lösningar till tentamen i EDAF25

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

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

Lösningar till tentamen i EDAF25

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

4.7 Observatörsmönstret

LULEÅ TEKNISKA UNIVERSITET

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

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

Projekt 2 XL. Observer-mönstret

Lösningsförslag till tentamen

Föreläsnings 10 - Överlagring, Konstruerare, Arv, Mer Exceptions, Reguljära Uttryck

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

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

DAT043 - Föreläsning 7

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

Tentamen i Objektorienterad programmering

Tentamen LÖSNINGSFÖRSLAG

Seminarierna Instruktioner. Övningarna Viktiga relationer

Objektorienterad programutveckling, fk

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

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

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

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

Tentamen LÖSNINGSFÖRSLAG

Tentamen i Objektorienterad programmering

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

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Laboration 3 GUI-programmering

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

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

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

LÖSNINGSFÖRSLAG

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen i Objektorienterad modellering och diskreta strukturer

Språkkonventioner och redigering av tal.

Föreläsning 9: Arv och UML

Lösningsförslag till tentamen

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

OOP Objekt-orienterad programmering

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

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

Designmönster/Design patterns

TENTAMEN OOP

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

OOP Objekt-orienterad programmering

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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:

DAT043 - föreläsning 8

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

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

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

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

Föreläsning 7. Träd och binära sökträd

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

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

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

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

Lösningsförslag till exempeltenta 2

Datorövning 2 Statistik med Excel (Office 2007, svenska)

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

Tentamen OOP

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

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

Malmö högskola 2007/2008 Teknik och samhälle

TDDD78 Viktiga begrepp, del 2

Information. Computer

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Lösningsförslag till tentamen

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

HT1 2015, FÖRELÄSNING

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

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

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

TIMREDOVISNINGSSYSTEM

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

Boll-lek om normer. Nyckelord: likabehandling, hbt, normer/stereotyper, skolmiljö. Innehåll

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Lösningar för tenta 2 DAT043,

Länkade strukturer. (del 2)

Transkript:

Dagens program Objektorienterad modellering och diskreta strukturer / design Fler mönster och Paketdesign Lennart Andersson Model View Control Observer Paketdesign Namngivning Reviderad 2012 09 17 2012 OMD 2012 F5-1 Model/View/Control-arkitektur OMD 2012 F5-5 Model/View/Control-implementering Modellen beskriver systemets tillstånd. JFrame <<interface>> ActionListener JButton Vyn visar upp systemets tillstånd. Control förändrar systemets tillstånd. View Model Control View Model Control Paketberoenden View Model Control OMD 2012 F5-6 OMD 2012 F5-7

Model/View/Control Observer 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-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. OMD 2012 F5-8 Observer Finns i java.util public interface Observer { public void update(observable observable, Object object); This method is called whenever the observed object is changed. An application calls an Observable object s notifyobservers method to have all the object s observers notified of the change. OMD 2012 F5-9 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 This class represents an observable object, or data in the model-view paradigm. It can be subclassed to represent an object that the application wants to have observed. OMD 2012 F5-10 OMD 2012 F5-11

Observer mönstret Model interface Observer + update(observable, Object) View - model: Model + View(Model) + update(observable, Object) * Observable - changed: boolean + addobserver(observer) + notifyobservers(object) + notifyobservers() Model - state: Hidden + changestate() + state(): String Metoden state() i modellen är en sorts getter. Det är bra om denna inte avslöjar hur tillståndet representeras. public class Model extends Observable { private int state; public void changestate() { state++; setchanged(); notifyobservers(); public String state() { return String.valueOf(state); View OMD 2012 F5-12 OMD 2012 F5-13 Extern ihopkoppling 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. 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); public class View extends JLabel implements Observer { public void update(observable observable, Object object) { settext(observable.tostring()); OMD 2012 F5-14 OMD 2012 F5-16

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;... OMD 2012 F5-17 MVC med Observer... 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); OMD 2012 F5-18 Observer, update-parametrarna En eller flera vyer registrerar sig som observatörer av modellen via addobserver. 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. 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? OMD 2012 F5-19 OMD 2012 F5-21

update(observable,...) update(..., object) Observable kan användas för att komma åt modellen. Object kan användas för att skicka information från modellen till vyn. Det är tydligare att ge observatören tillgång till modellen via observatörens konstruerare. Det kan vara praktiskt att anropa addobserver i observatörens konstruerare. 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. OMD 2012 F5-22 Designprincip för Observer.update OMD 2012 F5-23 LSP Substitutionsprincipen Undvik att använda parametrarna. 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. OMD 2012 F5-24 OMD 2012 F5-25

Brott mot LSP Reparation av IntPair 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. 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; OMD 2012 F5-26 Implementering av equals Om klassen inte är final är det mer komplicerat att göra det korrekt, men Eclipse kan göra det åt oss. public class Pair { private A a1, a2; public int hashcode() { final int prime = 31; int result = 1; result = prime result + ((a1 == null)? 0 : a1.hashcode()); result = prime result + ((a2 == null)? 0 : a2.hashcode()); return result; OMD 2012 F5-28 OMD 2012 F5-27 Implementering av equals public boolean equals(object obj) { if (this == obj) return true; if (obj == null) if (getclass()!= obj.getclass()) Pair other = (Pair) obj; if (a1 == null) { if (other.a1!= null) else if (!a1.equals(other.a1)) if (a2 == null) { if (other.a2!= null) else if (!a2.equals(other.a2)) return true; OMD 2012 F5-29

Designprinciper för paket Common reuse principle Sammanhangsprinciper (cohesion) Common reuse principle Reuse-release equivalence principle Common closure principle Stabilitetsprinciper Acyclic dependencies principle Stable dependencies principle Stable abstractions principle 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 och Program-klassen. Motsvarighet: Principen om enkelt ansvar. OMD 2012 F5-31 Reuse-release equivalence principle, REP OMD 2012 F5-32 Common closure principle Återanvändning (reuse) innebär att det är någon annan som underhåller och ger ut (release) paketet. Den som använder paketet skall inte ändra på paketet och inte behöva titta på implementeringen och bestämmer själv när en ny utgåva skall integreras. 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 hårdvarugruppen i det stora Computer-projektet kommer med en ny version av hårdvaran så kan simuleringsgruppen själv bestämma när den skall uppgardera hårdvaran och kan göra det utan att titta på implementeringen. Motsvarighet: Lokalitets- och integritetsprinciperna Exempel: När vi vill introducera VeryLongWord i Computer-projektet skall man bara behöva ändra i hårdvarupaketet. Motsvarighet: Öppen/sluten-principen. OMD 2012 F5-33 OMD 2012 F5-34

Stabilitetsprinciper Paketberoenden i Computer Paket skall ej vara cykliskt beroende. Beroenden skall gå mot stabila paket. Stabila paket skall vara abstrakta. OMD 2012 F5-35 Cykelproblem OMD 2012 F5-36 Med cykel Man kan inte bygga systemet nerifrån. 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å. 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); OMD 2012 F5-37 OMD 2012 F5-38

Utan cykel Stabilitetsmetrik package a; public interface AI { public void method(); public class A { public void methoda(ai ai){ ai.method(); package b; import a.a; public class B implements AI { private A a; public void method() { a.methoda(this); Paketets stabilitet C a S = C e + C a C e antalet klasser i paketet som beror på klasser utanför paketet. e står för efferent (utåtriktad). C a antalet klasser utanför paketet som beror på klasser i paketet. a står för afferent (inåtriktad). Om S = 1 för alla paket i systemet så är det inget system. Paketets instabilitet C e I = 1 S = C e + C a OMD 2012 F5-39 Stabilitetsmetrik OMD 2012 F5-40 A I grafen Paketets Abstrakthet A = N a N c N a antalet abstrakta klasser (gränssnitt) i paketet. N c antalet klasser i paketet. A = I = 1 meningslösa zonen (useless zone) A = I = 0 problemzonen (zone of pain) A = 0, I = 1 och A = 1, I = 0 önskvärda zoner OMD 2012 F5-41 OMD 2012 F5-42

Paketstrukturer Ramverk Komponenter Paketen är komponenter i systemet. Exempel: memory och program i Computer. Ramverk Systemet byggs genom att utvidga klassser 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 ä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. OMD 2012 F5-43 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? OMD 2012 F5-45 OMD 2012 F5-44 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; OMD 2012 F5-46

En grupp består av fyra studenter Dokumentation av MyList public class Group extends ArrayList<Student> { private static final int MAXSIZE = 4; De reviderade klasserna behöver knappast någon särskild dokumentation. MyList gör det: public boolean iscomplete() { return size() >= MAXSIZE; 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 get returnerar en lista med de grupper som har plats för ytterligare studenter. OMD 2012 F5-47 OMD 2012 F5-48