HT1 2015, FÖRELÄSNING

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

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

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

Seminarierna Instruktioner. Övningarna Viktiga relationer

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

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

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

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

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

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

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

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

Grafer. Objektorienterad modellering och design (EDAF25) Föreläsning 2. Grafer. Grafer Traversering Djupet först. Agenda. Grafer

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

Information. Computer

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

Tentamen i Objektorienterad modellering och design Helsingborg

Tentamen i Objektorienterad modellering och design

Lösningar till tentamen i EDAF25

Lösningar till tentamen i EDAF25

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

Föreläsning 13 Innehåll

4.7 Observatörsmönstret

Tentamen i Objektorienterad modellering och design Helsingborg

Tentamen i Objektorienterad modellering och diskreta strukturer

UML: Exempel. Ett modelleringsspråk. UML: Ansvar. UML: tre huvudanvändningar. Exempel: En klass position storlek. UML Unified Modelling Language

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

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

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

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

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

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

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

Objektorienterad analys och design

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

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

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

Objekt-orienterad utveckling. Objektorienterad analys och design. Objekt-orienterad programutveckling. Objekt-orienterad analys och design: Litteratur

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

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

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

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

Designmönster. Kapitel Kommandomönstret

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

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

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

Abstrakta Klasser 2. Kodning är bara en liten del i programvaruutvecklingen 6% 1% 6% Abstrakta Klasser - deklaration. Programutveckling sker i faser

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

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

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

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

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

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

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

Tentamen Programmering fortsättningskurs DIT950

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

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

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

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

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

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

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

Exempel på användning av arv: Geometriska figurer

Objekt-orienterad utveckling. Objektorienterad analys och design. Objekt-orienterad programutveckling. Objekt-orienterad analys och design: Litteratur

Grammatik. BNF-grammatik

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, 2016

Instuderingsuppgifter läsvecka 2

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

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

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:

LÖSNINGSFÖRSLAG

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen i Objektorienterad modellering och design Helsingborg

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Föreläsning 15: Repetition DVGA02

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

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

Arv (Inheritance) Multipelt arv finns i verkligheten. Överskuggning, metodbindning. Läsanvisning: ! Arv! Object, instanceof! Relationer!

Konstruktion av klasser med klasser

Mer OOP. Variation i typ. Medlen repetition. Generiska klasser. Gränssnitt - Interface. Mer om klasser Några exempel UML

" «Observable» DataGenerator" betyder att klassen DataGenerator ärver från den abstrakta klassen Observable.

1 Repetition av viktiga begrepp inom objektorienterad programmering

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

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

OCTOPUS utvecklingsmetod samt relaterade frågeställningar och diagram

LULEÅ TEKNISKA UNIVERSITET

Transkript:

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2015, FÖRELÄSNING 2 Förra föreläsningen Kursens upplägg och tidsbudget Mål & Syfte med kursen Substantivmetoden Designprinciper Abstraktion Modularisering Integritet Lokalisering UML klassdiagram Ulf Asklund 1

Dagens agenda Aritmetiska uttryck Design smells Design Principer Mönster Arkitektur (Metodik, Practicies) Refaktorisera UML O-O Eclipse Paket Klass Abstrakt klass Arv Gränssnitt Java Statisk metod Abstrakt metod Objekt Metod Virtuell metod Attribut Statiskt attribut Metodanrop Dynamisk bindning Virtulla metoder, polyformism UML (snabb repetition) Unified Modeling Language Booch, Rumbaugh, Jacobson, slutet av 90 talet Många läroböcker och verktyg Industristandard Ulf Asklund 2

Diagram Funktionell modell Användningsfall (Use cases) Statisk modell Klassdiagram, Objektdiagram Dynamisk modell Sekvensdiagram, Tillståndsdiagram Ett klassdiagram Ulf Asklund 3

Klasser Abstrakta klasser och gränssnitt Ulf Asklund 4

Generalisering Realisering Ulf Asklund 5

Parametriserade klasser Associationer class Company{ Person employee; Ulf Asklund 6

Aggregering och sammansättning Beroende interface Observer { Object update(observable observable, Object object); Ulf Asklund 7

Aktivitet - Aritmetiska 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. Lösning 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. Expr Num Add Sub Mul Div Ulf Asklund 8

Lösning 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. Expr Num Add Sub Mul Div Lösning 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. <<interface>> Expr Num Add Sub Mul Div Ulf Asklund 9

Lösning 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. <<interface>> Expr +value():int Num Add Sub Mul Div Expr och Num public class Num implements Expr { private int value; public Num(int value) { this.value = value; public int value() { return value; Ulf Asklund 10

Lösning 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. <<interface>> Expr +value():int Num - value:int Add Sub Mul Div Aktivitet (gjorde vi förra föreläsningen) Implementera Add! public class Add implements Expr { private Expr expr1, expr2; public int value() { return expr1.value() + expr2.value(); Ulf Asklund 11

Lösning public class Add implements Expr { private Expr expr1, expr2; public int value() { return expr1.value() + expr2.value(); <<interface>> Expr +value():int Num - value:int Add Sub Mul Div Att göra OBS! Föreläsningarna i OMD på måndagar kl 15-17 flyttade från MA:2 till Kårhusets Hörsal (schemat uppdaterat). Gäller ej föreläsningarna i diskreta strukturer. Välja övningsgrupp i SAM. Förbereda övningen. Bilda grupper för projekt och anmäla i SAM. Mingel i pausen. Ulf Asklund 12

Lärobokens undertitel Principles, Patterns, and Practices Design smells 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 Ulf Asklund 13

Design smells, forts. Spekulativ design (Needless Complexity) Duplicerad kod (Needless Repetition) Klipp & klistra orienterad programmering Onödiga getters (Needless Getters) Brott mot ALP Oklarhet (Opacity) Obegriplig design God praxis 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. 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) Ulf Asklund 14

Utvecklingsmodellen Extreme Programming, XP Berättelser (stories) Korta iterationer Testa först Parprogrammering Enkel design Ständig refaktorisering Agile Software Development Agile betyder vig, rörlig, kvick eller anpasslig. På svenska vanligen: lättrörlig Programutveckling i grupp, HT2 för D2, valbar för CEFPi Designprinciper ALP Lokalitetsprincipen SRP Single Responsibilty Principle OCP Open/Closed Principle DIP Dependency Inversion Principle LSP Liskov Substitution Principle (kommer senare) ISP Interface Segregation Principle (kommer senare) Ulf Asklund 15

Exempel på dålig design public class CompetitionHandler { // or TotalComputation private Competition competition;... starttime = competition.getraces()[i].getresults()[j]. getstarttime().getseconds(); endtime = competition.getraces()[i].getresults()[j]. getendtime().getseconds(); competition.getraces()[i].getresults()[j].getresults()[j]. settotaltime(endtime starttime); Fortfarande dålig public class CompetitionHandler { private Competition competition;... result = competition.getraces()[i]. getresults()[j];... starttime = result.getstarttime().getseconds(); endtime = result.getendtime().getseconds(); result.settotaltime(endtime starttime); Ulf Asklund 16

Lokalitetsprinicpen! Mycket bättre: public class Competition {... private ArrayList<Race> races; public void computetotal() { for(race race: races ) { race.computetotal(); som delegerar arbetet till den klass som vet allt om Race: Race Mycket bättre: public class Race {... private ArrayList<Result> results; public void computetotal() { for(result result: results) { result.computetotal(); som delegerar till den klass som vet allt om Result: Ulf Asklund 17

Result Mycket bättre: public class Result {... private Competitor competitor; private Time starttime, endtime, totaltime; public void computetotal() { totaltime = endtime.difference(starttime); som delegerar till experten på tidsberäkningar: Time SRP Enkelt svar 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. Ulf Asklund 18

Time har bara ett ansvarsområde public class Time implements Comparable<Time> { private int sec; public Time difference(time other) public int compareto(time other) public String tostring() public Time(String time) Result har flera public class Result { private String firstname, lastname; private String idnumber; private int starttime, endtime; public String fullname() private boolean checkidnumber() public int totaltime() { return endtime starttime; Ulf Asklund 19

Delegera ansvaren! public class Result { private Name name; private IdNumber idnumber; private Time start, end; public String fullname() { return name.tostring(); public Time total() { return end.difference(start); GenerateCode har massor av ansvar 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 ); Ulf Asklund 20

Vilka ansvarsområden? Kodgenerering för: MOV instruktionen... OR instruktionen Current operander Temp operander... OCP Öppen/sluten-principen Open/Closed Principle Classes should be open for extension and closed for modification. (Meyer) Det skall vara möjligt att lägga till ny funktionalitet utan att modifiera existerande kod. Ulf Asklund 21

Expr-klasserna tillämpar Open/Closed-principen Man kan lägga till nya uttryck utan att ändra något i de gamla. Man kan lägga till Sub, Mul och Div. Dålig design: Circle, Square 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. Ulf Asklund 22

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); 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 Ulf Asklund 23

Dålig design Bra design: Circle & Shape & Figure 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); public class Figure extends ArrayList<Shape> { public void paint(graphics graphics) { for (Shape shape : list) { shape.paint(graphics); Ulf Asklund 24

Bra design DIP Bero på abstraktion 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. Ulf Asklund 25

Dependency Inversion Designmönster Command Composite Ulf Asklund 26

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(); Ulf Asklund 27

Command med undo public interface Command { public void execute(); public void undo(); Command fördelar Man delegerar arbetet till klasser med enkelt ansvar. Separation i tiden mellan konstruktion och exekvering av kommandon Historielista Undo Ulf Asklund 28

Kompositmönstret (Composite) Ni kommer ihåg Command Ulf Asklund 29

Ni kommer ihåg Comand Nu med Composite Composite 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(); Ulf Asklund 30

Composite - enklare public class Macro extends ArrayList<Command> implements Command { public void execute() { for (Command command : this) { command.execute(); men med sämre integritet. 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(); Ulf Asklund 31

Expr har Composite-struktur Objektdiagram Ulf Asklund 32

Objektdiagram (1 + 2) + 3 Sekvensdiagram Ulf Asklund 33

Sekvensdiagram Aktivitet (1 + 2) + 3 Visa beräkning av (1 + 2) + 3 i ett sekvensdiagram. Ulf Asklund 34

Sekvensdiagram Ulf Asklund 35