2010-08-08 9 views

risposta

17

mie linee guida è sempre stata più specifica, e più in generale.

Il più generale il tipo di dati è, meno il codice che lo utilizza conosce il tipo di dati. Ad esempio, se un metodo restituisce una raccolta, restituirei la raccolta appena creata che il metodo ha prodotto. Se restituisce una struttura interna dei dati, la farei risalire fino a IEnumerable<T>.

Tuttavia, se restituisce un array o un List<T> perché questo è ciò che è stato creato internamente, il codice che ottiene i dati ora ha accesso a più funzionalità sulla raccolta.

L'altra estremità dello spettro, per restituire il tipo di dati più generale (entro i limiti) significherebbe che si restituisce sempre IEnumerable<T> o simile per tutte le raccolte, anche se il metodo ha costruito un nuovo array internamente e lo ha restituito. Il codice chiamante ora deve copiare manualmente il contenuto della raccolta in un nuovo array o elenco, se questo è ciò che il codice chiamante deve utilizzare.

Ciò significa più e, nella maggior parte dei casi, lavoro non necessario.

Per quanto riguarda l'input, vado per il tipo più generale che posso usare, quindi per le raccolte, a meno che non abbia specificamente bisogno di un array o di un elenco o simili, accetterò IEnumerable<T>. In tal modo, mi assicuro che il codice di chiamata abbia meno lavoro da fare. Questo potrebbe significare che devo lavorare internamente, quindi è un compromesso.

La parte importante è raggiungere un equilibrio. Non essere troppo generico o troppo specifico, sempre, ogni volta. Individua il tipo giusto che ha senso e considera ciò che il codice chiamante deve fare per passare i dati o accettare i dati in uscita dal tuo codice. Meno lavoro, meglio è.

2

In generale vorrei andare per il tipo più generale. In questo modo non interromperò nessun client che potrebbe utilizzare le informazioni sul tipo di reso.

Se restituisco un tipo più generale, nell'implementazione del metodo di azione posso sempre modificare il tipo in qualcosa di diverso. Si consideri il seguente scenario: si restituisce un risultato di azione personalizzato che deriva da ActionResult. Da qualche parte nel tuo codice base qualcosa presume che il valore restituito sia MyCustomActionResult. In tal caso, se si modifica il valore di ritorno, si interrompe il codice cliente.

BTW: faccio lo stesso - restituendo il tipo generale più appropriato - per tutti i metodi non solo per i metodi di azione.

Modifica: Si prega di notare che questo non significa che mi piacerebbe restituire object. La sfida è trovare il tipo che rappresenta l'astrazione "più appropriata".

+1

Quindi si restituisce 'object' da tutto? – Timwi

+1

Certamente no. Apparentemente non sono riuscito a spiegarlo chiaramente nella mia risposta. Lo chiarirò. – Manfred

Problemi correlati