62 votes

Arguments contre les annotations

Mon équipe est en déplacement pour le Printemps 3.0 et il y a des gens qui veulent commencer à bouger tout en Annotations. Je viens d'obtenir un très mauvais sentiment dans mon intestin (odeur de code?) quand je vois une classe qui a des méthodes comme ceci: (juste un exemple - ne sont pas tous de vrais annotations)

@Transaction
@Method("GET")
@PathElement("time")
@PathElement("date")
@Autowired
@Secure("ROLE_ADMIN")
public void manage(@Qualifier('time')int time) {
...
}

Suis-je juste derrière le temps, ou est-ce que cela semble comme une idée horrible pour quelqu'un d'autre? Plutôt puis à l'aide des concepts OO comme l'héritage et le polymorphisme, maintenant que tout est par convention ou par le biais d'annotations. Je ne l'aime pas. Avoir à recompiler le code pour changer les choses que de l'OMI sont de configuration semble erroné. Mais cela semble être la façon dont tout (surtout au Printemps) est en cours. Dois-je simplement "get over it" ou devrais-je pousser en arrière et essayer de garder notre code d'annotation libre que possible?

22voto

matt b Points 73770

En fait, je pense que le mauvais sentiment dans votre intestin contre a plus à faire avec des Annotations comme ce mélange de configuration avec le code.

Personnellement, je ressens la même manière que vous le faites, je préfère laisser la configuration (comme l'opération des définitions, des éléments de chemin d'accès, Url d'un contrôleur doit être mappé, etc.) en dehors de la base de code lui-même et en externe Printemps contexte XML fichiers.

Je pense cependant que l'approche correcte ici, mais revient à l'opinion et la méthode que vous préférez - je prédis que la moitié de la communauté sont d'accord avec les annotations de l'approche et de l'autre moitié serait d'accord avec la configuration extérieure de l'approche.

12voto

Thomas Jung Points 17692

Peut-être que vous avez un problème avec redondant annotations qui sont tous sur le code. Avec les méta-annotations redondants, les annotations peuvent être remplacés et vos annotations sont au moins SÈCHE.

À partir du Printemps Blog:

@Service
@Scope("request")
@Transactional(rollbackFor=Exception.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyService {
}

@MyService
public class RewardsService {
…
}

Parce que Java évolue donc lentement de personnes mettent plus de fonctionnalités qui manquent dans la langue dans les annotations. C'est une bonne chose Java peut être prolongée d'une certaine forme, et c'est une mauvaise chose que la plupart des annotations de certains solution de contournement et d'ajouter de la complexité.

9voto

Yishai Points 42417

J'étais également sceptique à propos des annotations, mais les voyant, ils peuvent être une grande chose. Ils peuvent eux aussi être utilisés.

La principale chose à retenir à propos des annotations, c'est qu'ils sont statiques. Ils ne peuvent pas changer au moment de l'exécution. Toute autre méthode de configuration (xml, auto-description dans le code, peu importe) ne souffre pas de cette. J'ai vu des gens ici ont DONC des problèmes avec le Printemps, en termes d'avoir un environnement de test sur l'injection de configurations de test, et d'avoir à déroulant à XML pour le faire.

XML n'est pas polymorphe, héréditaires ou à autre chose, de sorte qu'il n'est pas un pas en arrière en ce sens.

L'avantage d'annotations, c'est qu'il peut vous donner plus de vérification statique sur votre configuration et vous pouvez éviter beaucoup de commentaires et de difficultés de coordination dans les configurations XML (essentiellement le maintien des choses à SEC).

Tout comme XML, les Annotations peuvent être plus utilisé. Le point principal est d'équilibrer les besoins et les avantages de chacun. Les Annotations, au point qu'ils vous donnent de moins verbeux et sèche-linge code, sont un outil à effet de levier.

EDIT: Concernant le commentaire sur une annotation remplacement d'une interface ou une classe abstraite, je pense que cela peut être raisonnable dans le cadre des limites. Dans un cadre destiné à être utilisé par des centaines, si pas des milliers de projets, d'avoir une interface ou une classe de base peut vraiment sertir les choses (en particulier d'une classe de base, mais si vous pouvez le faire avec des annotations, il n'y a aucune raison que vous ne pouvait pas le faire avec une interface.

Envisager JUnit4. Avant, il fallait s'étend une classe de base qui a un programme d'installation et le démontage de la méthode. De mon point de vue, il n'a pas vraiment d'importance si ceux qui avaient été sur une interface ou une classe de base. Maintenant, j'ai un tout autre projet avec sa propre hiérarchie d'héritage, et ils ont tous de l'honneur cette méthode. Tout d'abord, ils ne peuvent pas avoir leur propre conflit noms de méthode (pas une grosse affaire dans un cadre de test, mais vous avez mon point). Deuxième de tous, vous avez la chaîne de l'appel à super tout le chemin vers le bas, parce que toutes les méthodes doivent être couplés.

Maintenant, avec JUnit4, vous pouvez avoir différents @Avant les méthodes dans des classes différentes dans la hiérarchie et ils peuvent être indépendants les uns des autres. Il n'est pas aussi SEC pour ce faire, sans annotations.

Du point de vue des développeurs de JUnit, c'est une catastrophe. Beaucoup mieux d'avoir un type défini que vous pouvez appeler à l'installation et le démontage sur le. Mais un cadre qui n'existe pas, pour la commodité du cadre de développeur, il existe pour la commodité du cadre de travail de l'utilisateur.

Tout cela s'applique si votre code n'a pas besoin de se soucier du type (qui est, dans votre exemple, rien ne serait tous vraiment utiliser un type de Contrôleur de toute façon). Ensuite, on pourrait même dire que la mise en œuvre du cadre de l'interface est plus perméable que de mettre sur une annotation.

Si, toutefois, vous allez écrire le code pour lire cette annotation dans votre propre projet, exécuter loin.

4voto

Scott Dagastino Points 21

Les annotations doivent être utilisées avec parcimoniement. Ils sont bons pour certains, mais pas pour tous. Au moins l'approche de configuration xml maintient le config dans un fichier (ou multiple) au lieu de s'étaler partout. Cela présenterait (comme je l'appelle) organisation de code de merde. Vous ne verrez jamais l'image complète de la configuration si elle est répartie sur des centaines de fichiers.

3voto

jitter Points 35805

Vérifier ces réponses à des questions similaires

Quels sont les avantages/Inconvénients des Annotations (non-compilateur) par rapport à des fichiers de configuration xml

Configuration Xml rapport à l'Annotation en fonction de la configuration

En gros, ça revient à: Utiliser les deux. Elles ont toutes les deux il y usecases. Ne pas utiliser les annotations pour des choses qui devraient rester configurable, sans recompilation de tout (surtout des choses qui, peut-être que votre utilisateur devrait être capable de configurer sans avoir besoin de vous pour recompiler tous)

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