Design patterns Startbijeenkomst Harrie Passier
Docenten Sylvia Stuurman (1e examinator)
[email protected]
Harrie Passier (2e examinator)
[email protected]
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) 1
1
0..*
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 } }
Pagina 12
private boolean debug; public void setDebug(boolean debug) { // Implementatie } public void debug(String message) { // Implementatie } public void error( String message ) { // Implementatie } }
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?