Objektorienterad modellering och design (EF25) Föreläsning 2 Traversering genda jupetförsttraversering Inför Lab 2 Objektorienterad modellering Övning modellering Introduktion till designprinciper tt jobba med denna och nästa vecka: Läs de 6 första kapitlen i Martins bok. Laboration 1 redovisas på fredag 20/1 Laboration 2 och Övning 1 redovisas nästa onsdag 25/1 jupet först 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. 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. Man kan endast komma till noder som kan nås från startnoden. et betyder att om grafen har flera komponenter så kommer man bara att besöka alla noder i startnodens komponent. EF25 (F2) VT 2017 1 / 45 Traversering jupet först EF25 (F2) VT 2017 2 / 45 Traversering jupet 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) B B 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? E Noder : B: : : E: Bågar 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. E Noder : B: : : E: Bågar EF25 (F2) VT 2017 3 / 45 EF25 (F2) VT 2017 4 / 45
Laboration 2 Laboration 2 5. 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. 1 Undersök om en oriktad graf är sammanhängande. 2 Räkna antalet komponenter i en graf. 3 vgör om det finns en väg mellan två noder. 4 Hitta en väg mellan två noder. 5 Generalisering B E En klass med följande metoder införs: public class VertexVisitor<V,E> { public boolean isone() { return false; public void previsit(graph.vertex<v,e> v) { public void postvisit(graph.vertex<v,e> v){ EF25 (F2) VT 2017 5 / 45 Laboration 2 5. Generalisering EF25 (F2) VT 2017 6 / 45 Laboration 2 5. Generalisering en 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.isone()) { 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); FS + dfs(vertex, VertexVisitor) PathVisitor - done: boolean - destination: Vertex + isone(): boolean + previsit(vertex) VertexVisitor + isone(): boolean + previsit(vertex) + postvisit(vertex) ountingvisitor - count: int + previsit(vertex) EF25 (F2) VT 2017 7 / 45 EF25 (F2) VT 2017 8 / 45
Introduktion till objektorienterad modellering Vid en motorcykeltävling registreras start- och sluttider på filer med följande format. StartNr Starttid StartNr Sluttid 1 12.00.00 3 13.05.06 2 12.01.00 2 13.15.16 3 12.02.00 1 13.23.34 Ett sorteringsprogram läser filerna och producerar följande resultat. StartNr Totaltid Starttid Sluttid 1 1.23.34 12.00.00 13.23.34 2 1.14.16 12.01.00 13.15.16 3 1.03.06 12.02.00 13.05.06 Introduktion till objektorienterad modellering Ett förslag... public class Time implements omparable<time> { private int sec; public Time(String time) public Time difference(time other) public int compareto(time other) public String tostring() Konstruera en klass, Time, som kan användas för att representera tider i start- och resultatlistor. Vilka attribut och metoder behövs? EF25 (F2) VT 2017 9 / 45 Introduktion till objektorienterad modellering EF25 (F2) VT 2017 10 / 45 Introduktion till objektorienterad modellering Punkt med dålig design... 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... och sträcka 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); EF25 (F2) VT 2017 11 / 45 EF25 (F2) VT 2017 12 / 45
OM esignprinciper OM esignprinciper 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); public class Segment { private Point point0, point1; public double length() { return point1.distanceto(point0); EF25 (F2) VT 2017 13 / 45 OM esignprinciper EF25 (F2) VT 2017 14 / 45 OM esignprinciper Nytt krav: Vi vill kunna implementera 3-punkter också. Vi skapar ett interface. public interface Point { public double distanceto(point other); 2-punkter 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); EF25 (F2) VT 2017 15 / 45 EF25 (F2) VT 2017 16 / 45
OM esignprinciper OM esignprinciper 3-punkter 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 bstraktion Modularisering Inkapsling Integritet skydda representationen Lokalisering implementera operationer där operanderna finns delegation Tips: Undvik getters! EF25 (F2) VT 2017 17 / 45 God praxis enligt Martin EF25 (F2) VT 2017 18 / 45 Utvecklingsmodellen gile esigna ej på spekulation, dvs för saker som kanske inte kommer att användas. Gör om designen när den inte längre är bra. Refaktorisering. Optimera inte programmet förrän du konstaterat att det är nödvändigt. Producera ingen dokumentation om den inte behövs genast och är betydelsefull. (Martin) gile Software evelopment gile betyder vig, rörlig, kvick eller anpasslig. På svenska vanligen: lättrörlig EF25 (F2) VT 2017 19 / 45 EF25 (F2) VT 2017 20 / 45
Utvecklingsmodellen Traditionell vs iterativ Utvecklingsmodellen Extreme Programming, XP Traditionell Krav esign Implemen tation Iterativ Test Krav esign Implementation Test Berättelser (stories) Korta iterationer kontinuerlig integrering Testa först (T) Parprogrammering Enkel design Ständig refaktorisering XP Ett exempel på en gil praxis. et finns många! EF25 (F2) VT 2017 21 / 45 Utvecklingsmodellen T EF25 (F2) VT 2017 22 / 45 ktivitet Test på olika nivåer (enhetstest, acceptanstest) T -> testsvit för regressionstest T -> designperspektiv på utvecklingen public void testmove() { WumpusGame g = new WumpusGame; g.connect(4,5,"e"); g.setplayerroom(4); T g.east(); assertequals(5, g.getplayerroom()); Refaktorisering Röd ritmetiska uttryck Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. Modellera aritmetiska uttryck med substantivmetoden och förse klasserna med en metod som beräknar uttryckets värde. Grön Martin s.24 EF25 (F2) VT 2017 23 / 45 EF25 (F2) VT 2017 24 / 45
ktivitet ktivitet ritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. ritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. Expr Num dd Expr Sub Mul iv Num dd Sub Mul iv EF25 (F2) VT 2017 25 / 45 ktivitet EF25 (F2) VT 2017 26 / 45 ktivitet ritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. ritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. <<interface>> Expr <<interface>> Expr +value():int Num dd Sub Mul iv Num dd Sub Mul iv EF25 (F2) VT 2017 27 / 45 EF25 (F2) VT 2017 28 / 45
ktivitet ktivitet Expr och Num ritmetiska uttryck - lösning Ett aritmetiskt uttryck är antingen ett tal eller en addition, multiplikation, subtraktion eller division av två uttryck. public interface Expr { public int value(); public class Num implements Expr { private int value; public int value() { return value; «interface» Expr + value(): int Num - value: int EF25 (F2) VT 2017 29 / 45 ktivitet Num EF25 (F2) VT 2017 30 / 45 ktivitet Implementera dd Num behöver en standardkonstruerare public class Num implements Expr { private int value; public Num(int value) { this.value = value; public int value() { return value; Standardkonstruerare visas ej i fortsättningen. «interface» Expr + value(): int Num - value: int + Num(int) public class dd implements Expr { private Expr expr1, expr2; public int value() { return expr1.value() + expr2.value(); - expr1: Expr - expr2: Expr ktivitet: nvänd konstruerarna i de olika implementationerna av Expr för att skapa en instans av uttrycket 1*2+3 (T) dd EF25 (F2) VT 2017 31 / 45 EF25 (F2) VT 2017 32 / 45
ktivitet Expr Exempel UML Uttryck Instans av Expr 1 new Num(1); 1+2 new dd(new Num(1),new Num(2)); 1+2*3 new dd(new Num(1), new Mul(new Num(2), new Num(3)); 1*2+3 new dd(new Mul(new Num(1), new Num(2)), new Num(3)); 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 Olika användning - olika detaljnivå Skiss Specifikation Programmeringsspråk EF25 (F2) VT 2017 33 / 45 UML EF25 (F2) VT 2017 34 / 45 iagram Funktionell modell nvändningsfall (Use cases) Statisk modell Klassdiagram, Objektdiagram ynamisk modell Sekvensdiagram, Tillståndsdiagram EF25 (F2) VT 2017 35 / 45 EF25 (F2) VT 2017 36 / 45
Klasser bstrakta klasser och gränssnitt EF25 (F2) VT 2017 37 / 45 Generalisering EF25 (F2) VT 2017 38 / 45 Realisering EF25 (F2) VT 2017 39 / 45 EF25 (F2) VT 2017 40 / 45
Parametriserade klasser ssociationer EF25 (F2) VT 2017 41 / 45 ggregering och sammansättning EF25 (F2) VT 2017 42 / 45 ggregering och sammansättning Kommer ni ihåg... «interface» Expr 2 + value():int public class dd implements Expr { private Expr expr1, expr2; public int value() { return expr1.value() + expr2.value(); dd - expr1: Expr - expr2: Expr EF25 (F2) VT 2017 43 / 45 EF25 (F2) VT 2017 44 / 45
Beroende EF25 (F2) VT 2017 45 / 45