34 votes

L'utilisation de la réflexion est-elle une odeur de design?

Je vois beaucoup de questions C #, .net résolues ici en utilisant la réflexion. Pour moi, beaucoup d’entre eux ressemblent à une flexion des règles au détriment d’un bon design (OOP). La plupart des solutions semblent inefficaces et "scriptées".

L'utilisation de la réflexion est-elle une bonne pratique en général? Y a-t-il des choses qui ne peuvent être résolues que par la réflexion?

modifier:

Veuillez donner des exemples où la réflexion est la seule bonne solution.

45voto

Philip Rieck Points 21405

Exemples:

  • Chargement dynamique des types via la configuration
  • Utilisation de l'enregistrement de style "convention" (enregistrez avec votre conteneur des composants qui implémentent une interface ou ont une certaine convention de dénomination)
  • Vérifier / utiliser des attributs personnalisés / métadonnées de type

La réflexion est un outil, comme le "lancer". devriez-vous utiliser jeter partout? Non! Alors, est-ce une odeur de code à utiliser?

14voto

jalf Points 142628

Pour moi, beaucoup d'entre eux ressemblent à la flexion le règlement sur le coût d'une bonne conception (POO). De nombreuses solutions look unmaintenable et "scripts".

Honnêtement, le "good design" a peu à voir avec la POO. Je dirais une bien plus grande conception de l'odeur d'être concernés par la croyance qu'un bon design est exactement égale à la programmation orientée objet. Que nous ne pouvons pas avoir une bonne conception sans programmation orientée objet, et que nous ne pouvons pas suivre les règles de la programmation orientée objet sans que cela devienne une bonne conception. C'est presque aussi mauvais que les gens de l'obsession de la "sent". Les programmeurs doivent utiliser leur cerveau, pas de leur nez.

Est l'utilisation de la réflexion d'une bonne pratique dans générale? Sont là des choses qui peuvent seulement être résolu par la réflexion?

La façon dont je le vois, la réflexion est surtout un symptôme de la langue lacunes. Idéalement, une langue devrait vous permettre de faire ce que vous voulez sans "tordre les règles" par la réflexion. Mais la plupart ne le font pas, et C# certainement ne pas, de sorte que la réflexion est de temps en temps votre seul choix raisonnable.

Il y a beaucoup de "corriger" les usages de la réflexion. Le chargement dynamique de types/bibliothèques d'être évident. Ou l'inspection des attributs. La plupart des tests unitaires cadres dépendent de la réflexion en tant que bien, ce qui est bien, parce qu'ils doivent être un peu intrusive pour être facile à utiliser et d'accéder au code que nous souhaitons tester.

Mais la plupart le code de l'utilisateur qui effectue une sorte de type d'inspection, d'essai à l'exécution si un type implémente une interface particulière ou a une certaine fonction de membre de, est un signe de quelque chose qui, dans un idéal de langue, ne devrait pas être nécessaire.

Si vous voulez à la considérer comme une odeur, appelez ça une langue odeur, pas design un. (Bien sûr, il peut être galvaudé dans la conception aussi bien, mais là où j'ai le plus souvent de le rencontrer, c'est une nécessité en raison du manque d'expressivité de la langue)

13voto

Andrew Siemer Points 7226

La réflexion est parfois le seul moyen de faire certaines choses. C'est un outil très puissant qui peut parfois être surutilisé par quelqu'un qui connaît très bien la réflexion mais peut-être pas autre chose. Une surutilisation de la réflexion quand quelque chose fonctionnera mieux pourrait être une odeur de design ... mais le plus souvent, tout simplement un mauvais codage.

13voto

Robert Paulson Points 10792

Avait une fois un programme de traitement de fichiers (façon générique, c'est que la description)

Par l'aide de la réflexion tout ce que vous avait à faire était de tomber dans une DLL dans un dossier, l'application serait de ramasser ça et utiliser la réflexion pour rechercher des classes qui ont mis en œuvre un certain interface et de vérifier certains attributs. Il n'était pas nécessaire pour les fichiers de config. Il suffit de déposer et d'aller, ce qui était bien pratique pour un système de production que nous n'avons pas besoin de temps d'arrêt.

Comme avec la plupart des solutions. il y a un certain nombre d'autres façons d'atteindre le même objectif, mais la réflexion ne font de ce fait facile.

7voto

Darin Dimitrov Points 528142

Je ne dirais pas que l'utilisation de la réflexion est une odeur de design. C'est une fonctionnalité utile du framework qui rend les langages statiques un peu plus dynamiques. Maintenant, du point de vue pratique, j'essaie d'éviter la réflexion si je peux résoudre mon problème sans cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X