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

Relevanta dokument
HT1 2013, FÖRELÄSNING 5

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

HT1 2015, FÖRELÄSNING

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

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

Seminarierna Instruktioner. Övningarna Viktiga relationer

Lösningar till tentamen i EDAF25

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

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.

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

4.7 Observatörsmönstret

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

HT1 2015, FÖRELÄSNING

Projekt 2 XL. Observer-mönstret

Information. Computer

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

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

DAT043 - Föreläsning 7

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

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

LULEÅ TEKNISKA UNIVERSITET

Tentamen i Objektorienterad modellering och diskreta strukturer

LÖSNINGSFÖRSLAG

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

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

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

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

HT1 2013, FÖRELÄSNING 6

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

Föreläsning 15: Repetition DVGA02

Lösningsförslag till tentamen

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Länkade strukturer. (del 2)

Tentamen i Objektorienterad programmering

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

DAT043 Objektorienterad Programmering

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

DAT043 - föreläsning 8

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

Tentamen i Objektorienterad modellering och design Helsingborg

Tentamen i Objektorienterad programmering

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

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

Föreläsning 3. Stack

Lösningar för tenta 3 DAT043,

Lösningsförslag till exempeltenta 2

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

Laboration 24 Databasen MySQL och java

Designmönster/Design patterns

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Objektorienterad programutveckling, fk

Laboration 3 GUI-programmering

TENTAMEN OOP

Malmö högskola 2008/2009 CTS

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

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

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

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

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

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

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Tentamen i Objektorienterad modellering och design

Föreläsning REPETITION & EXTENTA

Tentamen i Objektorienterad modellering och design Helsingborg

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

Tentamen FYTA11 Javaprogrammering

12. Relationer och funktioner

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

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

Tentamen i Objektorienterad programmering E

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Lösningsförslag till tentamen

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

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Datastrukturer. föreläsning 3. Stacks 1

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:

Laboration 13, Arrayer och objekt

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

Modulär design. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

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

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

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Den som bara har en hammare tror att alla problem är spikar

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Modulär design Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Transkript:

Dagens program Objektorienterad modellering och diskreta strukturer / design Fler mönster och Paketdesign Lennart Andersson Model View Control Observer Paketdesign Namngivning Reviderad 2011 09 12 2011 OMD 2011 F5-1 Model/View/Control-arkitektur OMD 2011 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 2011 F5-6 OMD 2011 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 2011 F5-8 Observer OMD 2011 F5-9 Observable Finns i java.util Finns i java.util public interface Observer { public void update(observable observable, Object object); 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 OMD 2011 F5-10 OMD 2011 F5-11

Observer mönstret Model public class Model extends Observable { private int state; public void changestate() { state++; setchanged(); notifyobservers(); public String state() { return String.valueOf(state); View OMD 2011 F5-12 OMD 2011 F5-13 java.util.observable... 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. public class Observable { private boolean changed = false; private Vector<Observer> list = new Vector<Observer>(); public synchronized void addobserver(observer o) { if (!list.contains(o)) { list.add(o); protected synchronized void setchanged() { changed = true;... OMD 2011 F5-14 OMD 2011 F5-15

... java.util.observable Något förenklad: public class Observable { private boolean changed = false; private Vector<Observer> list = new Vector<Observer>(); public void notifyobservers() { notifyobservers(null); public synchronized void notifyobservers(object arg) { if (!changed) { return; changed = false; for (Observer observer: list) { observer.update(this, arg); OMD 2011 F5-16 Observer, update-argument MVC med Observer 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. OMD 2011 F5-17 update(observable,...) public interface Observer { public void update(observable observable, Object object); Observable kan användas för att komma åt modellen. När man anropar notifyobservers(object) i modellen kommer update(observable, Object) att anropas i alla observatörer. 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. Vad skall man använda argumenten till? OMD 2011 F5-18 OMD 2011 F5-19

update(..., object) Designprincip för Observer.update Object kan användas för att skicka information från modellen till vyn. Hur kan modellen veta vad vyn vill ha? Det kan den inte veta. Undvik att använda parametrarna. Det kan finnas flera observatörer som vill veta olika saker. Hur skall informationen förpackas? Det finns ingen naturlig plats att dokumentera förpackningen. OMD 2011 F5-20 Designprinciper för paket OMD 2011 F5-21 Reuse-release equivalence principle, REP Sammanhangsprinciper (cohesion) Reuse-release equivalence principle Common reuse principle Common closure principle Stabilitetsprinciper Acyclic dependencies principle Stable dependencies principle Stable abstractions 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. Principen säger något om storleken på paketet. OMD 2011 F5-22 OMD 2011 F5-23

Common reuse principle Common closure 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. 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 påverkar många andra klasser i paketet och inga klasser utanför paketet. Exempel: Instruktionerna i Computer. OMD 2011 F5-24 Stabilitetsprinciper OMD 2011 F5-25 Paketberoenden i Computer Paket skall ej vara cykliskt beroende. Beroenden skall gå mot stabila paket. Stabila paket skall vara abstrakta. OMD 2011 F5-26 OMD 2011 F5-27

Cykelproblem 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 2011 F5-28 Utan cykel OMD 2011 F5-29 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 instabilitet C e I = 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. e står för afferent (inåtriktad). Om I = 0 för alla paket i systemet så är det inget system. OMD 2011 F5-30 OMD 2011 F5-31

Stabilitetsmetrik 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 2011 F5-32 Paketstrukturer OMD 2011 F5-33 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 2011 F5-34 OMD 2011 F5-35

Namngivning Bra namngivning är fundamental för att göra program begripliga. public class MyList { private List<int[]> thelist; Det handlar om projektgrupper I vilka grupper finns det plats för ytterligare studenter? public class Groups { private List<Group> groups; public List<int[]> getlist() { List<int[]> list = new ArrayList<int[]>(); for (int[] is : thelist) { if (is[0] < 4) { list.add(is); return list; public List<Group> incompletegroups() { List<Group> list = new ArrayList<Group>(); for (Group group : groups) { if (group.isincomplete()) { list.add(group); return list; OMD 2011 F5-36 En grupp består av fyra studenter OMD 2011 F5-37 Dokumentation av MyList public class Group extends ArrayList<Student> { private static final int MAXSIZE = 4; public boolean isincomplete() { 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 2011 F5-38 OMD 2011 F5-39

Namngivning av klasser Ett klassnamn är normalt ett substantiv hämtat från uppdragsgivarens beskrivning eller den verklighet som programmet modellerar. Namnet inleds med en versal och följs av gemener. På engelska använder man versal i början på varje ord när namnet är sammansatt. OMD 2011 F5-40 Namngivning av gränssnitt Namngivning av klasser Konstruera inte klasser som bäst beskrivs med namn som slutar på Handler, Controller, Manager och liknande. De indikerar ofta dålig design. Builder och Parser kan vara helt OK för en fabrik. Undvik namn som Item, Element, Value och Data om det inte handlar om generiska typer. Undvik att inkludera representationstypen i namnet om typen bara förekommer i ett attribut. class StringList extends ArrayList<String> är OK, medan class StringArray { private String string []; \\ omissions inte är det. OMD 2011 F5-41 Namngivning av metoder Samma principer som för klassnamn. Namn på gränssnitt används oftare än namn på konkreta klasser; därför är det viktigare att dessa namn är bra. Undvik att indikera att det handlar om gränssnitt som i ITree TreeInterface. Hierarkien som i List, AbstractList och ArrayList är bra när alla nivåerna behövs. Metodnamn inleds med en gemen och följande ord i sammansatta namn med versal. Metoder som förändrar objektets tillstånd bör ha ett verb som namn. Metoder som inte förändrar objektets tillstånd bör ha ett substantiv som namn eller inledas med is om de implementerar ett predikat. Namn som inleds med set och get bör reserveras för de tillfällen då det handlar om att sätta och hämta attribut. OMD 2011 F5-42 OMD 2011 F5-43

Namngivning av attribut, lokala variabler och parametrar Ett attribut kan ofta ha samma namn som sin typ, fast med inledande gemen. Om det finns flera attribut av samma typ som används på samma sätt kan man numrera dem: Expr expr1, expr2; När en variabel används som index i en array använder man gärna konventionella namn som i och j. För strängar använder man gärna namn som indikerar användningen: String title; Använd inte the som ett prefix i attributnamn. När det behövs är this. det självklara alternativet. OMD 2011 F5-44