Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Relevanta dokument
Förra föreläsningen. Dagens agenda. Jojo-kort med två strategier Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Förra föreläsningen. Dagens agenda. Jojo-kort med två strategier Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

HT1 2013, FÖRELÄSNING

HT1 2015, FÖRELÄSNING

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

Objektorienterad modellering och design (EDAF25) Föreläsning 5. Repetition Grafer Traversering bredden först med kö

The billion dollar mistake

The billion dollar mistake

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

HT1 2013, FÖRELÄSNING 5

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

Föreläsning 2. Länkad lista och iterator

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

Föreläsning 2. Länkad lista och iterator

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

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

LÖSNINGSFÖRSLAG

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

HT1 2015, FÖRELÄSNING

Objektorienterad Programmering (TDDC77)

Tentamen i Objektorienterad modellering och design Helsingborg

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

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

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

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

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

LULEÅ TEKNISKA UNIVERSITET

Länkade strukturer. (del 2)

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

OOP Objekt-orienterad programmering

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

Tentamen Programmering fortsättningskurs DIT950

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

Tentamen i Objektorienterad modellering och design

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

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

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

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

Tentamen i Objektorienterad modellering och design Helsingborg

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

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

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Repetition av OOP- och Javabegrepp

Föreläsning 4 Innehåll

Information. Computer

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Samlingar Collection classes

Repetition av OOP- och Javabegrepp

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

HT1 2015, FÖRELÄSNING

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

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

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

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

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

TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

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

Generisk klass med typparameter Inre klass - ListIterator

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

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

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

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.

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

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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

2. Palindrom. Exempel: 1,2,3,2,1 är ett palindrom, och även 0, men inte 1,2,3,1,2,3.

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

DAT043 - Föreläsning 7

Tentamen i Objektorienterad modellering och diskreta strukturer

Collection Classes. bjectorienterad programmering Sida 1

Objektorienterad Programmering (TDDC77)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

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

Föreläsning 12. Länkade listor

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

Collection classes. Interface, första exempel. Interface (forts) Men först

Konstruktion av klasser med klasser

Föreläsning 3. Stack

Lösningar till tentamen i EDAF25

Transkript:

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2014, FÖRELÄSNING 4 Datavetenskap/LTH EDAF10/EDA061 HT2014 Ulf Asklund

Förra föreläsningen Designmönster: Command Composite Template Method Strategy UML: Objekt- och Sekvensdiagram Projektet Computer I pausen: Kursombud MEN ännu ingen som visat intresse L Projektgrupper

Dagens agenda Hur går övningarna? Projektgrupper klara?! Redovisningstid inbokad? Designmönster Strategy (exempel) Singleton Null object Facade Decorator ISP Interface Segregation Principle Muterbar vs. Ej muterbar Intro till Payroll

Jojo-kort med två strategier public class TravelCard { private Tariff tariff; public double price(int zones, Rebate rebate) { double amount = tariff.price(zones); return rebate.price(amount); public void settariff(tariff tariff) { this.tariff = tariff;

Två strategi-interface public interface Tariff { public double price(int zones); public interface Rebate { public double price(double price);

Två strategier public class Skane implements Tariff { public double price(int zones) { switch (zones) { case 1: return 17.0; default: return 7.0 * zones + 7.0; public class Family implements Rebate { public double price(double price) { return 1.5 *price;

Strategierna har inget tillstånd public final static Tariff SKANE = new Skane(); public final static Rebate DUO = new Family();... TravelCard jojo = new TravelCard(); jojo.settariff(skane); double price = jojo.price(3, DUO);

Template method eller Strategy? Båda mönstren kan användas för att eliminera duplicerad kod. Använd Template method när funktionaliteten skall vara den samma under objektets hela livstid. Använd Strategy när funktionaliteten skall kunna förändras under livstiden eller när det finns mer än en funktionalitet som kan variera.

Singleton Syfte: att det bara skall kunna skapas en instans av klass Hackerns favoritmönster

Konventionell Singleton public class Singleton { private static Singleton instance; // attributes omitted private Singleton() { // omissions public static Singleton instance() { if (instance == null) { instance = new Singleton(); return instance; // other methods omitted

Singleton Bieffekt av den konventionella implementeringen: instansen blir ett globalt åtkomligt objekt. Globala objekt är bekväma att använda men innebär i regel dålig design. På nästa övning skall vi implementera Singleton-mönstret utan att skapa globalt tillgängliga objekt.

Konventionell länkad lista public class Node { private Object object; private Node next; public class List { private Node first; public int length() { int length = 0; Node node = first; while (node!= null) { length++; node = node.next(); return length; NULL Detta är en maskerad form av instanceof. next()är en getter. Node saknar intelligens.

Den skyldige: Tony Hoare

Null Object Introduktionen av null i objektorienterade språk var ett fundamentalt misstag. null modellerar något som inte finns. Länkade listor och träd avslutas ofta med null. Null är inget objekt; att använda null för att representera ingenting är ett exempel på icke-objektorienterad programmering.

Null object Programkoden blir enklare om man istället använder ett riktigt objekt. Detta är ett exempel på mönstret Null Object. Objektorienterad beskrivning: En lista är antingen tom eller består av en nod med ett element som är ett Object och en svans som är en lista.

Objektorienterad representation public interface List { public int length(); public class Empty implements List { public int length() { return 0; public class Node implements List{ private Object object; private List tail; public int length() { return 1 + tail.length();

Objektorienterad listimplementering Man ersätter iteration med rekursion; det gör programmet logiskt enklare; testet av det logiska villkoret i while-satsen försvinner. I nästan alla sammanhang är det bra design att representera något som är tomt med ett riktigt objekt.

ISP - Segregation Interface Segregation Principle Classes should not be forced to depend on methods that they do not use.

Java.util.Collection public interface Collection<E> extends Iterable<E> { int size(); boolean isempty(); boolean contains(object o); Iterator<E> iterator(); Object[ ] toarray(); <T> T[ ] toarray(t[ ] a); boolean add(e e); boolean remove(object o); boolean containsall(collection<?> c); boolean addall(collection<? extends E> c); boolean removeall(collection<?> c); void clear(); boolean equals(object o); int hashcode();

Collection javadoc The destructive methods contained in this interface, that is, the methods that modify the collection on which they operate, are specified to throw UnsupportedOperationException if this collection does not support the operation. If this is the case, these methods may, but are not required to, throw an UnsupportedOperationException if the invocation would have no effect on the collection. For example, invoking the addall(collection) method on an unmodifiable collection may, but is not required to, throw the exception if the collection to be added is empty. [Josh Bloch, Neal Gafter]

Collection bryter mot ISP Alla som implementerar gränssnittet måste ha metoder som inte behöver fungera. Hur borde det se ut?

Hur borde det se ut? public interface Collection<E> extends Iterable<E> { int size(); boolean isempty(); boolean contains(object o); Iterator<E> iterator(); Object[ ] toarray(); <T> T[ ] toarray(t[ ] a); boolean containsall(collection<?> c); boolean equals(object o); int hashcode();

Hur borde det se ut? public interface ImmutableCollection<E> extends Collection<E> { public interface MutableCollection<E> extends Collection<E> { boolean add(e e); boolean remove(object o); boolean addall(collection<? extends E> c); boolean removeall(collection<?> c); void clear();

Vad tycker Josh och Neal? Jag tror att de håller med. De har skrivit en bok som visar att Java har många brister och konstigheter. Joshua Bloch, Neal Gafter: Java Puzzlers Traps, pitfalls, and corner cases. Addison-Wesley, 2005, ISBN 0-321-33678-X. Länk: www.javapuzzlers.com

Kort repetition

Integritetsprincipen Gör attribut, metoder och klasser så hemliga de går. Lämna inte ut representationen i onödan. En klass skall inte tillgång till klasser som den inte behöver. Begränsa synligheten genom att använda : private bara klassen kan se paketsynlighet, klasser i paketet kan se protected subklasser och klasser i paketet kan se. public hela världen kan se.

Exponera inte representationen Exponerad: public class Figure extends ArrayList<Shape> { public void paint(graphics graphics) { for (Shape shape : this) { shape.paint(graphics); Ej exponerad: public class Figure { private List<Shape> list = new ArrayList<Shape>(); public void paint(graphics graphics) { for (Shape shape : list) { shape.paint(graphics);

Exponera inte representationen, forts. Utlämnad representation: public class Figure { private List<Shape> list; public void paint(graphics graphics) { for (Shape shape : list) { shape.paint(graphics); public List<Shape> list() { return list;

(nästan) Förbud instanceof static getters Men det finns tillfällen när instanceof, static och getters är nödvändiga och det enda rätta:...

instanceof public final class Integer extends Number implements Comparable<Integer> { private final int value; public boolean equals(object object) { if(object instanceof Integer) { Integer other = (Integer) object; return value == other.value; return false; // omissions Här finns inget bättre sätt.

static public static main(string arg[]) public final static double PI public static double sin(double a) public class Outer { private static class Inner { Språkets design kräver static main. Ibland finns det inget tillhörande objekt. Inre klasser bör helst vara static.

getters Det finns ett exempel i Computer-projektet där en getter ger en bättre helhetsdesign. Observer-mönstret behöver i regel getters. Ibland måste man kompromissa när principerna drar åt olika håll.

Spekulativ design Fool me once shame on you Fool me twice shame on me. Skriv program som om förutsättningarna inte kommer att förändras. Om detta ändå sker så implementera abstraktioner som skyddar mot framtida förändringar av samma slag. Take the first bullet and protect yourself from the second bullet from the same gun.

Exempel Uppdragsgivaren vill ha en lista av Item-objekt:

Exempel, forts. Uppdragsgivaren vill senare ha en lista som innehåller Item1- objekt och Item2-objekt. Detta är första skottet; nu garderar vi oss mot ett liknande skott:

TANSTAAFL TANSTAAFL There ain t no such thing as a free lunch. (Martin, sidan 319) Att införa ett designmönster är inte gratis. Det måste finnas ett bra skäl att använda det. T ex så använder man inte strategimönstret om det inte finns minst två strategier.

Muterbart vs. Ej muterbart

Muterbara vs. Ej muterbara objekt Ett objekt vars tillstånd kan förändras kallas muterbart (mutable). När objektet modellerar någonting i verkligheten som har ett tillstånd som kan förändras så är det rimligt att modellen har samma egenskap.

Muterbara vs. Ej muterbara objekt, forts Ett objekt vars tillstånd inte kan förändras kallas omuterbart (immutable). När ett objektet modellerar någonting i verkligheten vars tillstånd inte kan förändras så är det rimligt att modellen har samma egenskap. Integer-objekt och String-objekt är omuterbara.

Exempel En omuterbar klass: public final class Num implements Expr { private int value; public value() { return value; En muterbar klass: public class Counter { private int counter; public increment() { counter++;

Recept för omutbarhet Klassen måste vara final. Attributen måste vara privata. Attributen får ej vara muterbara. Inga metoder får förända attribut. Fördelar: Säkrare Behöver ej kopieras, kan delas Enklare att resonera om

Aktivitet public final class SafeContainer { private final Object object; public SafeContainer(Object object) { this.object = object; public String tostring() { return object.tostring(); Är klassen muterbar?

Payroll - fallstudie

Systembeskrivning Vissa anställda arbetar på timbasis. Deras timlön finns i anställningsposten. De lämnar in tidkort med datum och antal timmar. Lönen utbetalas fredagar. Vissa anställda har fast lön som utbetalas sista vardagen varje månad. Vissa anställda med fast lön får också provision baserad på kvitton med datum och belopp med löneutbetalning varannan fredag. Lön utbetalas antingen via postanvisning till angiven adress, direkt till konto på bank, eller avhämtas på lönekontoret.

Systembeskrivning Vissa anställda tillhör fackföreningen. Deras anställningskort innehåller veckoavgift. Föreningen kan debitera serviceavgifter för enskilda medlemmar. Avgifter dras från nästa lön. Transaktioner till systemet behandlas en gång om dagen och uppdaterar en databas. Löneutbetalningar genereras varje avlöningsdag.

Användningsfall 1 Lägg till en ny anställd. 2 Ta bort en anställd 3 Registrera ett tidkort 4 Registrera ett försäljningskvitto 5 Registrera en föreningsavgift 6 Ändra anställningsinformation 7 Generera löneutbetalningar

Use case diagram

Use case diagram med arv

Martins bok övergripande design kapitel 18 i Martin Implementering kapitel 19 i Martin med C++. Implementering med Java i Payroll.zip via föreläsningssidan.

Databasen enligt Martin Databasen är en implementeringsdetalj. Moduler skall bero på abstraktioner (DIP). Definiera ett gränssnitt (API)!

Facade-mönstret Employee DB + get(int): Employee + put(int, Employee): Employee + remove(int): Employee Application Generic DB + <many generic methods> +

Designmönster - Facade

Databas implementering för testning public interface Database { public Employee put(int key, Employee employee); public Employee get(int key); public Employee remove(int key); public class TestDatabase implements Database { private Map<Integer, Employee> employees = new HashMap<Integer, Employee>(); public Employee get(int empid) { return employees.get(empid); public Employee remove(int empid) { return employees.remove(empid); public Employee put(int empid, Employee employee) { return employees.put(empid, employee);

Employee - Det finns tre sorters anställda Design utan eftertanke Vad är problemet?

Strategy Anställningsformen är en strategi

Employee

Decorator-mönstret Skånetrafiken vill få en lista på alla köp av biljetter under oktober. Standardautomaten: public interface PaySation { public double pay(travelcard travelcard, int zones); public StandardPayStation implements PayStation { private double sum; public double pay(travelcard travelcard, int zones) { double price = travelcard.price(zones); sum += price; return price;

Decorator-mönstret Den nya funktionaliteten: public LoggingPayStation implements PayStation { private PayStation paystation; private List<String> log; public LoggingPayStation(PayStation paystation, List<String> log) { this.paystation = paystation; this.log = log; public double pay(travelcard travelcard, int zones) { log.add(travelcard.tostring() + zones); return paystation.pay(travelcard, zones);

Loggningen kan göras dynamiskt PayStation standardpaystation = new StandardPayStation(); PayStation paystation = standardpaystation; I början av oktober lägger vi till loggningen: paystation = new LoggingPayStation(standardPayStation); I slutet av oktober tar vi bort den: paystation = standardpaystation; Tillståndet i standardpaystation bevaras.

Decorator-mönstret i Reader-klasserna reader = new BufferedReader(new FileReader(fileName)); public class BufferedReader extends Reader { private Reader in; // omissions

Decorator

Datavetenskap/LTH EDAF10/EDA061 HT2014 Ulf Asklund