Open Closed T. software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification
Esempio Una particolare classe semplice (Naturali, ovvero numeri interi positivi)
Esempio Una particolare classe semplice (Naturali, ovvero numeri interi positivi)
Ipotizziamo alcune soluzioni
Esempio Una particolare classe semplice (Naturali, ovvero numeri interi positivi)
Ipotizziamo alcune soluzioni
Ipotizziamo una estensione (del dominio)
Esempio Una particolare classe semplice (Naturali, ovvero numeri interi positivi)
Ipotizziamo alcune soluzioni
Ipotizziamo una estensione (del dominio)
Quale soluzione tra quelle proposte è “Open Closed” (ovvero consente l'estensione senza necessitare di modifiche)?
Dominio? gestisco denaro contante (quindi solo positivi)
@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
Aspettative @Test public void zeroEqualsZero() { Natural zero = new Natural(0); Natural anotherZero = new Natural(0); Assert.assertEquals(zero,anotherZero); }
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; }
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; }
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
Estensione Valori negativi
“sì alle estensioni!  no alle modifiche!” public class Relative  extends  Natural { @Pre // precondizione rilassata public Relative(int value) { this.value = value; } .... }
“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.)
Correlazioni-osservazioni Natural  super classe di Relative
Correlazioni-osservazioni Natural  super classe di Relative
Natural  sotto insieme di Relative (o, che è lo stesso, è  isomorfo  ad un suo sottoinsieme)
Correlazioni-osservazioni Natural  super classe di Relative
Natural  sotto insieme di Relative (o, che è  quasi  lo stesso, è  isomorfo  ad un suo sottoinsieme)
Morfismo : (astrazione di un processo che trasforma una struttura astratta in un'altra mantenendo alcune caratteristiche &quot;strutturali&quot; della prima (wikipedia))
Correlazioni-osservazioni Natural  super classe di Relative
Natural  sotto insieme di Relative (o, che è  quasi  lo stesso, è  isomorfo  ad un suo sottoinsieme)

esempio open closed