Ero leggendo sulla composizione e mi chiedo se viola l'O in SOLID e cosa dovrebbe essere fatto per risolvere la situazione. Nell'articolo l'autore usa un frutto e una mela. Alla fine lo scrittore ammette che sarebbe meglio come una relazione "è-a" piuttosto che "ha-a".
Supponiamo tuttavia che tu abbia deciso di mantenere la composizione e hai costruito la tua classe Fruit
in questo modo:
class Fruit {
public void peel(){
//code to peel fruit.
}
}
e Apple:
public void peel() {
fruit.peel();
}
Se aggiornassi la mia classe Fruit, ad esempio, un metodo chiamato eat
, dovrei quindi aggiornare anche la mia classe Apple per aggiornare il nuovo metodo eat.
Domande:
- Questo viola l'O è SOLIDO? Per me, lo fa perché ogni volta che
Fruit
cambia, devi aggiornare Apple per implementarlo. - Fornire un
getter
perFruit
e quindi chiamare il metodo richiesto è meglio? Se fossi determinato a far funzionare la composizione, come gestiresti gli aggiornamenti?
Esempio:
di Apple:
public Fruit getFruit(){
return this.fruit;
}
Cliente:
Fruit fruit = apple.getFruit();
fruit.eat();
Idealmente lo si ristrongrà ad una relazione is-a e indipendentemente dal tipo di frutto, la sottoclasse può sovrascrivere eat()
.