Afstudeer presentatie: Solid design

38
Building your application SOLID Paul de Raaij | @pderaaij 2-2-2012

description

Presentatie gegeven tijdens verdediging van afstudeertraject. Afstuderen was in het kader van HBO opleiding Informatica aan de Haagse Hogeschool.

Transcript of Afstudeer presentatie: Solid design

Page 1: Afstudeer presentatie: Solid design

Building your application SOLID

Paul de Raaij | @pderaaij2-2-2012

Page 2: Afstudeer presentatie: Solid design

Student HHS

Page 3: Afstudeer presentatie: Solid design

Afstudeerder

Page 4: Afstudeer presentatie: Solid design

Korte introductie

• Afstuderen bij Eleven

Page 5: Afstudeer presentatie: Solid design

Toolbox

Page 6: Afstudeer presentatie: Solid design
Page 7: Afstudeer presentatie: Solid design

Formulierenmodule

Page 8: Afstudeer presentatie: Solid design

DESIGN

Page 9: Afstudeer presentatie: Solid design

SOLID software design

Page 10: Afstudeer presentatie: Solid design

SOLID Design

• Vijf essentiële principes• Geïntroduceerd door Robert C. Martin

Principles of Object-Oriented design

Page 11: Afstudeer presentatie: Solid design

Waarom SOLID design?

Page 12: Afstudeer presentatie: Solid design

Loosely coupled

Page 13: Afstudeer presentatie: Solid design

High cohesion

Page 14: Afstudeer presentatie: Solid design

Reusable

Page 15: Afstudeer presentatie: Solid design

Maintainable

Page 16: Afstudeer presentatie: Solid design

Testable

Page 17: Afstudeer presentatie: Solid design

Waar staat het voor

• Single Responsibility Principle• Open/Closed Principle• Liskov Substitution Principle• Interface Segregation Principle• Dependency Inversion Principle

Page 18: Afstudeer presentatie: Solid design

Single Responsibility Principle

Een klasse heeft maar één reden om te wijzigen

Page 19: Afstudeer presentatie: Solid design

Single Responsibility Principle

1. public class Employee {2.     public BigDecimal pay();3.     public String getFullName();4.     public float getWorkedHours();5. }

Page 20: Afstudeer presentatie: Solid design

Single Responsibility Principle

1. public class Employee {2.     public String getFullName();3. }4. 5.  public class Cashier {6.     public void pay(Employee e);7. }8. 9. public class EmployeeReporter {10.    public float getWorkedHours(Employee e);11.}

Page 21: Afstudeer presentatie: Solid design

Open/Closed principle

Entiteiten moeten gesloten zijn voor wijzigingen, maar open voor uitbreidingen

Page 22: Afstudeer presentatie: Solid design

Open/Closed principle

1. public class Musician {2.         public void playGuitar();3. }

Page 23: Afstudeer presentatie: Solid design

Open/Closed principle

1. public class Musician {2.         public void playGuitar();3.         public void playPiano();4. }

Page 24: Afstudeer presentatie: Solid design

Open/Closed principle1. public class Musician {2.         public void playInstrument(Instrument i);3. }4.  5. interface Instrument {6.         public void play();7. }8.  9. public class Guitar implements Instrument {10.        public void play();11.}12. 13.public class Piano implements Instrument {14.        public void play();15.}

Page 25: Afstudeer presentatie: Solid design

Liskov Substitution Principle

Functies die gebruik maken van een basis klasse moeten feilloos werken als een

afgeleide klasse wordt gebruikt

Page 26: Afstudeer presentatie: Solid design

Liskov Substitution Principle1. class Rectangle {2.         public int width;3.         public int height;4.  5.         public void setWidth(int w) {}6.         public void setHeight(int h) {}7.         public int getArea() { return h*w; }8. }9.  10. class Square extends Rectangle {11.      

  public void setWidth( int w ) { super.setWidth(w); super.setHeight(w); }12.      

  public void setHeight( int h ) { super.setWidth(h); super.setHeight(h); }13. }14.  15. class TestProgram {16.         Rectangle r = new Rectangle();17.         r.setWidth(5); r.setHeight(4);18.         r.getArea(); // returns 2019.  20.         Square s = new Square();21.         s.setWidth(5); s.setHeight(4);22.         s.getArea(); // returns 16;23. }

Page 27: Afstudeer presentatie: Solid design

Interface Segregation Principle

Functie-specifieke interfaces zijn beter dan één generieke interface

Page 28: Afstudeer presentatie: Solid design

Interface Segregation Principle

1. interface Animal {2.         public void bark();3.         public void fly();4.         public void run();5.         public void eatPlant();6.         public void eatMeat();7. }8.  9. public Dog implements Animal {10.        public void bark();11.        public void run();12.        public void eatPlant();13.        public void eatMeat();14.}15. 16.public Duck implements Animal {17.        public void fly();18.        public void eatPlant();19.}

Page 29: Afstudeer presentatie: Solid design

1. interface Barkable {2.         public void bark();3. }4.  5. interface Flyable {6.         public void fly();7. }8.  9. interface Runnable {10.         public void run();11. }12.  13. interface Herbivore() {14.         public void eatPlant();15. }16.  17. interface Carnivore() {18.         public void eatMeat();19. }20.  21. public Dog implements Barkable, Runnable, Herbivore, Carnivore {22.         public void bark();23.         public void run();24.         public void eatPlant();25.         public void eatMeat();26. }27.  28. public Duck implements Flyable, Herbivore {29.         public void fly();30.         public void eatPlant();31. }

Page 30: Afstudeer presentatie: Solid design

Dependency Inversion Principle

A) High level modules mogen niet afhankelijk zijn van low level modules, beide moeten afhangen van abstracties

B) Abstracties mogen niet afhangen van details, details moeten afhangen van abstracties

Page 31: Afstudeer presentatie: Solid design

Dependency Inversion Principle

1. class Band {2.         private Singer = new Singer();3.         private Musician = new Musician();4.  5.         public void playSong();6. }

Page 32: Afstudeer presentatie: Solid design

Dependency Inversion Principle

1. interface MusicalTalent {2.         public void useTalent();3. }4.  5. class Musician implements MusicalTalent() {}6. class Singer implements MusicalTalent() {}7. class SingingGuitarist implements MusicalTalent() {}8.  9. class Band {        10.        public void playSong( MusicalTalent mt ) {11. mt.useTalent();12. }13.}

Page 33: Afstudeer presentatie: Solid design

Dependency Inversion Principle

1. interface MusicalTalent {2.         public void useTalent();3. }4.  5. class Musician implements MusicalTalent() {}6. class Singer implements MusicalTalent() {}7. class SingingGuitarist implements MusicalTalent() {}8.  9. class Band {10.     

  private List<MusicalTalent> members = new ArrayList<MusicalTalent>();11.        public Band() {}12.        public void addMember( MusicalTalent mt ) {13.                members.add( mt );14.        }15. 16.        public void playSong() {}17.}

Page 34: Afstudeer presentatie: Solid design

SOLID

Page 35: Afstudeer presentatie: Solid design

Nooit alleen…

Page 36: Afstudeer presentatie: Solid design

… Sterk aan elkaar gekoppeld

Page 37: Afstudeer presentatie: Solid design

Perfect ontwerp bestaat niet

SOLID helpt debalans te vinden

Page 38: Afstudeer presentatie: Solid design