IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

La multiplication des annotations [Débat]


Sujet :

Java

  1. #1
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Points : 1 267
    Points
    1 267
    Par défaut La multiplication des annotations
    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 ?

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 321
    Points
    4 321
    Par défaut
    Pour ma part je trouve que les annotations sont un des points fort du langage.
    Hibernate qui est un outil très puissant n'était pas aussi efficace lorsque les annotations n'éxistaient pas encore. Quelle perte de temps que de taper de longs fichier de mapping en xml ...
    L'ORM avec JPA est devenu très facile à mettre en place et n'a que peu de rivaux (si ce n'est aucuns), et ceci grâce aux annotations.

    Les annotations sont maintenant omniprésentes dans nos codes sources, et je pense que c'est une manière efficace de "marquer" une classe.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Le problème à mon sens n'est pas dans les annotations mais plutôt dans le fait qu'elles n'ont pas de référence (nominative) sur l'outil cible.
    Dans le cas que tu cites (Seam), c'est assez flagrant.
    On mélange des annotations JPA avec des annotations SEAM, on ne sait plus trop à quoi elles se rapportent.
    Bon, on peut toujours regarder l'import pour s'en sortir...

    Ceci dit, je ne remets pas en cause les annotations, la proximité avec la propriété ou la méthode cible est un plus par rapport aux fichiers externes.

    Un autre avantage, le serveur cible va les interpréter idéalement... on pourrait imaginer la "traduction" d'une annotation différemment d'un serveur à l'autre...

    Quelle perte de temps que de taper de longs fichier de mapping en xml
    Pour Hibernate, l'argument de kazou sur les fichiers hbm ne tient pas, l'outil les générant également
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Points : 1 267
    Points
    1 267
    Par défaut
    OK pour le marquage quand il y a une annotation, par exemple @Stateless ou @Id : on comprend vite que c'est spécial.

    Mais quand il y a 3 annotations dont certaines "tordues" sur une fonction, en quoi cela remplace t-il une ligne de code dans le constructeur ou la fonction ?

    Exemple :
    @Logger
    private Log logger;


    On ne peut pas faire par exemple Log4j.setLogger(this.logger) dans le constructeur ? (oui, je ne connais pas bien log4j ).
    Si un framework bien particulier propose 3-4 annotations typiques de sa spécifité, ok. Mais je trouve que l'écriture fait un peu blackbox : on sait pas trop ce qu'il y a derrière.

  5. #5
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 321
    Points
    4 321
    Par défaut
    Citation Envoyé par nicorama Voir le message
    Mais quand il y a 3 annotations dont certaines "tordues" sur une fonction, en quoi cela remplace t-il une ligne de code dans le constructeur ou la fonction ?
    Autant je suis de l'avis de dire que les annotation sont un réel plus à Java, autant je suis de ton avis sur le point où trop d'annotation nuit à la documentation naturelle du code source. On peut un perdre en visibilité et cela peut compliquer la compréhension du code.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  6. #6
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Pour ce qui me concerne, je suis un grand fan des annotations.

    J'utilise régulièrement JPA, Hibernate et Spring et je trouve beaucoup plus agréable et fin une configuration par annotation. Par exemple pour une entité JPA, on voit tout de suite dans la classe les propriétés JPA/Hibernate, on a pas besoin d'aller lire un fichier XML imbitable pour comprendre comment est mappé cette classe.

    Il m'arrive également de créer mes propres annotations, mais c'est vrai que je n'en utilise pas beaucoup.

    Pour ce qui est de la clarté, toutes les annotations que j'utilise (jpa, hibernate, spring, junit et annotations standards) m'ont toujours semblé suffisamment claires. Il est sûr qu'il faut être conscient de ce qui se passe derrière, mais une fois qu'on sait qu'est-ce qui est fait avec une annotation, on ne se pose pas la question.

  7. #7
    Expert confirmé
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Points : 4 883
    Points
    4 883
    Par défaut
    De même que Baptiste, depuis les annotations, le developpement n'a cesse de simplifier le code et la rapidité de ce dernier.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Le principe d'une annotation, c'est justement de ne pas savoir ce qu'il y a derrière, juste de ce qu'elle peut faire.

    Personnellement les annotations, je ne pourrais plus m'en passer. Et n'en utiliser que 3 ou 4 du langage alors qu'il peut y en avoir des milliers, ce serait comme n'utiliser que java.lang alors qu'il existe tous les packages à côté.

    Pour ajouter un comportement spécifique via AOP, y'a rien de tel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Inject // Guice... Ah que c'est bon.
    @Log({ENTRY,EXIT,THROWING}) //Log de l'entrée, de la sortie de la méthode et d'une éventuelle exception
    @Property // Et hop un firePropertyChange.
    public synchronized void setStatus (@NonNull Status status) { // et pour finir, un peu de validation
      this.status = status;
    }
    Ce genre de code (tiré d'une de mes applications) ne me dérange pas et augmente clairement ma productivité... une fois la fonctionnalité écrite.

  9. #9
    Membre éclairé

    Inscrit en
    Février 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 122
    Points : 659
    Points
    659
    Par défaut
    Pour moi les annotations apportent d'une part une simplicité de développement, et donc un gain de productivité.
    Mais en plus de ça elles facilitent la relecture du code, on voit tout au niveau de l'objet au lieu de devoir aller regarder dans plusieurs fichiers xml à quoi correspond tel attribut de tel objet.

    C'est beaucoup plus clair, après c'est comme tout il ne faut pas en abuser.

  10. #10
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 125
    Points : 175
    Points
    175
    Par défaut
    Difficulté de refactoring ? Les annotations font partie du langage et sont très bien comprises par les grands ide. Je ne vois pas en quoi renommer une méthode diffère de renommer une annotation, par exemple. En comparaison, cela peut être un véritable problème en xml, où on ne peut pas garantir le refactoring dans tous les cas.

    Je ne comprends pas trop bien ton argument, "Difficultés de compréhension par l'équipe par rapport à une api standard". Les annotations introduites par une api font partie de l'api, où est le problème ?

  11. #11
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Pour ma part, j'utilise les annotations assez fréquemment (JPA, Spring, TestNG/JUnit, ...). Je trouve l'outil fort intéressant et puissant. Comme cela est dit plus haut, les IDEs s'en accommodent très bien (refactoring, etc).

    Cependant, je mettrais quand même des bémols : trop d'annotations tuent les annotations. Un fichier source truffé d'annotations (5, 6 voire plus sur un seul élément !) devient assez vite difficilement lisible (avis personnel cependant).

    Par ailleurs, contrairement aux fichiers xml, les annotations sont des éléments de code, donc intrusifs par rapport au sens. Il est plus compliqué de modifier un configuration via les annotations que via un fichier xml (et éventuellement de l'aop). Dans le cas par exemple de JPA, cela ne pose pas réellement de problèmes, on ne modifie pas le modèle sans modifier les classes sous-jacentes. Mais dans le cas d'un logger, dont on donne par annotation le niveau (info, debug, etc.), alors le modifier signifie recompiler... Ce qui est fort dommage.

    Enfin, en utilisant des annotations, on utilise certes des POJOS mais on devient de fait liés à une API particulière (pour JPA, c'est standard donc par de pb, par contre pour Spring par exemple...).

    Pour conclure, je dirais : utilisez les annotations, en prenant en compte les avantages et inconvénients que leur utilisation implique. Si les inconvénients ne vous gênent pas, alors foncez. N'hésitez pas, vous gagnerez du temps, à coup sûr.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  12. #12
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 50
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par Patriarch24 Voir le message
    Cependant, je mettrais quand même des bémols : trop d'annotations tuent les annotations. Un fichier source truffé d'annotations (5, 6 voire plus sur un seul élément !) devient assez vite difficilement lisible (avis personnel cependant).

    Par ailleurs, contrairement aux fichiers xml, les annotations sont des éléments de code, donc intrusifs par rapport au sens. Il est plus compliqué de modifier un configuration via les annotations que via un fichier xml (et éventuellement de l'aop).

    Enfin, en utilisant des annotations, on utilise certes des POJOS mais on devient de fait liés à une API particulière (pour JPA, c'est standard donc par de pb, par contre pour Spring par exemple...).
    Personnellement j'essaie d'éviter et je préfère de loin les fichiers XML pour les raisons évoquées par Patriarch24.

  13. #13
    Membre habitué Avatar de Rizzen
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 115
    Points : 157
    Points
    157
    Par défaut
    Je suis super pour les annotation mais dans la limite ou c'est utilisé avec discernement et pas à tout bout de chant. comme dit plus haut trop d'annotation tu les annotations mais c'est réellement un plus de Java qui est formidable.
    Java'ldire à tout le monde

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alesque Voir le message
    Personnellement j'essaie d'éviter et je préfère de loin les fichiers XML pour les raisons évoquées par Patriarch24.
    Ben moi, c'est l'inverse... On ne parle pas de XM(HELL) pour rien...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    les annotations sont, pour ma part clairement un avantage, mais il faut savoir faire la part entre ce qui est fixé dans le code par annotation et ce qui doit nécessiter une configuration plus souple par fichier xterne. Pour reprendre l'exemple d'hibernate. Quand vous développez un api a usage interne, vous fixez une fois pour toutes vos tables et vos noms de colonne. Les seuls changement qui restent possibles sont structurels (ajout d'un champ/ d'une classe et mapping associé). Dans ce cas, oui aux annotations. Par contre, pour les programmes redistribués, ca deviens plus tendancieux. On a chez nous une application JIRA. Pas accès au code source. Cependant, besoin de faire tourner deux versions différentes de JIRA sur la même base de données. Hop, un coup d'oeil sur le fichier de mapping hibernate et on fait un rename des tous les noms de tables. Si JIRA avait été mappé par annotation, on l'aurais eu bien profond

    Autre exemple, les différentes bases de données. Quand des applications hibernate sont distribuées, il arrive de devoir modifier les fichiers de mapping en fonction du type de base de donnée. Certains noms de colonne ne sont pas autorisés (souvent car trop longs), certaines bases utilisent des sequences, d'autres des autoincrement, il faut donc pouvoir réadapter l'application en fonction de la db sur laquelle elle va tourner, et là, un fichier de mapping, ca deviens indispensable

    edit partiarch: pour les loggers, il me semble que l'idée est d'injecter le logger (d'ou l'annotation), pas de le configurer dans le code, justement. Il reste le fichier de config qui dit quelle logger est configuré comment. Seuls les points d'injection sont annotés

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Pour reprendre ton exemple des logs et de leur seuil, il est absurde de définir le niveau d'un log dans une annotation : les annotations, même si elles le permettent, ne devraient pas gérer ce comportement puisqu'il tient plus des préférences de l'utilisateur final. Au pire des cas, elles ne devraient être que des valeurs par défaut.

    Tout ce qui doit être recompilé pour être changé est de la mauvaise utilisation des annotations (parmi les annotations runtime, entendons-nous).

    Le principal problème, c'est que les annotations sont trop méconnues et qu'elles commencent à suivre une sorte de mode "les annotations, c'est cool, utilisez-les !" à outrance, sans discernement entre la bonne et la mauvaise utilisation. On ajoute des annotations sans comprendre qu'on peut en réutiliser. Dans ce contexte, oui, le pullulement des annotations n'est pas une bonne chose. Dans le cas contraire, c'est tout bon.

  17. #17
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    En lisant ce sujet, j'ai l'impression que certains pense qu'il est obligatoire de recompiler pour changer un comportement défini par annotation.

    Un grand nombre d'annotation supporte une surcharge par XML

  18. #18
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Un grand nombre d'annotation supporte une surcharge par XML
    Ce n'est pas toujours le cas, même si beaucoup de frameworks proposent en effet ce genre de comportement. Sinon, il faut recompiler

    pour les loggers, il me semble que l'idée est d'injecter le logger (d'ou l'annotation), pas de le configurer dans le code, justement.
    Ok, mauvais exemple. Je voulais simplement dire : les annotations, ok, mais pas pour faire n'importe quoi
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Je recommande l'utilisation des annotations.

    Cependant, une chose que j'aimerai éclaircir...
    J'utilise Spring 2.5 avec les annotations stereotypes (@Repository, @Service, @controller)

    Avant cela, l'ensemble des beans gérés par Spring été clairement définit dans un fichier xml. Avec les annotations par contre, nous avons moins de contrôle quant à cela.
    Existe-t-il un outil qui permet de généré un fichier xml avec l'ensemble de nos beans annotés? Ceci afin de retrouver notre liste de beans gérés par Spring...

    Merci.

    Bertrand

  20. #20
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Je vais faire office de mouton noir parmis cette foule de : ca simplifi, c'est plus rapide, c'est ...etc...

    En fait je suis contre l'usage des annotations, je les vois comme une véritable pollution du code qui marche d'une facon parallele au Java.

    Pour moi, avoir recours aux annotations c'est avoir failli dans la bonne conception de l'application.

    En fait c'est simple si on regarde une API type utilisant les annotations : JAXB.
    Elle enfrain beaucoup des règles de programmations java, acces aux constructeurs, aux variables et aux methodes privées, aucun respect de la portée des classes.
    Ce genre de comportement qui consiste à désactivé les sécurités était jusqu'ici réservé à la sérialization d'object.

    Je vous renvois sur mon opinion de jaxb dont une partie des critiques sont emputables aux annotations : Pensez vous que JaxB a un avenir dans le monde professionnel ?/

    Je ne peux me fier qu'a ce que j'ai expérimenté avec jaxb pour me faire une idée, mais le fait que cette techno soit dans la JVM me fait penser qu'elle utilise tout de même convenablement les annotations.

    Actuellement nos projets utilisent enormement jaxb et des memes classes sont presentes sous plusieurs version XML différente (evolution des normes ISO/OGC).
    Chaque nouvelle version apporte son lot de classes dupliquées avec des annotations différentes, ce qui est particulierement dramatique en volume, à long terme et en maintenance. Le probleme est surement le meme avec hibernate.

    Les annotations ne gerent pas les versions d'annotations ce qui les empeches d'etres viables pour les projets en continuel developpement. Elles ne servent qu'a gagner du temps, et pour les commerciaux le temps c'est de l'argent, ce qui explique l'usage abusif qui en est fait, surtout pour tout ce qui est binding principalement.

    Toutefois tout n'est pas noir, quand il n'y a pas de versions a gérer et qu'il ne s'agit que de mecanique interne à l'application alors ca reste un usage raisonnable.

    le mouton noir
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

Discussions similaires

  1. [Débat] La multiplication des annotations
    Par nicorama dans le forum Langage
    Réponses: 0
    Dernier message: 09/04/2009, 14h38
  2. Multiplication des enregistrements
    Par crovette51101 dans le forum Access
    Réponses: 5
    Dernier message: 29/12/2006, 10h18
  3. [JDK 5.0] Intérêt des annotations ??
    Par pitoubicou dans le forum Langage
    Réponses: 7
    Dernier message: 04/05/2006, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo