Objektorienterad modellering och design (EDAF25) Grafer Grafer
Transcription
Objektorienterad modellering och design (EDAF25) Grafer Grafer
Objektorienterad modellering och design (EDAF25) Grafer Föreläsning 2 Traversering Agenda Djupet först Grafer Vid djupet-först-traversering av en graf utgår man från en startnod och följer varje väg så långt det går innan man backar tillbaka och följer nästa väg. Djupetförsttraversering Inför Lab 2 Objektorienterad modellering Övning modellering Introduktion till designprinciper UML – klassdiagram Man använder rekursion för att gå igenom noderna. Man markerar noder som besökta när man har besökt dem, varje nod har ett booleskt attribut visited som används för detta. Att göra denna och nästa vecka: Laboration 2 redovisas på fredag! Man kan endast komma till noder som kan nås från startnoden. Det betyder att om grafen har flera komponenter så kommer man bara att besöka alla noder i startnodens komponent. Läs Martin 7-9,11 Egen laboration Eclipse/UML EDAF25 (F2) VT 2015 1 / 43 EDAF25 (F2) Grafer Grafer Traversering – Djupet först Traversering – Djupet först dfs(v) markera v som besökt för alla bågar e som utgår från noden v: w = noden i andra änden av e om inte w är besökt dfs(w); dfs(g) markera alla noder i grafen som obesökta for varje nod v i grafen om v inte är besökt dfs(v) A B VT 2015 A B D D C C E I vilken ordning besöks noderna om startnoden är B? Vad behöver vi lägga till för att samtliga noder ska besökas? EDAF25 (F2) Noder A: B: C: E För att besöka samtliga noder i en graf med djupet-först-teknik kan vi behöva göra upprepade anrop av metoden dfs(v) ovan tills alla noder är besökta. Bågar D A C A D D: E: 2 / 43 Noder A: B: C: VT 2015 3 / 43 EDAF25 (F2) A C A D D: E: C Bågar D C VT 2015 4 / 43 Grafer Grafer Laboration 2 Laboration 2 – D5. Generalisering Sammanhängande graf En oriktad graf är sammanhängade om det för varje par av noder gäller att det finns en väg (en serie bågar) mellan noderna. public class VertexVisitor<V,E> { public boolean isDone() { return false; } D1 Undersök om en oriktad graf är sammanhängande. D2 Räkna antalet komponenter i en graf. D3 Avgör om det finns en väg mellan två noder. En klass med följande metoder införs: A public void preVisit(Graph.Vertex<V,E> v) {} B D public void postVisit(Graph.Vertex<V,E> v){} } C E D4 Hitta en väg mellan två noder. D5 Generalisering EDAF25 (F2) VT 2015 5 / 43 EDAF25 (F2) Grafer Grafer Laboration 2 – D5. Generalisering Laboration 2 – D5. Generalisering Den generella varianten av djupetförstgenomgång utgående från en nod v får en extra parameter av typen VertexVisitor: public static <V,E> void dfs(Graph.Vertex<V,E> v, VertexVisitor<V,E> visitor) { if (visitor.isDone()) { return; } visitor.preVisit(v); v.visit(); for (Graph.Edge<V,E> e : v) { Graph.Vertex<V,E> w = e.destination(); if (!w.isVisited()) { dfs(w,visitor); } } visitor.postVisit(v); VT 2015 6 / 43 VT 2015 8 / 43 VertexVisitor DFS + dfs(Vertex, VertexVisitor) + isDone(): boolean + preVisit(Vertex) + postVisit(Vertex) PathVisitor - done: boolean - destination: Vertex + isDone(): boolean + preVisit(Vertex) CountingVisitor - count: int + preVisit(Vertex) } EDAF25 (F2) VT 2015 7 / 43 EDAF25 (F2) Introduktion till objektorienterad modellering Introduktion till objektorienterad modellering Vid en motorcykeltävling registreras start- och sluttider på filer med följande format. StartNr 1 2 3 Starttid 12.00.00 12.01.00 12.02.00 StartNr 3 2 1 Sluttid 13.05.06 13.15.16 13.23.34 Ett förslag ... public class Time implements Comparable<Time> { private int sec; public Time(String time) public Time difference(Time other) public int compareTo(Time other) public String toString() } Ett sorteringsprogram läser filerna och producerar följande resultat. StartNr 1 2 3 Totaltid 1.23.34 1.14.16 1.03.06 Starttid 12.00.00 12.01.00 12.02.00 Sluttid 13.23.34 13.15.16 13.05.06 Konstruera en klass, Time, som kan användas för att representera tider i start- och resultatlistor. Vilka attribut och metoder behövs? EDAF25 (F2) VT 2015 VT 2015 10 / 43 VT 2015 12 / 43 Introduktion till objektorienterad modellering Punkt med dålig design ... ... och sträcka public class Point { private double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public void setX(double x) { this.x = x; } public double getX() { return x; } // omissions EDAF25 (F2) EDAF25 (F2) 9 / 43 Introduktion till objektorienterad modellering public class Segment { private Point point0, point1; // Standard constructor omitted public double length() { double dx = point1.getX()--point0.getX(); double dy = point1.getY()--point0.getY(); return Math.sqrt(dx*dx+dy*dy); } } VT 2015 11 / 43 EDAF25 (F2) OMD – Designprinciper OMD – Designprinciper Redesign Redesign public class Point { private double x, y; public double distanceTo(Point other) { double dx = this.x - other.x; double dy = this.y - other.y; return Math.sqrt(dx*dx + dy*dy); } } EDAF25 (F2) public class Segment { private Point point0, point1; public double length() { return point1.distanceTo(point0); } } VT 2015 13 / 43 OMD – Designprinciper EDAF25 (F2) VT 2015 14 / 43 VT 2015 16 / 43 OMD – Designprinciper 2D-punkter Nytt krav: Vi vill kunna implementera 3D-punkter också. public class Point2d implements Point { private double x, y; public double distanceTo(Point point) { Point2d other = (Point2d) point; double dx = this.x - other.x; double dy = this.y - other.y; return Math.sqrt(dx*dx + dy*dy); } } Vi skapar ett interface. public interface Point { public double distanceTo(Point other); } EDAF25 (F2) VT 2015 15 / 43 EDAF25 (F2) OMD – Designprinciper OMD – Designprinciper Anderssons lokalitetsprincip, ALP 3D-punkter Operationer skall implementeras där operanderna är lättast tillgängliga. Recept: Undvik getters! public class Point3d implements Point { private double x, y, z; public double distanceTo(Point point) { Point3d other = (Point3d) point; double dx = this.x - other.x; double dy = this.y - other.y; double dz = this.z - other.z; return Math.sqrt(dx*dx + dy*dy + dz*dz); } } Övergripande designprinciper Abstraktion Modularisering Integritet – skydda representationen Lokalisering – implementera operationer där operanderna finns EDAF25 (F2) VT 2015 EDAF25 (F2) 17 / 43 God praxis enligt Martin VT 2015 18 / 43 VT 2015 20 / 43 Utvecklingsmodellen Agile Designa ej på spekulation, dvs för saker som kanske inte kommer att användas. Agile Software Development Gör om designen när den inte längre är bra. Refaktorisering. Agile betyder vig, rörlig, kvick eller anpasslig. Optimera inte programmet förrän du konstaterat att det är nödvändigt. På svenska vanligen: lättrörlig Producera ingen dokumentation om den inte behövs genast och är betydelsefull. (Martin) EDAF25 (F2) VT 2015 19 / 43 EDAF25 (F2) Utvecklingsmodellen Objekorienterad modellering Extreme Programming, XP Aktivitet Berättelser (stories) Aritmetiska uttryck Korta iterationer Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. kontinuerlig integrering XP Testa först (TDD) Ett exempel på en Agil praxis. Det finns många! Parprogrammering Modellera aritmetiska uttryck med substantivmetoden och förse klasserna med en metod som beräknar uttryckets värde. Enkel design Ständig refaktorisering EDAF25 (F2) VT 2015 21 / 43 EDAF25 (F2) VT 2015 Objekorienterad modellering Objekorienterad modellering Aktivitet Aktivitet 22 / 43 Aritmetiska uttryck - lösning Aritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. EDAF25 (F2) Expr Num Add Sub Mul Div Expr Num VT 2015 23 / 43 EDAF25 (F2) Add Sub Mul Div VT 2015 24 / 43 Objekorienterad modellering Objekorienterad modellering Aktivitet Aktivitet Aritmetiska uttryck - lösning Aritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. <<interface>> <<interface>> Expr Expr Num Add EDAF25 (F2) Sub +value():int Mul Div VT 2015 Num 25 / 43 Add Sub Mul Div EDAF25 (F2) Objekorienterad modellering Objekorienterad modellering Aktivitet Aktivitet – Expr och Num VT 2015 26 / 43 VT 2015 28 / 43 Aritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. EDAF25 (F2) VT 2015 27 / 43 «interface» public interface Expr { public int value(); } + value(): int public class Num implements Expr { private int value; public int value() { return value; } } - value: int EDAF25 (F2) Expr Num Objekorienterad modellering Objekorienterad modellering Aktivitet – Num Aktivitet – Implementera Add Num behöver en standardkonstruerare «interface» public class Num implements Expr { private int value; public Num(int value) { this.value = value; } public int value() { return value; } } «interface» Expr Expr + value(): int public class Add implements Expr { private Expr expr1, expr2; public int value() { return expr1.value() + expr2.value(); } } Num - value: int + value(): int Add - expr1: Expr - expr2: Expr + Num(int) Standardkonstruerare visas ej i fortsättningen. EDAF25 (F2) VT 2015 EDAF25 (F2) 29 / 43 Objekorienterad modellering Objekorienterad modellering Aktivitet – Expr Exempel UML Uttryck 1 1+2 1+2*3 1*2+3 Instans av Expr new Num(1); new Add(new Num(1),new Num(2)); new Add(new Num(1), new Mul(new Num(2), new Num(3)); new Add(new Mul(new Num(1), new Num(2)), new Num(3)); VT 2015 30 / 43 VT 2015 32 / 43 Unified Modeling Language Visuell representation av ett system under utveckling Booch, Rumbaugh, Jacobson, slutet av 90–talet Många läroböcker och verktyg Industristandard EDAF25 (F2) VT 2015 31 / 43 EDAF25 (F2) Objekorienterad modellering Objekorienterad modellering UML UML – klassdiagram Diagram Funktionell modell – Användningsfall (Use cases) Statisk modell – Klassdiagram, Objektdiagram Dynamisk modell – Sekvensdiagram, Tillståndsdiagram EDAF25 (F2) VT 2015 33 / 43 EDAF25 (F2) UML – klassdiagram UML – klassdiagram Klasser Abstrakta klasser och gränssnitt EDAF25 (F2) VT 2015 35 / 43 EDAF25 (F2) VT 2015 34 / 43 VT 2015 36 / 43 UML – klassdiagram UML – klassdiagram Generalisering Realisering EDAF25 (F2) VT 2015 37 / 43 EDAF25 (F2) UML – klassdiagram UML – klassdiagram Parametriserade klasser Associationer EDAF25 (F2) VT 2015 39 / 43 EDAF25 (F2) VT 2015 38 / 43 VT 2015 40 / 43 UML – klassdiagram UML – klassdiagram Aggregering och sammansättning Aggregering och sammansättning Kommer ni ihåg ... public class Add implements Expr { private Expr expr1, expr2; public int value() { return expr1.value() + expr2.value(); } } EDAF25 (F2) VT 2015 41 / 43 VT 2015 43 / 43 UML – klassdiagram Beroende EDAF25 (F2) EDAF25 (F2) «interface» Expr + value(): int Add - expr1: Expr - expr2: Expr VT 2015 42 / 43