Design patterns Startbijeenkomst Harrie Passier
Docenten Sylvia Stuurman (1 e examinator) Sylvia.Stuurman@ou.nl Harrie Passier (2 e examinator) Harrie.Passier@ou.nl Aarzel niet vragen te stellen!
Rooster Activiteiten per week
Heel kort. Twee van de essenties van de cursus Design to an interface (or abstract class) Scheid creatie van een object van het gebruik Pagina 4
Design to an interface (or abstract class) 0..* 1 1 0..* Waarom niet zo? Een object Drawing moet nu precies weten van welke klasse de vorm is die getekend moet worden. Een object Drawing kan nu niet een lijst van figuren bijhouden, maar moet verschillende lijsten bijhouden.
Design to an interface (or abstract class) Drawing weet alleen dat het om een Figure gaat. Drawing heeft één lijst met figuren. Voordeel: gemakkelijk uitbreidbaar zonder Drawing aan te passen
Wat als Drawing moet nu weer weten of iets een Ellips is Mogelijk met een Cast, maar vermijden!!! Is lastig met uitbreiden als er meerdere subklassen komen met eigen methoden
Oplossing: ontwerp naar interfaces Polygon kan eventueel null of negatief getal teruggeven wanneer methode zinloos is Voordeel: Drawing hoeft niets te weten over de exacte klasse
Of ontwerp naar abstracte klasse Drawing (ook in de vorige oplossing): Open voor veranderingen bij Figure Gesloten voor veranderingen van Drawing Het open-closed principe
Open - closed Aan Drawing hoeft niets te veranderen tenzij Drawing de Figure objecten moet creëren! Daarom: Scheid creatie van objecten van gebruik Drawing gebruikt Figures Een FigureFactory creëert Figures
Factory methods public interface Trace { // Zet aan/uit public void setdebug( boolean debug ); // Schrijf debug message public void debug( String message ); // schrijf error message public void error( String message ); Pagina 11
Twee implementaties public class FileTrace implements Trace { public class SystemTrace implements Trace { private java.io.printwriter pw; private boolean debug; public FileTrace() throws { // Implementatie public void setdebug(boolean debug) { // Implementatie public void debug(string message) { // Implementatie public void error(string message) { // Implementatie private boolean debug; public void setdebug(boolean debug) { // Implementatie public void debug(string message) { // Implementatie public void error( String message ) { // Implementatie Pagina 12
Gebruik in code //... SystemTrace log = new SystemTrace(); //... log.debug( Start debugging"); //... Wat als we willen switchen van SystemTrace naar FileTrace? Wat als een nieuwe Trace wordt toegevoegd? Wat als deze code in tientallen/honderden klassen staat? Gaat in tegen het Open-Closed principe Pagina 13
Factory methods public class TraceFactory { public static Trace gettrace() { return new SystemTrace(); //... Trace log = new TraceFactory.getTrace(); //... log.debug("start debugging"); //... Pagina 14
Hoe doe je dit? Design patterns helpen met het bereiken van dit soort oplossingen in allerlei situaties Design patterns helpen om belangrijk principes in de gaten te houden Hoge cohesie, lage koppeling Open closed principe Ontwerp naar interfaces of abstracte klassen Scheid gebruik van objecten van creatie Flexibiliteit met het oog op toekomstige veranderingen hoofddoel van design patterns
Drie opdrachten Opdracht 1 (Individueel) Ontwerpen systeem voor referenties Opdracht 2 (In team van twee) Na inleveren van eerste opdracht teamgenoot zoeken (zie kalender) Team aanmelden, krijgt dan 2e opdracht Refactoring van JabberPoint Opdracht 3 (In zelfde team van twee) Toevoegen functionaliteit aan Jabberpoint Zal door refactoring gemakkelijker gaan dan zonder refactoring!
Academic writing Onderwerp: Schrijven van een wetenschappelijk artikel (plannen, literatuur bestuderen, schrijven, ) Of vervlochten met DP (zie rooster) Of apart na DP Hangt af van studietempo Pagina 17
Veel succes en plezier gewenst!!! Vragen?