Sottoclasse per modificare le impostazioni predefinite?

2

Ho una classe chiamata Timeline . Voglio consentire più valori predefiniti nel mio codice, ad esempio Timeline con un evento Start (I dettagli non sono necessari. Tutto ciò che conta è che ho una classe e voglio poterne avere alcuni diversi impostazione predefinita). Ecco le opzioni che ho pensato:

1) Seguendo un'idea ispirata a GUI / Swing, potrei voler creare una sottoclasse della classe Timeline e, nel suo costruttore, utilizzare le funzioni pubbliche per impostare il valore predefinito. Quindi, potrei in seguito istanziare quegli oggetti invece della superclasse

2) Una classe factory potrebbe avere funzioni come "getTimeLineWithExplosion" e impostare tutto.

Quale di questi due è l'idea migliore? C'è un modello di design migliore di entrambi?

PS: è implementato in Java, ma potrebbe facilmente essere in un'altra lingua.

    
posta sinθ 02.08.2013 - 20:59
fonte

4 risposte

3

Informazioni sulle opzioni.

Non penso che la sottoclasse qui sia una buona idea. Come ti vedo, non segui la relazione "è - un" qui. Se hanno valori di default leggermente diversi - rispetto a oggetti diversi della stessa classe, ma non a classi diverse, poiché non hanno un comportamento diverso.

L'opzione di fabbrica sembra molto meglio. Non è necessario creare una nuova classe per ogni nuovo valore di default che si desidera. E la fabbrica astrae bene la logica sottostante.

Ti propongo un'altra idea. Implementa qualcosa come schema "Builder" , per ottenere costruzioni come questa:

createTimeline().withStartEvent().build()

o

createTimeline().withStartEvent().withAnotherDefault("def").andWithSomeAddition(42).build()

Non conosco bene Java, ma sono certo che potrebbe essere implementato e non sarà molto più difficile di fabbrica, ma la leggibilità sarebbe migliore (come per me).

Se Java consente di dichiarare conversioni di tipo implicite, potresti finire senza quella chiamata build()

    
risposta data 02.08.2013 - 22:14
fonte
0

Esamina il modello di prototipo .

Fondamentalmente, crea una classe base con un metodo virtuale Clone . Per ogni set di valori predefiniti, crea una sottoclasse.

ITimeline
-- TimelineWithExplosions.Clone();
-- TimelineWithLasers.Clone();

Rendi statico il metodo Clone e ogni bambino diventa il suo stabilimento.

    
risposta data 02.08.2013 - 22:28
fonte
0

Parole di parole semplici:

  • Poiché le cose che vuoi impostare sono già esposte con metodi pubblici, non è necessario creare sottoclassi.

  • Anche se tali elementi non sono stati esposti, la modifica del valore dei membri protetti è non un motivo sufficiente per la sottoclasse . Dovresti avere un'altra ragione, come la necessità di modificare un comportamento .

  • Il pattern factory (seconda opzione) è un'opzione migliore. Ci sono alcuni altri modelli creativi che potresti voler considerare, ma Factory è OK.

risposta data 02.08.2013 - 23:14
fonte
0

Sì, il secondo approccio è migliore.  Qui ci sono altre opzioni. Puoi andare per modello prototipo. La cosa aggiuntiva che sarà richiesta è che la classe temporale dovrebbe implementare Clona in grado, e quindi a seconda della classe temporale che farò Clonazione superficiale o clonazione profonda.

Se l'opzione prototipo è troppo, allora puoi andare per il costruttore Modello. Questo approccio sarà più pulito.

    
risposta data 03.08.2013 - 13:07
fonte

Leggi altre domande sui tag