2010-08-08 2 views

Répondre

17

Mes directives ont toujours été plus spécifique sur, et le plus général.

Le type de données plus générales, moins le code qui l'utilise sait le type de données. Par exemple, si une méthode retourne une collection, je retournerai la nouvelle collection créée par la méthode. Si elle renvoie une structure de données interne, je l'augmenterais jusqu'à IEnumerable<T>. Cependant, s'il retourne un tableau, ou un List<T> parce que c'est ce qu'il a construit en interne, le code qui récupère vos données a maintenant accès à plus de fonctionnalités sur votre collection. Pour renvoyer le type de données le plus général (dans certaines limites), vous devez toujours renvoyer IEnumerable<T> ou similaire pour toutes les collections, même si la méthode a construit un nouveau tableau en interne et l'a retourné. Le code appelant doit maintenant copier manuellement le contenu de la collection dans un nouveau tableau ou une nouvelle liste, si c'est ce que le code appelant doit utiliser.

Cela signifie plus, et dans la plupart des cas, un travail inutile. Comme pour l'entrée, je vais pour le type le plus général que je peux utiliser, donc pour les collections, sauf si j'ai spécifiquement besoin d'un tableau ou une liste ou similaire, je vais accepter IEnumerable<T>. En faisant cela, je m'assure que le code d'appel a moins de travail à faire. Cela pourrait signifier que je dois faire un peu de travail à l'interne, donc c'est un compromis.

La partie importante est d'atteindre un équilibre. Ne soyez pas trop général ou trop spécifique, tout le temps, à chaque fois. Déterminez le bon type qui a du sens et considérez ce que le code appelant doit faire pour transmettre des données ou accepter les données sortantes de votre code. Le moins de travail, le meilleur.

2

En général, je voudrais aller pour le type plus général. De cette façon, je ne vais pas casser un client qui pourrait utiliser les informations sur le type de retour.

Si je retourne un type plus général, dans l'implémentation de la méthode d'action je peux toujours changer le type à quelque chose de différent. Considérez le scénario suivant: Vous renvoyez un résultat d'action personnalisé qui dérive de ActionResult. Quelque part dans votre base de code quelque chose fait l'hypothèse que la valeur de retour est MyCustomActionResult. Dans ce cas, si vous avez modifié la valeur de retour, vous devez supprimer le code client. BTW: Je fais de même - en retournant le type général le plus approprié - pour toutes les méthodes non seulement pour les méthodes d'action.

Modifier: Veuillez noter que cela ne signifie pas que je retournerais object. Le défi consiste à trouver le type qui représente l'abstraction «la plus appropriée».

+1

Vous renvoyez donc 'object' de tout? – Timwi

+1

Certainement pas. Apparemment, je n'ai pas réussi à le préciser dans ma réponse. Je vais clarifier cela. – Manfred

Questions connexes