inserire metodi nella classe base che non ha senso / farvi parte [chiuso]

0

Ultimamente ho riflettuto su principi e schemi di progettazione e una domanda mi ha colpito.

Diciamo che voglio progettare un gioco di corse. Voglio progettare le classi per una varietà di macchine.

  • ogni auto può avere una caratteristica diversa
  • le funzioni più comuni possono essere inserite nella classe base - 'Car'

Ora, ho imparato che dovresti sempre cercare di lavorare con le astrazioni.

Tutto il codice che tenta di manipolare la macchina proverà a chiamare i metodi astratti su Car come Car.Accelerate() , Car.TurnLeft() , ecc ...

Ma per quanto riguarda le caratteristiche specifiche? Come alcune auto potrebbero avere propulsori di razzi o un paracadute e potresti volerli usare (so che sembra ridicolo, ma il mio punto qui è "Potrebbero esserci caratteristiche speciali nelle classi derivate che potrebbero non giustificare il tipo reale (o il tipo di base) di quella specifica classe ')?

Quindi, che dire di loro?

Preferiresti piuttosto aumentare alcuni metodi astratti nella classe base rendendolo meno coeso, o ne inseriresti alcuni se blocchi e digiti cast (per ottenere l'oggetto classe effettivo e usi quel metodo) rendendolo più accoppiato?

    
posta user136627 14.06.2014 - 16:20
fonte

2 risposte

2

Prova a pensare al contrario: se dovessi guidare da A a B e non ti importa delle strade che utilizzi o del tempo che passi lì, potresti semplicemente prendere un Car , Accelerate() it e Stop() ogni volta che ci sei. Quindi, un tipo astratto di Car sarà facilmente sufficiente per lo scopo. Immagino che molte persone utilizzerebbero quel Car mentre non si preoccupano dei dettagli.

Ma poi ci sono circostanze in cui hai effettivamente bisogno di velocità. Ti serve un razzo per arrivare in tempo. Quindi, ciò che fai non è di ottenere un Car ma un RocketBoostedCar . Ti fornirà mezzi per AccelerateWayFaster() rispetto ad altre auto e, beh, ci sei - piuttosto veloce.

Il mio punto è: se hai effettivamente bisogno di caratteristiche speciali che un abstract non può fornire, sai già che hai un oggetto concreto (speciale). Probabilmente lo hai chiesto (usando il suo costruttore, o dicendo a una fabbrica di produrre un tipo speciale). E se disponi di tale "speciale" Car , puoi utilizzare le sue funzioni speciali.

    
risposta data 14.06.2014 - 18:34
fonte
0

Dimentica il design in questo momento. La tua idea per il sistema è troppo mal formata per decidere dettagli di progettazione di basso livello come l'ereditarietà delle classi. Decidi piuttosto su alcuni casi d'uso esatti e applicali. Quindi implementa altri casi d'uso. Riformatore continuo del codice per eliminare la duplicazione. Introdurre interfacce per eliminare le dipendenze circolari. Quando inizia a diventare disordinato e non sai come procedere, puoi inserire il codice su StackOverflow.

Dopo aver acquisito una notevole pratica di codifica, potrai visualizzare più parte dell'implementazione in precedenza nel processo.

    
risposta data 14.06.2014 - 18:32
fonte