Un collega e io stiamo discutendo. Nella nostra app ci sono componenti che si comportano in modo leggermente diverso in base a come vogliamo che vengano presentati. Finora, abbiamo concordato che la nostra eredità dovrebbe assomigliare a:
Component
/ \
Fixed Resizeable
in cui Fixed
avrebbe una proprietà size e Resizeable
avrebbe proprietà per i limiti e la dimensione iniziale. Tuttavia, ci sono ~ 20 componenti diversi che si adattano a 4 varianti: large
, medium
, medium-large
(ridimensionabile) e medium-small
(ridimensionabile).
Non siamo d'accordo su come i componenti dovrebbero essere impostati in queste varianti.
La sua soluzione:
// make a class that sets the properties of the variant
class MediumLargeResizeableComponent extends ResizeableComponent {
MediumLargeResizeableComponent() {
super(MEDIUM, LARGE); // some constants for the bounds
}
}
class CustomComponent extends MediumLargeResizeableComponent {
CustomComponent() {
// doesn't have to set the size properties
}
}
Questa soluzione utilizza una classe diversa per ogni variante che imposta le proprietà. Lo vedo come un problema perché hai bisogno di una nuova classe per ogni variante e non mi sembra un buon uso dell'ereditarietà. Pensa che sia più facile capire cosa sta facendo la classe. Dice anche che rende più facile cambiare tutte le classi che usano quella variante.
La mia soluzione:
// inherit directly and set the properties
class CustomComponent extends ResizeableComponent {
CustomComponent() {
super(MEDIUM, LARGE); // constants for the bounds
}
}
Questa soluzione è più semplice e lascia la personalizzazione al componente.
L'unica ragione tecnica che posso vedere contro la sua soluzione è che la tecnica non si adatta ad altre proprietà senza creare molte varianti. Non vede questo come un problema perché non abbiamo bisogno di altre proprietà come questa.
La sua soluzione - usare l'ereditarietà per impostare le proprietà - un modello cattivo? O è accettabile in situazioni come questa?
Modifica:
Mi sento come potrebbe esserci una certa confusione. Le 20 diverse classi sono semplicemente componenti diversi, ognuna delle quali fa cose diverse che sono indipendenti, ma ognuna di queste classi misura solo 1 delle varianti di dimensione. Come sopra, CustomComponent
è ridimensionabile da medio a grande e nient'altro.