2011-03-15 14 views
5

Quale delle due dovrebbe essere preferita?Classe base vs Classe di utilità

Ci sono alcuni metodi che sono chiamati per classe A, B e C.

Qualora tali metodi sono incapsulati in una classe D (base A, B e C)?

O

Qualora tali metodi incapsulare in una classe U e altre classi creats è oggetto utilizzare i metodi come richiesto.

Su quale base dovrebbe essere presa la decisione?

Grazie.

+4

Esiste una relazione concettuale tra le classi A, B e C? –

+0

Che ne dici di creare un'interfaccia e implementarla con A, B, C? –

+0

@p: solo che costruiscono i dati utilizzati dalla classe D. A richiede input diversi rispetto alle altre classi. @Srinivas: l'implementazione di questi metodi è esattamente la stessa per A, B e C. – Azodious

risposta

9

È necessario creare una classe di utilità static.

Utilizzare solo eredità se in realtà è significativo — se A, B, e C realtà sono un D.

+0

sì, credo. D ha metodi che invocano alcuni algoritmi di tre tipi. A, B e C costruiscono dati specifici dell'algoritmo e chiamano quei metodi comuni per l'esecuzione. – Azodious

+0

@Azo: il dettaglio aiuta sempre. In tal caso, forse dovresti usare l'ereditarietà, con un metodo 'abstract' sovrascritto da' A', 'B' e' C'. – SLaks

+0

Sono totalmente d'accordo con il secondo punto, ma vorrei solo consigliare l'uso di una classe di utilità statica in cui i metodi di utilità non hanno stato (cioè nessuna variabile statica) e non eseguono operazioni con effetti collaterali (file IO o attività del database ecc.) . Se stai testando le unità A, B e C, è (quasi) impossibile separarle da una classe di utilità statica con oggetti finti. È molto meglio usare una classe di utilità non statica che viene passata ad A/B/C tramite l'iniezione del costruttore. Quindi il codice è altamente configurabile e acquisisce i comportamenti tramite aggregazione. – sheikhjabootie

2

Tenderei via dall'ereditarietà a meno che non ci sia un'evidente relazione -a. Sospetto dalla tua descrizione sopra che non è questo il caso. Le mie soluzioni preferite sarebbero:

  1. iniettare un'istanza di una classe di utilità nella vostra A, B, C
  2. avere A, B, C istanziare le classi di utilità appropriate

Il vantaggio di iniettare la classe è che puoi fornire implementazioni diverse banalmente. Questo è particolarmente utile per i test. Singleton o classi con metodi statici tendono a causare problemi per lo stesso motivo: non è possibile sovrascriverli o sostituirli facilmente.

3

Prenderei la decisione su cosa stanno facendo i metodi, se stanno facendo cose specifiche per le classi A, B e C allora dovrebbero essere nella classe base. Ciò aiuta a mantenere pulito il codice, nascondendo funzionalità correlate alla classe dal resto del sistema. (Naturalmente, presumo che A, B e C ereditino già da D, o siano ovviamente correlati)

Se fanno cose con altri tipi, che non sono inerenti a ciò che A, B e C fare, quindi al fine di massimizzare le opportunità di riutilizzo dovrebbero essere in una classe di utilità.

Se stanno facendo cose con altri tipi che sono specifici di quell'altro tipo (ad esempio, la bella stampa di un datetime), considera di renderli i metodi di estensione per del tipo.

+1

+1: mi hai battuto su di esso. Come menzionato da SLaks, sembra che l'OP non sia a conoscenza delle funzioni statiche. Forse vale la pena menzionarlo anche per la classe di utilità. –

0

Utilizzare la classe di base Se si intende scrivere una logica solo in base alla classe di base, è opportuno creare una classe di base. In quel caso la tua classe derivata dovrebbe essere completamente sostituibile per la tua classe base. Non ci dovrebbe essere alcuna logica di commutazione per controllare il tipo derivato e agire di conseguenza.Vedi Liskov principio di sostituzione: http://en.wikipedia.org/wiki/Liskov_substitution_principle

Usa Utility Class Alcune lingue hanno la limitazione che non supportano l'ereditarietà multipla. Se hai già una classe base significativa, devi andare alla classe di utilità. Inoltre, quando si utilizza l'ereditarietà si crea un accoppiamento stretto tra la classe dervied e la classe base.

Vorrei andare per la classe base se la classe derivata è naturalmente sostituibile per la sua classe base. Se lo scopo è solo quello di condividere un codice riutilizzabile tra le classi, allora ha più senso andare con la classe di utilità.

Problemi correlati