Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design



Relevanta dokument
The billion dollar mistake

The billion dollar mistake

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)

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

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

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

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

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

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

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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.

OOP Objekt-orienterad programmering

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

Tentamen i Objektorienterad modellering och design Helsingborg

Objektorienterad Programmering (TDDC77)

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

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

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

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

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

Lösningar till tentamen i EDAF25

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

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Objektorienterad Programmering (TDDC77)

Föreläsning 9: Arv och UML

Tentamen i Objektorienterad modellering och design Helsingborg

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

Konstruktion av klasser med klasser

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Tentamen i Objektorienterad modellering och design

LÖSNINGSFÖRSLAG

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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

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

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

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

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

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

Lösningsförslag till tentamen

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

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

LULEÅ TEKNISKA UNIVERSITET

Lösningsförslag övning 2.

Tentamen i Objektorienterad modellering och diskreta strukturer

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

Objektorienterad programmering i Java

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Repetition av OOP- och Javabegrepp

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

Språkkonventioner och redigering av tal.

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

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Repetition av OOP- och Javabegrepp

Tentamen. Grundläggande programmering i Java A 5p, DTAA

OOP Objekt-orienterad programmering

Objektsamlingar i Java

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Föreläsning 13 Innehåll

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

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

TENTAMEN OOP

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

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

TDDD78 Viktiga begrepp, del 2

10. Mängder och språk

DAT043 - Föreläsning 7

Tentamen för TTIT71 Programmering kl Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p)

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Information. Computer

Classes och Interfaces, Objects och References, Initialization

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

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

Outline. Objektorienterad Programmering (TDDC77) Laborationsserie del två. Vad händer under HT2. Introduktion HT2 UML.

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Föreläsning 10. ADT:er och datastrukturer

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

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

Klasshierarkier - repetition

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

Tentamen, EDA501 Programmering M L TM W K V

Tentamen i Objektorienterad modellering och diskreta strukturer

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

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Transkript:

Integritetsprincipen Objektorienterad modellering och diskreta strukturer / design Designmönster och fallstudier 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. Lennart Andersson Reviderad 2012 09 14 2012 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. [object finns inte i Java.] OMD 2012 F4-1 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); OMD 2012 F4-5 OMD 2012 F4-4 Exponera inte representationen Helt utelä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; OMD 2012 F4-6

Förbud (nästan) Men det finns undantag instanceof static getters Det finns tillfällen när instanceof, static och getters är nödvändiga och det enda rätta:... OMD 2012 F4-7 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 OMD 2012 F4-8 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. OMD 2012 F4-9 OMD 2012 F4-10

getters Spekulativ design, Martin p. 105 Det finns ett exempel i Computer-projektet där en getter ger en bättre helhetsdesign. Observer-mönstret behöver i regel getters. 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. Ibland måste man kompromissa när principerna drar åt olika håll. Take the first bullet and protect yourself from the second bullet from the same gun. OMD 2012 F4-11 Exempel OMD 2012 F4-12 Exempel Uppdragsgivaren vill ha en lista av Item-objekt: 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: ItemList * Item ItemList * interface Item Item1 Item2 OMD 2012 F4-13 OMD 2012 F4-14

Uttryck med variabler Vi har modellerat aritmetiska uttryck utan variabler: 1 + 2 3 Nu vill uppdragsgivaren ha aritmetiska uttryck med variabler. 1 + x + x y Vi lägger till en klass för att representera en variabel: public class Variable implements Expr { private String name; public int value() { return??; Var skall variablernas värden finnas? I variabeln eller i minnet? public class Variable implements Expr { private String name; public int value(map<string, Integer> map) { return map.get(name); public interface Expr { public int value(map<string, int> map); OMD 2012 F4-15 Uttryck med variabler OMD 2012 F4-16 Muterbara objekt public class Add implements Expr { private Expr epr1, expr2; public int value(map<string, int> map) { return expr1.value(map) + expr2.value(map); Klassen Num behöver inte map, men det skulle komplicera designen onödigt mycket om vi försöker förhindra det. 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. OMD 2012 F4-17 OMD 2012 F4-18

Ej muterbara objekt Variable En omuterbar klass: 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. 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++; OMD 2012 F4-19 Recept för omuterbarhet OMD 2012 F4-20 Fördelar med omuterbara objekt Klassen måste vara final. Attributen måste vara privata. Attributen får ej vara muterbara. Inga metoder får förända attribut. Säkrare Behöver ej kopieras, kan delas Enklare att resonera om OMD 2012 F4-21 OMD 2012 F4-22

Aktivitet Payroll: Systembeskrivning... public final class SafeContainer { private final Object object; public SafeContainer(Object object) { this.object = object; public String tostring() { return object.tostring(); Är klassen muterbar? Martin: Fallstudien Payroll 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. OMD 2012 F4-23 Payroll:... Systembeskrivning OMD 2012 F4-26 Användningsfall 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. 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 OMD 2012 F4-27 OMD 2012 F4-28

Use case diagram OMD 2012 Arv i anva ndningsfall F4-29 Oanva ndbart klassdiagram OMD 2012 F4-30 Substantiv ansta lld tidkort vecka datum adress fackfo rening medlem databas timbasis lo n ma nad belopp konto veckoavgift avgift avlo ningsdag timlo n fredag provision utbetalning bank ansta llningskort transaktion ansta llningspost vardag kvitto postanvisning lo nekontoret serviceavgift system Vilka substantiv a r centrala? OMD 2012 F4-31 OMD 2012 F4-32

Payroll Databasen enligt Martin 1 Övergripande design kapitel 18 i Martin Implementering kapitel 19 i Martin med C++. Implementering med Java i Payroll.zip via föreläsningssidan. Databasen är en implementeringsdetalj. Moduler skall bero på abstraktioner (DIP). Definiera ett gränssnitt (API)! OMD 2012 F4-33 Databas API OMD 2012 F4-34 Databas Implementering för testning public class TestDatabase implements Database { private Map<Integer, Employee> employees = new HashMap<Integer, Employee>(); public interface Database { public Employee put(int key, Employee employee); public Employee get(int key); public Employee remove(int key); 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); OMD 2012 F4-35 OMD 2012 F4-36

Designmönster Façade Databasen enligt Martin 2 interface Database + get(int): Employee + put(int, Employee): Employee + remove(int): Employee TestDatabase HashMap Databasen används överallt. Den måste vara lätt åtkomlig. Det skall bara finnas en databas. Slutsats: Använd Singleton! OMD 2012 F4-37 Databasen enligt Andersson OMD 2012 F4-38 Det finns tre sorters anställda Databasen används bara i en metod. Det är lätt att ge metoden tillgång till databasen. Det behövs olika databaser när man testar och använder i verkligheten. Design utan eftertanke: Employee - name: String - address: String - id: int Slutsats: Använd inte Singleton! SalaryEmployee HourlyEmployee CommissionEmployee OMD 2012 F4-39 OMD 2012 F4-40

Användningfall: en timanställd blir löneanställd Strategy Vad är problemet? Anställningsformen är en strategi. Om en timanställd blir löneanställd så måste man skapa ett nytt objekt och kopiera data från det gamla. Employee - name: String - address: String - id: int interface Classification Bättre design? Designmönster? SalaryClassification HourlyClassification CommissionClassification OMD 2012 F4-41 AddEmployee Template method OMD 2012 F4-42 Employee AddEmployeeTransaction - empid: int - name: String - address: String + execute(database) # paymentclassification(): PaymentClassification {abstract # schedule(): PaymentSchedule {abstract + build(string): Transaction AddHourlyTransaction - salary: double # paymentclassification() # schedule(): PaymentSchedule AddCommisionTransaction - salary: double - rate: double # paymentclassification() # schedule(): PaymentSchedule OMD 2012 F4-43 OMD 2012 F4-44

PayrollDate GregorianCalendar PayrollDate + PayrollDate(String) + between(payrolldate, PayrollDate): boolean + isfriday(): boolean + lastworkday(): PayrollDate + tostring(): String MonthlySchedule + ispayday(payrolldate): boolean + previouspayday(payrolldate): PayrollDate 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 return price; OMD 2012 F4-45 Decorator-mönstret OMD 2012 F4-46 Loggningen kan göras dynamiskt 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); 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. OMD 2012 F4-47 OMD 2012 F4-48

Decorator-mönstret i Reader-klasserna Decorator reader = new BufferedReader(new FileReader(fileName)); public class BufferedReader extends Reader { private Reader in; // omissions Reader 1 1 Abstraction Standard Decoration1 FileReader BufferedReader OMD 2012 F4-49 OMD 2012 F4-50 Aktivitet 23 List<String> list = new ArrayList<String>(); SafeContainer safecontainer = new SafeContainer(list); list.add( string ); Klassen Unkown är muterbar. OMD 2012 F4-51