Quali sono i vantaggi o gli svantaggi di entrambi?È meglio restituire il tipo più specifico o più generale da un metodo di azione?
risposta
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 è.
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. Perché l'implementazione dell'interfaccia non può restituire un tipo più specifico?
- 2. È meglio restituire una query grande o alcune più piccole?
- 3. È meglio utilizzare più SpanObjects o più TextView in Android?
- 4. È preferibile utilizzare per più valori di output o restituire un tipo di valore combinato?
- 5. È possibile restituire più di un valore da un metodo in Java?
- 6. Qual è l'algoritmo "più generale unificatore generale" ottimale?
- 7. Restituisce più volte da un metodo?
- 8. Qual è il più usato? RSS o Atom? e da quale è meglio costruire?
- 9. Perché un tipo più generale influisce sul runtime in Haskell?
- 10. Qual è il tipo di pitone più generale a cui posso aggiungere attributi?
- 11. Come sostituire un tipo parametrico con uno più specifico
- 12. C#, metodo di scrittura più lungo o metodo più breve?
- 13. Cosa c'è di meglio, Un framework javascript o più framework
- 14. Isnan è nello std :: namespace? Più in generale, quando è std: necessario, facoltativo o da evitare?
- 15. Java: il modo migliore per restituire più tipi di oggetto da un metodo
- 16. LINQ e come restituire un elenco di un tipo specifico
- 17. Come restituire un arraylist da un metodo
- 18. Meglio usare più file di lingua o 1?
- 19. Con PhoneGap, che è meglio: più pagine html o più pagine jquery-mobile?
- 20. C'è un modo per restituire il tipo Anonymous dal metodo?
- 21. Impostare uno o più coefficienti su un intero specifico
- 22. Converti il tipo di progetto Eclipse da generale a Java
- 23. C# Generics - Come posso restituire un tipo specifico?
- 24. Qual è il metodo SELECT più efficiente e perché?
- 25. Come determinare se T è un tipo di valore o una classe di riferimento in generale?
- 26. tipi restituire più php 7
- 27. Perché la vettorizzazione è, in generale, più veloce dei cicli?
- 28. Quale tipo di eredità è più preferibile?
- 29. Chiama un metodo specifico basato sul tipo enum?
- 30. Qual è il codice di stato HTTP più appropriato da restituire se manca un'intestazione richiesta?
Quindi si restituisce 'object' da tutto? – Timwi
Certamente no. Apparentemente non sono riuscito a spiegarlo chiaramente nella mia risposta. Lo chiarirò. – Manfred