The billion dollar mistake

Relevanta dokument
The billion dollar mistake

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

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

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ö

Tentamen i Objektorienterad modellering och design Helsingborg

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

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

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

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

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

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

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

Tentamen Programmering fortsättningskurs DIT950

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

Information. Computer

Tentamen i Objektorienterad modellering och design Helsingborg

LÖSNINGSFÖRSLAG

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

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

OOP Objekt-orienterad programmering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

TDDD78 Viktiga begrepp, del 2

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

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

DAT043 Objektorienterad Programmering

Alfabeten, strängar och språk. String

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Objektorienterad Programmering (TDDC77)

Tentamen i Objektorienterad modellering och design

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

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

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

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

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

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

10. Mängder och språk

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

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

F4. programmeringsteknik och Matlab

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

TENTAMEN OOP

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

Programmering A. Johan Eliasson

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

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

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

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

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

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

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

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

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

Objektorienterad Programmering (TDDC77)

Länkade strukturer. (del 2)

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Grammatik. BNF-grammatik

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

Föreläsning 3-4 Innehåll

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.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Laboration 2: Designmönster

Föreläsning 3: Booleans, if, switch

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

Repetition av OOP- och Javabegrepp

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

Repetition av OOP- och Javabegrepp

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Laboration 2: Designmönster

Tentamen i Objektorienterad modellering och diskreta strukturer

Lösningsförslag till tentamen

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

Objektorienterad programutveckling, fk

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

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

DAT043 - Föreläsning 7

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

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

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Transkript:

Misstaget som kostat 000 000 000 $ Objektorienterad modellering och diskreta strukturer / design Designmönster och fallstudier Lennart Andersson The billion dollar mistake Reviderad 200 09 08 200 OMD 200 F4- Den skyldige: Tony Hoare OMD 200 F4-2 Tony Hoare 3)%9+:)'"#;+<%=#%&)"+)+>.!"#$#%&'&()%*+,-.//+0##"#%2#$*+34#+5(//()%+6)//'"+7($&'8#,!"#$%!"#$%&'($)*++,"-*."$./*% V$("X>* X<6<7<!&'(!"0($.*,"2!33"4"5!33 )'8GA )*$#+&*,!"6--/,"7''8./?/+' ':/"'@ -./+"#$+!"9")*++"$&"8,"-$++$':4.'++*("8$%&*;/<"9&"=*%"&>/"$:?/:&$':"'@"&>/":A++ *+F'($& (/@/(/:)/"$:"BCD<"6&"&>*&"&$8/E"9"=*%"./%$F:$:F"&>/"@$(%&")'8G(/>/:%$?/"&,G/ %,%&/8"@'("(/@/(/:)/%"$:"*:"'-H/)&"'($/:&/."+*:FA*F/"I6JKLJ"MN<"O,"F'*+"=*%"&' #/"*+% /:%A(/"&>*&"*++"A%/"'@"(/@/(/:)/%"%>'A+."-/"*-%'+A&/+,"%*@/E"=$&>")>/);$:F G/(@'(8/."*A&'8*&$)*++,"-,"&>/")'8G$+/(<"PA&"9")'A+.:Q&"(/%$%&"&>/"&/8G&*&$':"&' G('F(* GA&"$:"*":A++"(/@/(/:)/E"%$8G+,"-/)*A%/"$&"=*%"%'"/*%,"&'"$8G+/8/:&<"R>$%">*%"+/. X'88 &'"$::A8/(*-+/"/(('(%E"?A+:/(*-$+$&$/%E"*:."%,%&/8")(*%>/%E"=>$)>">*?/"G('-*-+, &'"%G/ )*A%/."*"-$++$':".'++*(%"'@"G*$:"*:.".*8*F/"$:"&>/"+*%&"@'(&,",/*(%<"9:"(/)/:& G(')/%,/*(%E"*":A8-/("'@"G('F(*8"*:*+,%/(%"+$;/"S7T@$U"*:."S7T@*%&"$:"O$)('%'@&">*?/ -//:"A%/."&'")>/);"(/@/(/:)/%E"*:."F$?/"=*(:$:F%"$@"&>/(/"$%"*"($%;"&>/,"8*,"-/ :':4:A++<"O'(/"(/)/:&"G('F(*88$:F"+*:FA*F/%"+$;/"VG/)W">*?/"$:&('.A)/../)+*(*&$':%"@'(":':4:A++"(/@/(/:)/%<"R>$%"$%"&>/"%'+A&$':E"=>$)>"9"(/H/)&/."$: OMD 200 F4-3 BCD< " 3)%9+:)'"#;+<%=#%&)"+)+>.(28?)"&;+3."(%@+AB'"C+D(%%#" V$("X>*(+/%"6:&':,"7$)>*(."#'*(/"IR':,"#'*(/"'( X<6<7<"#'*(/E"-'(:"Y*:A*(,"E"B25N"$%"*"P($&$%> )'8GA&/("%)$/:&$%&E"G('-*-+,"-/%&";:'=:"@'("&>/./?/+'G8/:&"$:"BC3"'@"ZA$);%'(&"I'("#'*(/%'(&NE ':/"'@"&>/"='(+.Q%"8'%&"=$./+,"A%/."%'(&$:F *+F'($&>8%< #/"*+%'"./?/+'G/."#'*(/"+'F$)"@'("?/($@,$:F G('F(*8")'((/)&:/%%E"*:."&>/"@'(8*+"+*:FA*F/ X'88A:$)*&$:F"V/[A/:&$*+"S(')/%%/%"IXVSN"A%/. &'"%G/)$@,"&>/"$:&/(*)&$':%"'@")':)A((/:& G(')/%%/%"I$:)+A.$:F"&>/"\$:$:F"G>$+'%'G>/(% G('-+/8N"*:."&>/"$:%G$(*&$':"@'("&>/"L))*8"G('F(*88$:F"+*:FA*F/< OMD 200 F4-4

Abstract:!"#$#%&'&()%*+,-.//+0##"#%2#$*+34#+5(//()%+6)//'"+7($&'8#, Null Object 3)%9+:)'"#;+<%=#%&)"+)+>.(28?)"&;+3."(%@+AB'"C+D(%%#"!"#$%!"#$%&'($)*++,"-*."$./*% V$("X>*(+/%"6:&':,"7$)>*(."#'*(/"IR':,"#'*(/"'( X<6<7<"#'*(/E"-'(:"Y*:A*(,"E"B25N"$%"*"P($&$%>!&'(!"0($.*,"2!33"4"5!33 )'8GA&/("%)$/:&$%&E"G('-*-+,"-/%&";:'=:"@'("&>/./?/+'G8/:&"$:"BC3"'@"ZA$);%'(&"I'("#'*(/%'(&NE )*$#+&*,!"6--/,"7''8 ':/"'@"&>/"='(+.Q%"8'%&"=$./+,"A%/."%'(&$:F -./+"#$+!"9")*++"$&"8,"-$++$':4.'++*("8$%&*;/<"9&"=*%"&>/"$:?/:&$':"'@"&>/":A++ fundamentalt *+F'($&>8%< misstag. (/@/(/:)/"$:"BCD<"6&"&>*&"&$8/E"9"=*%"./%$F:$:F"&>/"@$(%&")'8G(/>/:%$?/"&,G/ #/"*+%'"./?/+'G/."#'*(/"+'F$)"@'("?/($@,$:F %,%&/8"@'("(/@/(/:)/%"$:"*:"'-H/)&"'($/:&/."+*:FA*F/"I6JKLJ"MN<"O,"F'*+"=*%"&' G('F(*8")'((/)&:/%%E"*:."&>/"@'(8*+"+*:FA*F/ /:%A(/"&>*&"*++"A%/"'@"(/@/(/:)/%"%>'A+."-/"*-%'+A&/+,"%*@/E"=$&>")>/);$:F X'88A:$)*&$:F"V/[A/:&$*+"S(')/%%/%"IXVSN"A%/. G/(@'(8/."*A&'8*&$)*++,"-,"&>/")'8G$+/(<"PA&"9")'A+.:Q&"(/%$%&"&>/"&/8G&*&$':"&' &'"%G/)$@,"&>/"$:&/(*)&$':%"'@")':)A((/:& GA&"$:"*":A++"(/@/(/:)/E"%$8G+,"-/)*A%/"$&"=*%"%'"/*%,"&'"$8G+/8/:&<"R>$%">*%"+/. &'"$::A8/(*-+/"/(('(%E"?A+:/(*-$+$&$/%E"*:."%,%&/8")(*%>/%E"=>$)>">*?/"G('-*-+, programmering. G(')/%%/%"I$:)+A.$:F"&>/"\$:$:F"G>$+'%'G>/(% G('-+/8N"*:."&>/"$:%G$(*&$':"@'("&>/"L))*8"G('F(*88$:F"+*:FA*F/< )*A%/."*"-$++$':".'++*(%"'@"G*$:"*:.".*8*F/"$:"&>/"+*%&"@'(&,",/*(%<"9:"(/)/:&,/*(%E"*":A8-/("'@"G('F(*8"*:*+,%/(%"+$;/"S7T@$U"*:."S7T@*%&"$:"O$)('%'@&">*?/ -//:"A%/."&'")>/);"(/@/(/:)/%E"*:."F$?/"=*(:$:F%"$@"&>/(/"$%"*"($%;"&>/,"8*,"-/ :':4:A++<"O'(/"(/)/:&"G('F(*88$:F"+*:FA*F/%"+$;/"VG/)W">*?/"$:&('.A)/../)+*(*&$':%"@'(":':4:A++"(/@/(/:)/%<"R>$%"$%"&>/"%'+A&$':E"=>$)>"9"(/H/)&/."$: BCD< " Introduktionen av null i objektorienterade språk var ett 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 OMD 200 F4-5 Konventionell länkad lista OMD 200 F4-6 Null object 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; Detta är en maskerad form av instanceof. Programkoden blir enklare om man istället använder ett riktigt objekt. Detta är ett exempel på mönstret Null Object. OMD 200 F4-7 OMD 200 F4-8

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 + tail.length(); OMD 200 F4-9 Objektorienterad listimplementering OMD 200 F4-0 Förbud (nästan) Man ersätter iteration med rekursion; det gör programmet logiskt enklare; testet av det logiska villkoret i while-satsen försvinner. ArrayList är nästan alltid bättre än länkade listor. I nästan alla andra sammanhang är det bra design att representera något som är tomt med ett riktigt objekt. instanceof static getters OMD 200 F4- OMD 200 F4-2

Men... instanceof Det finns tillfällen när instanceof, static och getters är nödvändiga och det enda rätta. 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 static OMD 200 F4-3 OMD 200 F4-4 getters public static main(string arg[]) public final static double PI Ge mig ett bra exempel! public static double sin(double a) OMD 200 F4-5 OMD 200 F4-6

Spekulativ design, Martin p. 05 Exempel 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. Uppdragsgivaren vill ha en lista av Item-objekt: ItemList * Item OMD 200 F4-7 Exempel Uppdragsgivaren vill ha en lista som innehåller Item-objekt och Item2-objekt. Detta är första skottet; nu garderar vi oss mot ett liknande skott: OMD 200 F4-8 Uttryck med variabler Vi har modellerat aritmetiska uttryck utan variabler: + 2 3 Nu vill uppdragsgivaren ha aritmetiska uttryck med variabler. ItemList * interface Item + x + x y Vi lägger till en klass för att representera en variabel: public class Variable implements Expr { private String name; Item Item2 public int value() { return??; OMD 200 F4-9 OMD 200 F4-20

Var skall variablernas värden finnas? Uttryck med variabler I variabeln eller i minnet? public class Variable implements Expr { private String name; public int value(map<string, int> map) { return map.get(name); public interface Expr { public int value(map<string, int> map); public class Add implements Expr { private Expr epr, expr2; public int value(map<string, int> map) { return expr.value(map) + expr2.value(map); OMD 200 F4-2 En enkel lampa, Martin p. 37 OMD 200 F4-22 Knapp och lampa En tryckknapp används för att tända och släcka en lampa. Enkel modell: public class Lamp { private boolean on=false; public void press() { on =! on; Dubbelt ansvar? public class Switch { private Lamp lamp; private boolean on=false; public void press() { if(on) { lamp.turnoff(); else { lamp.turnon(); on =! on; public class Lamp { public void turnon() public void turnoff() OMD 200 F4-23 OMD 200 F4-24

Abstract server-mönstret Adapter-mönstret public class Switch { private Switchable switchable; private boolean on=false; public void press() { if(on) { switchable.turnoff(); else { switchable.turnon(); on =! on; public interface Switchable { public void turnon(); public void turnoff(); public class Tool implements Switchable { public void turnon() public void turnoff() public interface Switchable { public void turnon(); public void turnoff(); public class Lamp { public void turnon() public void turnoff() public class LampAdapter implements Switchable { private Lamp lamp; public void turnon() { lamp.turnon(); public void turnoff() { lamp.turnoff(); OMD 200 F4-25 Adapter-mönstret med delegation eller arv OMD 200 F4-26 Martin: Via delegation public class LampAdapter implements Switchable { private Lamp lamp; public void turnon() { lamp.turnon(); public void turnoff() { lamp.turnoff(); Med arv public class LampAdapter extends Lamp implements Switchable { public void turnon() { super.turnon(); public void turnoff() { super.turnoff(); Payroll project OMD 200 F4-27 OMD 200 F4-28

Payroll: Systembeskrivning... Payroll:... 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. 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 och uppdaterar en databas och löneutbetalningar genereras varje arbetsdag. OMD 200 F4-29 Användningsfall OMD 200 F4-30 Use case diagram. 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 200 F4-3 OMD 200 F4-32

Arv i anva ndningsfall Oanva ndbart klassdiagram OMD 200 F4-33 Substantiv ansta lld tidkort vecka datum adress fackfo rening medlem databas OMD 200 F4-34 Payroll timbasis lo n ma nad belopp konto veckoavgift avgift timlo n fredag provision utbetalning bank ansta llningskort transaktion ansta llningspost vardag kvitto postanvisning lo nekontoret serviceavgift system I O vergripande design kapitel 8 i Martin I Implementering kapitel 9 i Martin med C++. I Implementering med Java i Martin.zip via fo rela sningssidan. Vilka substantiv a r centrala? OMD 200 F4-35 OMD 200 F4-36

Databasen enligt Martin Databas API Databasen är en implementeringsdetalj. Moduler skall bero på abstraktioner (DIP). Definiera ett gränssnitt (API)! public interface DataBase { public Employee put(int key, Employee employee); public Employee get(int key); public Employee remove(int key); OMD 200 F4-37 Databas Implementering OMD 200 F4-38 Designmönster Façade public class SimpleDatabase 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); OMD 200 F4-39 OMD 200 F4-40

Databasen enligt Martin 2 Databasen enligt Andersson Databasen används överallt. Den måste vara lätt åtkomlig. Det skall bara finnas en databas. Använd Singelton! Databasen används bara i en metod. Det är lätt att ge metoden tillgång till databasen. Det behövs en annan databas redan när man skall testa programmet. Använd inte Singelton! OMD 200 F4-4 Det finns tre sorters anställda OMD 200 F4-42 Användningfall: en timanställd blir löneanställd Design utan eftertanke: Vad är problemet? Man måste skapa ett nytt objekt och kopiera data från det gamla. Bättre design? Designmönster? OMD 200 F4-43 OMD 200 F4-44

Strategy AddEmployee Template method Anställningsformen är en strategi. OMD 200 F4-45 Employee OMD 200 F4-46 PayrollDate OMD 200 F4-47 OMD 200 F4-48

Klassdiagram: Associationer Modem-problemet, Martin p. 320 Bryter mot ISP. Varför? ren association riktad association aggregering Client Client50 interface Modem dial() hangup() send() receive() komposition Hayes Robotics Intel OMD 200 F4-49 Modem-problemet, Martin p. 320 Dedicated använder inte dial och hangup. OMD 200 F4-50 Modem-problemet, Martin p. 320 Ideal design Client Client50 interface Modem dial() hangup() send() receive() NoDial Modem NoDialClient Client Client50 interface Communication send() receive() interface Modem dial() hangup() Hayes Robotics Intel Hayes Robotics Intel NoDial Modem OMD 200 F4-5 OMD 200 F4-52