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

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

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

HT1 2015, FÖRELÄSNING

Seminarierna Instruktioner. Övningarna Viktiga relationer

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

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

Kursstruktur. Objektorienterad modellering och diskreta strukturer / design. Programmering utan OMD. Vad är Objektorienterad modellering?

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design. Vad är Objektorienterad modellering?

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

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Kursstruktur. Objektorienterad modellering och diskreta strukturer / design. Vad är Objektorienterad modellering? Programmering utan OMD

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design

EDAF10: Objektorienterad modellering och diskreta strukturer. EDA061: Objektorienterad modellering och design. Diskreta strukturer.

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

Tentamen i Objektorienterad modellering och design

Lösningar till tentamen i EDAF25

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

SOLID är en akronym för fem stycken designprinciper som används vid mjukvaruutveckling. SOLID står för:

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

Tentamen i Objektorienterad modellering och design Helsingborg

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

Föreläsning 13 Innehåll

Tentamen i Objektorienterad modellering och design Helsingborg

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Exempel på användning av arv: Geometriska figurer

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

Information. Computer

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

Sammanfattning och Tentamensinfo Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

4.7 Observatörsmönstret

Lösningar till tentamen i EDAF25

Tentamen i Objektorienterad modellering och diskreta strukturer

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design Alex Gerdes, 2018

Design Patterns. Objekt-orienterad programmering och design Alex Gerdes, 2016

Designmönster. Kapitel Kommandomönstret

Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?

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

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

Lösningsförslag. 1 Lösningsförslag. Uppgift 1

Introduktion och OO. Objekt-orienterad Programmering och Design (TDA552) Alex Gerdes, HT-2018

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

Övningsuppgifter i Objektorienterad modellering och design (OMD) Helsingborg EDAF25

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.

Föreläsning 5. När skall implementationsarv användas? The Open-Closed Principle (OCP) Liskov Substitution Principle (LSP)

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

Undantag, Sammanfattning och Tentamensinfo. Objekt-orienterad programmering och design Alex Gerdes, 2016

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad.

Föreläsning 5. När skall man använda implementationsarv?

Objektorienterad programmering (OOP) Föreläsning 15 & 16. Klasser för olika slags fordon. Klasser och objekt

Design Patterns. Objekt-orienterad programmering och design Alex Gerdes, 2018

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

Tentamen i Objektorienterad modellering och diskreta strukturer

Instuderingsuppgifter läsvecka 2

Föreläsning 12: Exempel och problemlösning

Lösningsförslag till tentamen

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

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

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:

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

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

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

1 Repetition av viktiga begrepp inom objektorienterad programmering

Introduktion. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

HT1 2013, FÖRELÄSNING 5

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

Tentamen i Objektorienterad modellering och design Helsingborg

Mål Förklaring av termer

Repetition av viktiga begrepp inom objektorienterad programmering

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

Mål Förklaring av termer

Design Patterns Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

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

Institutionen för TENTAMEN CTH HT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Länkade strukturer. (del 2)

Tentamen, EDAA20/EDA501 Programmering

Tentamen Programmering fortsättningskurs DIT950

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Introduktion till Datalogi DD1339. Föreläsning 3 29 sept 2014

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

Grammatik. BNF-grammatik

LÖSNINGSFÖRSLAG. Tentamen. Objektorienterad modellering och design. EDA665, 4 poäng

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Föreläsning 8. Designmönster

Transkript:

Kursombud Objektorienterad modellering och diskreta strukturer / design Designprinciper Lennart Andersson EDAF10 EDA061 Reviderad 2010 09 02 2010 OMD 2010 F2-1 Att göra Agile? OMD 2010 F2-2 Grupper för projekt Förbereda övning Göra eclipse-lab Agile Software Development? Agile betyder vig, lättrörlig eller anpasslig. På svenska: Modifierbar utveckling OMD 2010 F2-3 OMD 2010 F2-4

Lärobokens undertitel God praxis (Best practices) Principles, Patterns, and Practices Designa 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. 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) OMD 2010 F2-5 Design smells OMD 2010 F2-6 Designprinciper Stelhet (Rigidity) Designen är svår att modifiera Bräcklighet (Fragility) Designen tål inte modifiering Orörlighet (Immobility) Designen går inte att återanvända Seghet (Viscosity) Det är svårare att göra snygga ändringar än hack Spekulativ design (Needless Complexity) Duplicerad kod (Needless Repetition) Klipp & klistra orienterad programmering Oklarhet (Opacity) Obegriplig design SRP Single Responsibilty Principle OCP Open/Closed Principle DIP Dependency Inversion Principle LSP Liskov Substitution Principle ISP Interface Segregation Principle ALP Lokalitetsprincipen OMD 2010 F2-7 OMD 2010 F2-8

SRP Enkelt ansvar Brott mot SRP Single Responsibility Principle A class should have only one reason to change. (Martin) En klass med flera ansvarsområden ger bräcklighet. En klass utan ansvar är onödig. public static void generatecode(instruction c) { switch (c.opcode) { case 0: //MOV if (!(c.arg1 instanceof Current c.arg1 instanceof Next) &&!(c.arg2 instanceof Current c.arg2 instanceof Next)) { out.writebytes("mov " + code.convert(c.arg1) + ", " + code.convert(c.arg2) + "\n"); else if ((c.arg1 instanceof IntConst c.arg1 instanceof BoolConst) && c.arg2 instanceof Current) { out.writebytes("mov " + code.convert(c.arg1)+", "+ code.savetoreg(c.arg1) +"\n"); out.writebytes("set " + code.convert(c.arg2,staticlevel-1) +", " + code.savetoreg(c.arg2) +"\n"); out.writebytes("st " + code.savetoreg(c.arg1) + ", " + "[" + code.savetoreg(c.arg2) + "]\n"); else if((c.arg1 instanceof Temp) && c.arg2 instanceof Current) { out.writebytes("set " + code.convert(c.arg2,staticlevel-1) + ", " + code.savetoreg(c.arg2) +"\n"); out.writebytes("st " + code.savetoreg(c.arg1) + ", " + "[" + code.savetoreg(c.arg2) +"]\n"); else if(c.arg1 instanceof Current && c.arg2 instanceof Temp) { out.writebytes("set " + code.convert(c.arg2) + ", " + code.savetoreg(c.arg2) +"\n"); out.writebytes("ld " + "["+ code.savetoreg(c.arg2) +"]" + ", " + code.savetoreg(c.arg1) +"\n"); else if(c.arg1 instanceof Current && c.arg2 instanceof Current) { if(!(c.arg1.tostring().equals(c.arg2.tostring()))) { out.writebytes("set " + code.convert(c.arg1,staticlevel-1) + ", "+ code.savetoreg(c.arg2) +"\n"); OMD 2010 F2-9 Vilka ansvarsområden? OMD 2010 F2-10 Aktivitet Gör en bättre design! Kodgenerering för MOV instruktionen... OR instruktionen Current operander Temp operander... OMD 2010 F2-11 OMD 2010 F2-12

OCP Öppen och sluten Dålig design: Circle, Square Open/Closed Principle Classes should be open for extension and closed for modification. (Meyer) Det skall vara möjligt att lägga till ny kod utan att modifiera gammal. public class Circle { int radius; int x, y; public Circle(int radius, int x, int y) { this.radius = radius; this.x = x; this.y = y; Square är analog. OMD 2010 F2-13 Dålig design: Figure public class Figure extends ArrayList { public Figure() { add(new Square(4, 1, 1)); add(new Circle(4, 2, 2)); public void draw() { for (Object object: this) { if (object instanceof Square) { drawsquare((square) object); else { drawcircle((circle) object);... OMD 2010 F2-14 Dålig design: Figure public class Figure {... private static void drawcircle(circle circle) { // TODO Implement method private static void drawsquare(square square) { // TODO Implement method OMD 2010 F2-15 OMD 2010 F2-16

Dålig design UML med ArrayList OMD 2010 F2-17 Bra design: Circle OMD 2010 F2-18 Bra design: Shape public class Circle implements Shape { private int radius; private int x, y; public void paint(graphics graphics) { // TODO Auto-generated method stub public interface Shape { public void paint(grahpics graphics); OMD 2010 F2-19 OMD 2010 F2-20

Bra design: Figure Bra design public class Figure extends ArrayList<Shape> { public void paint(graphics graphics) { for (Shape shape : list) { shape.paint(graphics); OMD 2010 F2-21 LSP Substitutionsprincipen OMD 2010 F2-22 Brott mot LSP Liskov Substitution Principle Subtypes must be substitutable for their base types. Subklasser skall implementeras så att de hanteras korrekt även när änvändarenbara känner till en superklass. public class IntPair { private int i1,i2; public boolean equals(object object) { IntPair other = (intpair) object; return i1==other.i1 && i2==other.i2; Klassen 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. OMD 2010 F2-23 OMD 2010 F2-24

Brott mot LSP 2 class Rectangle { int width, height; int x, y; int getwidth() { return width; void setwidth() { this.width = width; void setheight() { this.height = height; int area() { return height*width; OMD 2010 F2-25 DIP Bero på abstraktioner A Square is a Rectangle class Square extends Rectangle { Square(int side) { super(side, side); void setwidth(int side) { // identical setheight width = side; height = side; void testrectangle(rectangle rectangle) { rectangle.setwidth(2); rectangle.setheight(3); assertequal(6, rectangle.area()); testrectangle(new Square(1)) // reports error OMD 2010 F2-26 Dependency Inversion Dependency Inversion Principle High level classes should not depend on low level classes; both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions. UML-pilar skall gå mot gränssnitt och abstrakta klasser. OMD 2010 F2-27 OMD 2010 F2-28

ISP Segregation Brott mot ISP Interface Segregation Principle Classes should not be forced to depend on methods that they do not use. OMD 2010 F2-29 Enligt ISP OMD 2010 F2-30 Designmönster Command Composite OMD 2010 F2-31 OMD 2010 F2-32

Command Command användning List<Command> commandlist = new ArrayList<Command>(); commandlist.add(new PenDown()); commandlist.add(new Move(1, 0)); commandlist.add(new Move(0, 1)); commandlist.add(new Move(-1, 0)); commandlist.add(new Move(0, -1)); commandlist.add(new PenUp()); for (Command command : commandlist) { command.execute(); OMD 2010 F2-33 Command med undo OMD 2010 F2-34 Command fördelar public interface Command { public void execute(); public void undo(); Separation i tiden mellan konstruktion och exkvering av kommandon Separation i rummet mellan konstruktion och exekvering av kommandon Historielista Undo OMD 2010 F2-35 OMD 2010 F2-36

Composite Composite enklare public class Macro implements Command { private List<Command> commandlist = new ArrayList<Command>(); public void add(command command) { commandlist.add(command); public void execute() { for (Command command : commandlist) { command.execute(); public class Macro extends ArrayList<Command> implements Command { public void execute() { for (Command command : this) { command.execute(); OMD 2010 F2-37 OMD 2010 F2-38 Composite användning Macro macro = new Macro(); macro.add(new PenDown()); macro.add(new Move(2, 0)); macro.add(new Move(0, 2)); macro.add(new Move(-2, 0)); macro.add(new Move(0, -2)); macro.add(new PenUp()); macro.execute(); new Move(1, 1).execute(); macro.execute(); OMD 2010 F2-39