esempio open closed

977 views

Published on

Un semplice esempio di open closed principle, con riferimenti a design by contract, liskov substitutin principle, equals, considerazioni e riferiment

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
977
On SlideShare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

esempio open closed

  1. 1. Open Closed T. software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification
  2. 2. Esempio <ul><li>Una particolare classe semplice (Naturali, ovvero numeri interi positivi) </li></ul>
  3. 3. Esempio <ul><li>Una particolare classe semplice (Naturali, ovvero numeri interi positivi)
  4. 4. Ipotizziamo alcune soluzioni </li></ul>
  5. 5. Esempio <ul><li>Una particolare classe semplice (Naturali, ovvero numeri interi positivi)
  6. 6. Ipotizziamo alcune soluzioni
  7. 7. Ipotizziamo una estensione (del dominio) </li></ul>
  8. 8. Esempio <ul><li>Una particolare classe semplice (Naturali, ovvero numeri interi positivi)
  9. 9. Ipotizziamo alcune soluzioni
  10. 10. Ipotizziamo una estensione (del dominio)
  11. 11. Quale soluzione tra quelle proposte è “Open Closed” (ovvero consente l'estensione senza necessitare di modifiche)? </li></ul>
  12. 12. Dominio? <ul><li>gestisco denaro contante (quindi solo positivi) </li></ul>
  13. 13. @Pre(&quot;@value>=0&quot;) // dbc framework Contract4j public Natural(int value) { this.value=value; } public Natural(int value) { if (value<0) { throw new InitException(&quot;non negativo: &quot;+value); } this.value=value; } oppure: Costruttore
  14. 14. Aspettative @Test public void zeroEqualsZero() { Natural zero = new Natural(0); Natural anotherZero = new Natural(0); Assert.assertEquals(zero,anotherZero); }
  15. 15. Soluzione 1 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass () != o. getClass ()) return false; Natural natural = (Natural) o; if (value != natural.value) return false; return true; } @Override public int hashCode() { return value; }
  16. 16. Soluzione 2 @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Natural)) return false; Natural natural = (Natural) o; if (value != natural.value) return false; return true; } @Override public int hashCode() { return value; }
  17. 17. Aspettative @Test public void zeroEqualsZero() { Natural zero = new Natural(0); Natural anotherZero = new Natural(0); Assert.assertEquals(zero,anotherZero); } Soluzione 1. equals con getClass() OK Soluzione 2. equals con instanceof OK
  18. 18. Estensione <ul><li>Valori negativi </li></ul>
  19. 19. “sì alle estensioni! no alle modifiche!” public class Relative extends Natural { @Pre // precondizione rilassata public Relative(int value) { this.value = value; } .... }
  20. 20. “sì alle estensioni! no alle modifiche!” public class Relative extends Natural { @Pre // precondizione rilassata public Relative(int value) { this.value = value; } .... } La precondizione è rilassata. Preconditions cannot be strengthened in a subtype. (Postconditions cannot be weakened in a subtype.)
  21. 21. Correlazioni-osservazioni <ul><li>Natural super classe di Relative </li></ul>
  22. 22. Correlazioni-osservazioni <ul><li>Natural super classe di Relative
  23. 23. Natural sotto insieme di Relative (o, che è lo stesso, è isomorfo ad un suo sottoinsieme) </li></ul>
  24. 24. Correlazioni-osservazioni <ul><li>Natural super classe di Relative
  25. 25. Natural sotto insieme di Relative (o, che è quasi lo stesso, è isomorfo ad un suo sottoinsieme)
  26. 26. Morfismo : (astrazione di un processo che trasforma una struttura astratta in un'altra mantenendo alcune caratteristiche &quot;strutturali&quot; della prima (wikipedia)) </li></ul>
  27. 27. Correlazioni-osservazioni <ul><li>Natural super classe di Relative
  28. 28. Natural sotto insieme di Relative (o, che è quasi lo stesso, è isomorfo ad un suo sottoinsieme)
  29. 29. Morfismo : (astrazione di un processo che trasforma una struttura astratta in un'altra mantenendo alcune caratteristiche &quot;strutturali&quot; della prima (wikipedia))
  30. 30. “Is A” != “sottoClasse di” (ricordate “Quadrato-Rettangolo”?) </li></ul>
  31. 31. Concretamente @Test public void testMixEquals() throws Exception { Natural unoNat = new Natural(1); Relative unoRel = new Relative(1); Assert.assertEquals(unoNat,unoRel); } Soluzione 1. equals con getClass() fallisce Soluzione 2. equals con instanceof va a buon fine
  32. 32. Concretamente @Test public void testMixEquals() throws Exception { Natural unoNat = new Natural(1); Relative unoRel = new Relative(1); Assert.assertEquals(unoNat,unoRel); } Sto sostituendo all'1 di Nat, l'1 di Rel (Liskov?)
  33. 33. if S is a subtype of T, then objects of type T in a program may be replaced with objects of type S without altering any of the desirable properties of that program What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T. L.S.P. Varie definizioni
  34. 34. Nuova estensione public class ColoredRelative extends Relative { public static String NEUTRO=&quot;neutro&quot;; public static String GRIGIO=&quot;grigio&quot;; public static String NERO=&quot;nero&quot;; private static String DEFAULT=NEUTRO; protected String colore=DEFAULT; public ColoredRelative(int value) { super(value); } ...
  35. 35. Violazione transitività @Test public void testTransViolation() throws Exception { Relative due = new Relative(2); ColoredRelative dueNeuter = new ColoredRelative(2); ColoredRelative dueNero = new ColoredRelative(2,ColoredRelative.NERO); Assert.assertFalse(dueNero.equals(dueNeuter)); Assert.assertEquals(due,dueNeuter); Assert.assertEquals(due,dueNero); }
  36. 36. Soluzione 3 <ul><li>Equals...
  37. 37. http://www.angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/Equals.html </li></ul>
  38. 38. Conclusione <ul><li>Un costruttore non vuoto protected
  39. 39. Equals “non standard” (a slices) </li></ul>
  40. 40. Evoluzione su (L.S.P) <ul><li>Sostituibilità come “uguale comportamento” (e niente questioni di “equals”)
  41. 41. Distinzione tra metodi osservativi e metodi modificativi (tramite annotations)
  42. 42. Sollecitare l'oggetto della classe padre sui suoi metodi che ne modificano lo stato
  43. 43. Verificare che la stessa sollecitazione su oggetti di sottoclasse verifichi lo stesso comportamento “visibile” (observers) </li></ul>
  44. 44. Evoluzione (equals) <ul><li>Equivalenza (uguaglianza) cross-classing in senso più esteso (esempio: tra implementazioni differenti ma “uguali” di numeri complessi: forma polare e forma cartesiana) </li></ul>nz
  45. 45. Links <ul><li>www.objectmentor.com/resources/articles/ocp.pdf
  46. 46. http://www.artima.com/weblogs/viewpost.jsp?thread=4744
  47. 47. http://www.artima.com/intv/bloch17.html
  48. 48. http://www.objectmentor.com/resources/articles/lsp.pdf
  49. 49. http://www.angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/Equals-2.html </li></ul>

×