Débat Java : Que pensez-vous de la multiplication des annotations ?

Le , par nicorama, En attente de confirmation mail
Alors que le langage Java comporte de base peu d'annotations, des apis peuvent en amener une multitudes comme le montre le récent tutoriel Seam, ou celles proposées par Hibernate.

Je suis assez réticent sur la multiplication des annotations qui pour moi ressemblent à première vue à un nouveau dialecte. Voici mes craintes si j'en crée dans mes packages :

  • Difficultés de refactoring par les ide
  • Difficultés de compréhension par l'équipe par rapport à une api standard
  • Est-ce, comme le fut xml, une mode ?
  • Quel est la réelle plus-value par rapport à une ligne de code ?

J'étais également réticent à Hibernate par rapport à JDBC, et pourtant utilisant JPA, c'est quand même bien mieux (surtout quand Netbeans génère tout ces annotations louches ).

Bref, créez-vous vos propres annotations, et êtes-vous content d'avoir des frameworks pleines d'annotations ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de tchize_ tchize_ - Expert éminent sénior https://www.developpez.com
le 17/04/2009 à 12:10
J'a idéjà du travailler avec des serveur ou fallait balancer mes donnée dans des formats les pluts tordus les uns que les autres, sans annotations. Et même sans annotations, j'ai un template par format d'export. Je vois pas le lien avec les annotation dans l'histoire

Et comme je l'ai dit, pour moi vouloir utiliser des annotation pour diriger la manière dont un code se comporte, alors que tu sais pertinement que ce code devra se comporter de manière différente suivant la situation, c'est assez inutile. Autant se passer des annotations dans ces cas là
Avatar de eclesia eclesia - Rédacteur https://www.developpez.com
le 17/04/2009 à 19:47
Citation Envoyé par tchize_  Voir le message
Et comme je l'ai dit, pour moi vouloir utiliser des annotation pour diriger la manière dont un code se comporte, alors que tu sais pertinement que ce code devra se comporter de manière différente suivant la situation, c'est assez inutile. Autant se passer des annotations dans ces cas là

ca revient a ce que j'avasi dit : ne pas utiliser d'annotation pour ce qui est binding (xml ou autre)
Avatar de Tommy31 Tommy31 - Membre chevronné https://www.developpez.com
le 17/04/2009 à 22:49
Citation Envoyé par eclesia  Voir le message
Les annotations ne gerent pas les versions d'annotations

Peux-tu expliciter ce point particulier ?
Avatar de eclesia eclesia - Rédacteur https://www.developpez.com
le 17/04/2009 à 23:45
Quand tu annote ta classe avec une api de binding : type jaxb.
les annotations sont faites pour une version particuliere du xml.

Quand on suit des normes, parmis lesquelles ISO et OGC, les normes évoluent avec les années avec une nouvelle version tout les 2/3ans environs et des revisions qui peuvent être quasi annuelle pour les normes très actives.

Donc quand tu as annotée ta classe, tu l'as fait pour une version particulière. seulement il est rare d'avoir deux applications (venant de société différentes) alignée en permanence sur la même version. Par conséquent notre classe doit pouvoir être "marshaller" en différente version d'une même norme pour pouvoir vraiment etre interopérable. Mais il est impossible d'avoir plusieurs annotations faisant référence à différente version ou a différentes normes.

Un exemple : j'ai une série de classes pour faire de la symbologie, il exite une norme OGC et une norme ISO et on peut aussi vouloir quelque chose de plus grand public comme le SVG ou le CSS.
les 4 normes décrivent plus ou moins la meme chose mais de facon differente. Avec des annotations tu es foutu, tu dois faire une interface et N implémentation pour chaque version/norme.

Un bon parser en vrai java et son lot de tests unitaires, c'est la seule solution viable a long terme.
Avatar de tchize_ tchize_ - Expert éminent sénior https://www.developpez.com
le 18/04/2009 à 10:09
dans ce cas là, bien sur, mais ca n'enlève rien à l'utilité ds annotation si tout ce que tu veux c'est marshaller ta classe pour la récupérer 5 minutes après sur la même version de ton appli, bref quand le format est à usage interne seulement (communication client / server utilsant la même version du protocole par exemple).

Perso il m'est jamais venu à l'idée d'utiliser des annotations pour exporter vers des format étranger à mon appli, j'ai toujours préféré l'utilisation d'un bon vieux template en freemarker ou en jsf (facelet parfois c'est du tout bon pour l'export format XML de données :p) qu'on sais faire évoluer sans toucher au code.
Avatar de Tommy31 Tommy31 - Membre chevronné https://www.developpez.com
le 18/04/2009 à 10:49
Citation Envoyé par eclesia  Voir le message
Quand on suit des normes, parmis lesquelles ISO et OGC, les normes évoluent avec les années avec une nouvelle version tout les 2/3ans environs et des revisions qui peuvent être quasi annuelle pour les normes très actives.

Tout à fait.

Citation Envoyé par eclesia  Voir le message
Un exemple : j'ai une série de classes pour faire de la symbologie, il exite une norme OGC et une norme ISO et on peut aussi vouloir quelque chose de plus grand public comme le SVG ou le CSS.
les 4 normes décrivent plus ou moins la meme chose mais de facon differente.

Si c'est fait de façon différente, c'est que le modèle qui le capture est également différent (un schema iso est différent d'un schema ogc); Donc il existe plusieurs traductions dans le code, et donc plusieurs jeu d'annotations.

Comment résous-tu ce problème avec une sérialisation classique ?
Avatar de eclesia eclesia - Rédacteur https://www.developpez.com
le 18/04/2009 à 13:42
Citation Envoyé par tchize_  Voir le message
Perso il m'est jamais venu à l'idée d'utiliser des annotations pour exporter vers des format étranger à mon appli, j'ai toujours préféré l'utilisation d'un bon vieux template en freemarker ou en jsf (facelet parfois c'est du tout bon pour l'export format XML de données :p) qu'on sais faire évoluer sans toucher au code.

Ce ne sont pas des formats étranger justement, on doit les gérer pour pouvoir communiquer avec les autres applications. le but de nos applications est en grande partie l'échange d'informations, se sont des applis serveur qui fournissent des services normalisés qui ne communique pas necessairement avec des clients fait par nous.
Un exemple (réel) un client MapFaces qui communique avec les serveurs cartographique de la nasa ou de l'unesco.

Je ne vois pas ce que vient faire jsf et les servlets la dedans

Si c'est fait de façon différente, c'est que le modèle qui le capture est également différent (un schema iso est différent d'un schema ogc); Donc il existe plusieurs traductions dans le code, et donc plusieurs jeu d'annotations.

Comment résous-tu ce problème avec une sérialisation classique ?

Il n'y a pas plusieurs traduction dans le code, il y a une classe "Style" qui cumule toutes les possibilités des différentes normes, a cause de ca, la structure de la classe ne colle a aucune des normes mais est capable d'en gérer tous les élements.

Comme le modèle ne colle pas a la norme je ne peux pas l'annoter, alors la solution est de transformer ses classes vers des classes annotées pour une norme et une version donné, ce qui peut en faire beaucoup. c'est le choix qu'a fait la société.

Personnellement, j'aurais fait des parseur stax, ce qui serait beaucoup plus performant, moins couteux en mémoire mais qui aurait prit plus de temps a réaliser. malheureusement jaxb est tres a la mode a cause de metro et des autres api, va donc expliquer a un patron non développeur pourquoi il ne devrait pas utiliser une api que tout le monde utilise
Avatar de tchize_ tchize_ - Expert éminent sénior https://www.developpez.com
le 18/04/2009 à 14:27
Citation Envoyé par eclesia  Voir le message
Ce ne sont pas des formats étranger justement

.... qui ne communique pas necessairement avec des clients fait par nous.

Perso c'est ma définition de "étranger à mon application", t'as pas le controle absolue sur le lecteur et l'encodeur

JSF était juste un exemple. Pour les export j'évite au maximum d'utiliser du code, j'utilise toujours des système de template (freemarker par exemple peu lire un template et y injecter les données :p). par contre, de fait, pour la lecture, il faut souvent passer par du code ^^

On en reviens de toutes facon au final a être d'accord il me semble: les annotation: oui pour ce qui est lié au code , sinon c'est pas la peine (logique puisqu'elles sont dans le code :p)
Avatar de Tommy31 Tommy31 - Membre chevronné https://www.developpez.com
le 18/04/2009 à 15:53
Citation Envoyé par eclesia  Voir le message
Il n'y a pas plusieurs traduction dans le code, il y a une classe "Style" qui cumule toutes les possibilités des différentes normes, a cause de ca, la structure de la classe ne colle a aucune des normes mais est capable d'en gérer tous les élements.

Ok, tu as donc un modèle protéiforme qui ne singularise pas chaque norme.

Citation Envoyé par eclesia  Voir le message
Comme le modèle ne colle pas a la norme je ne peux pas l'annoter, alors la solution est de transformer ses classes vers des classes annotées pour une norme et une version donné, ce qui peut en faire beaucoup. c'est le choix qu'a fait la société.

C'est aussi le choix que nous avons fait. C'est pas que je sois un adorateur de jaxb, mais le choix Jaxb peut se défendre pour plusieurs raisons dont une est qu'il permet une réification du schema xml dans le code, donc de tirer bénéfice du compilateur pour le binding, il est bidirectionnel et il est global (et non séquentiel). Après, effectivement, c'est lourd et consommateur de mémoire.

En outre, avec des outils comme hyperjaxb, il est possible à la fois de créer un maping xml-objet, mais aussi objet-relationnel. Ce qui est très intéressant.

Citation Envoyé par eclesia  Voir le message
Personnellement, j'aurais fait des parseur stax, ce qui serait beaucoup plus performant, moins couteux en mémoire mais qui aurait prit plus de temps a réaliser.

A réaliser, à mettre au point et à maintenir. En outre, il me semble que stax ne gère que les chaines de caractères, ce qui implique de mettre en place des convertisseurs (date, nombres).
Nous, nous travaillons sur les normes iso 19139. Ecrire un parseur stax de cette norme est inimaginable tellement c'est complexe. Les décideurs sont peut-être pro-production, mais les informaticiens sont aussi très faignants.
Avatar de Tommy31 Tommy31 - Membre chevronné https://www.developpez.com
le 18/04/2009 à 15:58
Citation Envoyé par tchize_  Voir le message
Pour les export j'évite au maximum d'utiliser du code, j'utilise toujours des système de template (freemarker par exemple peu lire un template et y injecter les données :p).

C'est pas à mettre au même niveau que jaxb. Freemarker c'est du rendu, jaxb du mapping;
En outre, avec freemarker, tu n'as aucun controle sur la validité de ce que tu produit (à moins de rajouter une couche). Un export xml ou json peut se retrouver foireux sans que tu t'en apperçoive (c'est du vécu).

Perso, nous utilisons un mapping dozer + jaxb, qui permet l'export/import xml et json sans faute et sans code supplémentaire.
Avatar de tchize_ tchize_ - Expert éminent sénior https://www.developpez.com
le 18/04/2009 à 16:47
Citation Envoyé par Tommy31  Voir le message
Perso, nous utilisons un mapping dozer + jaxb, qui permet l'export/import xml et json sans faute et sans code supplémentaire.

merci pour le truc de mon coté, pour tous nos format d'export, c'est à chaque fois des formats bidouille a moitié pas documenté exigés par un service externe et, (là aussi c'est du vécu) a la question "vous avez un DTD, un serveur ou n'importe quoi pour pouvoir tester la validité des données par rapport au format approximativement documenté que vous utilisez?" j'ai eu une réponse variant autour de
vous nous envoyez le fichier, on l'ouvre dans excel pour regarder si il y a des erreur flagrante, ensuite on l'importe dans notre serveur de test pour voir si tout va bien et finalement, on l'importe sur le serveur SAP si ca fonctionne. Si il y a une erreur ou vous rappel

Devant ce genre de réponse, je me sens parfois désespéré (quand c'est pas des format impossibles à respecter car il y a incohérence entre le format (théorie) et les données réelles (la pratique))
Offres d'emploi IT
Architecte sécurité des systèmes d'information embarqués H/F
Safran - Ile de France - 100 rue de Paris 91300 MASSY
Ingénieur intégration, validation, qualification du système de drone H/F
Safran - Ile de France - Éragny (95610)
Responsable transverse - engagement métiers H/F
Safran - Ile de France - Corbeil-Essonnes (91100)

Voir plus d'offres Voir la carte des offres IT
Responsables bénévoles de la rubrique Spring : Mickael Baron - Robin56 -