|
Publicité | |||||||||||||||||||||||
|
|
#1 |
|
Membre confirmé
![]() Inscription : décembre 2007 Messages : 236 ![]() |
Bonjour,
J'aimerais savoir si quelqu'un a connaissance de recommandation, préconisations dans le cadre de la programmation java en 1.6. Je recherche un doc du type http://java.sun.com/docs/codeconv/CodeConventions.pdf un peu plus à jour, préconisant par exemple l'utilisation des boucles for améliorées, la pratique de l'autoboxing (ou pas), pour des raisons de perf, de lisibilité ou d'homogénéisation. Merci. ______ |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 356 ![]() |
À ma connaissance cela n'existe pas ; tout le monde suit 90% de ces recommandations ou essaie. Seulement 5% parvient à suivre la recommandation principale : Donne-toi n'importe quelles règles, mais suis-les.
Il me semble que la pratique s'oriente aujourd'hui vers l'usage d'outils style PMD, qui enregistre quantité de règles d'écriture, et font autant de warning quand au code qui ne les respectent pas. Ces outils rendent de grands services, et sont configurables à l'infini. Et sur un cas particulier tu peux demander l'avis d'autres ici même.
__________________
Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java ! Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.
|
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Inscription : septembre 2008 Messages : 71 ![]() |
Sun a en effet édicté des règles de bases mais tu peux largement les enrichir en fonction de contraintes propre à ton activité. Si tu cherches des exemples, divers projets open-source publient leur règles de codage (voir les site d'apache, d'eclipse...).
En parlant d'eclipse, si c'est l'IDE que tu utilises, il existe un bon plug-in qui permet d'intégrer la vérification des règles au développement à l'adresse http://eclipse-cs.sourceforge.net/. De nombreuses règles de base sont déjà configurées (plus complètes que celles de Sun si ma mémoire est bonne), la configuration est simple et il est possible d'écrire ses propres règles. |
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() Inscription : juillet 2007 Messages : 682 ![]() |
Tu peux aussi tenir compte des évolutions apportées par d'autres langages
http://codemonkeyism.com/generation-...ramming-style/ |
|
|
00
|
|
|
#5 | |
|
Membre habitué
![]() Étudiant Inscription : avril 2007 Messages : 133 ![]() |
Citation:
|
|
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 356 ![]() |
Ah je suis bien content de voir que les attributs publics et final trouvent un intérêt !
Il y a quelques temps j'avais eu une discussion sur ce forum pour dire que je "sentais" que lorsque un attribut était final il valait mieux le mettre directement en public au lieu de faire un getter, on m'avait bien sûr fait remarquer que c'était pas prudent, voire pas normal, ou pire déconseillé, et je vois qu'une tendance est en train de se faire jour en ce sens, merci les américains ! Je fiche immédiatement ce site sur ma page netvibes.
__________________
Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java ! Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.
|
|
|
00
|
|
|
#7 |
|
Inactif
Inscription : avril 2008 Messages : 889 ![]() |
codemonkeyism.com ? Crénondidiou, ce site me pique les yeux de par les mauvaises pratiques qu'il propose
![]() Sinon, comme ça a été cité : CheckStyle, aussi dispo en plugin pour Eclipse et NetBeans (centres de mise à jour NetBeans pour CheckStyle 1 : http://www.sickboy.cz/checkstyle/aut...autoupdate.xml, et CheckStyle 2 : http://www.sickboy.cz/checkstyle/aut...toupdate-2.xml) Une merveille. |
|
|
00
|
|
|
#8 | ||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 281 ![]() |
Salut,
Citation:
Perso je vois très peu d'intérêt à cela... si ce n'est de limiter l'évolution du code ! Citation:
Je vois très peu d'intérêt dans tous cela, mis à part pour les remarques #1 concernant final et #5 sur les interfaces... a++ |
||
|
00
|
|
|
#9 | |||
|
Membre régulier
![]() Inscription : septembre 2008 Messages : 71 ![]() |
Citation:
Et, comme par un effet du hasard, les IDE peuvent souvent rajouter les mots clef final pour nous partout où c'est possible. Citation:
Citation:
|
|||
|
|
00
|
|
|
#10 | ||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 281 ![]() |
Salut,
Citation:
Citation:
Code :
Citation:
Citation:
a++ |
||||||
|
00
|
|
|
#11 | |
![]() ![]() |
Citation:
Quand au mot clé final sur les méthodes, avec un telle pratique, bonne chance lorsque tu gèrera des projets avec de nombreux sous projet. Quand le projet X aura besoin de faire une sous classe de Y pour une raison quelconque et que pour ça faut modifier le projet Y mais que le projet Y il est géré par un autre équipe et que l'équipe en question peut pas te faire une release stable de la dernière version de Y avant dans 3 semaine et que ton projet X doit être fini dans 2 semaines.... Tu va finir avec un fork de Y spécialement pour ton projet avec juste un mot clé retiré... Et ce our chaque librairie ou le problème se rencontrera :s Honnêtement, y a rien de plus pénible que de tomber sur une méthode final que t'as besoin d'écraser dans une librairie sur laquelle t'as pas le controle. Je connais pas beaucoup de méthode final dans l'api de sun. Il y en a partout sur Vector. Combien de fois j'ai pas entendu des programmeur autour de moi raler parce qu'il ne pouvaient pas hériter de Vector ....
__________________
⥀⥁ Чиз faq java, cours java, javadoc N'oubliez pas de marquer vos discussions et de poucer les réponses qui vous ont été utiles.
|
|
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 356 ![]() |
Bon, alors, ce qui n'était pour moi qu'une réflexion mise en pratique critique (les attributs publics finaux) devient brutalement une sorte de tout ou rien. Ainsi va l'informatique : des extrêmes, des chapelles. Tout placer en final sans autre forme de procès me semble ridicule.
Cet article, qui semble le proposer, propose aussi d'autres approches de la programmation (par objets immuables, par clones, etc). C'est cette autre approche qu'il faut comprendre et critiquer, pas le fait de mettre final à droite et à gauche. Concernant les attributs final publiques, j'y voyais d'abord une plus grande élégance ; désolé, mais moi je trouve du plus total ridicule que 95% de mes getTruc se réduisent à un return truc, sous prétexte de ménager des évolutions inexistantes dans 95,95% des cas. Parrallèlement, je me suis rendu compte que l'usage de final sur les attributs me guidait pour une initialisation plus claire de mes objets, et une plus grande clarté du code. Mais cela ne m'empêche pas de conserver des attributs non final, lorsqu'ils varient durant la vie du projet. À partir de là, si pour les attibuts final l'usage est mieux ciblé, s'ils sont initialisés à un seul endroit parfaitement contrôlé (la non init d'un attribut final est une faute de syntaxe, donc visible dès la compilation), il me semblait jouable de parier sur le fait que cet attribut présentait une grande stabilité, par rapport au rôle propre de cet objet, et donc que l'on puisse se passer de get... et privilégier l'accés direct. Et je rejoins totalement l'article sur ce point qui insiste sur la notion de rôle (mais en y adjoignant des interfaces, ce qui évidemment n'est pas pratique pour les attributs...) De plus un attribut final, ne pouvant s'initialiser que par le biais du constructeur, un constructeur n'étant pas redéfinissable en java (il est forcément appelé par ses héritiers), est en quelque sorte transparent devant l'héritage : il est forcément maintenu. Cela oblige aussi à considérer que, quelque soit ce que fait l'extérieur sur cet attribut, l'objet conteneur est capable de rendre un traitement correct. Mais que l'on fasse getTruc ou public truc cela revient au même, puisque de toutes manières truc se trouve libre à l'extérieur. L'avantage de la première forme étant qu'on peut contrôler et réagir un minimum à sa sortie, l'avantage de la seconde forme est que... on ne peut pas le faire : on est sûr que la lecture d'un attribut d'objet ne modifie pas cet objet, ce qui est une règle fondamentale de bonne programmation, sauf erreur. Last but not the least, on réfléchit mieux sur les get et set, qui ne sont plus uniquement des garanties de bonnes programmation objet, mais donnent une indication sur les états d'un objet. L'article donne un autre point de vue de la chose, en considérant qu'un objet doit être tout final, donc sans état, rejetant le marquage de ces états sur les traitements et les échanges, enfin je suppose. Peut être ?
__________________
Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java ! Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.
|
|
|
00
|
|
|
#13 | |
|
Membre confirmé
![]() Inscription : mars 2007 Messages : 298 ![]() |
Citation:
![]() J'ai eu un cas similaire avec une méthode private dans une librairie ... je suis passé par l'introspection pour modifier à chaud .... pas terrible Il vaut mieux mettre les méthodes à protected (que private Pour répondre à la question initiale, je conseillerait l'utilisation d'outil integrés à l'ide; les documents sont trop peu souvent lu par les équipes .... |
|
|
|
00
|
|
|
#14 | |||||||||||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 281 ![]() |
Citation:
Citation:
Citation:
Citation:
Ce n'est pas parce que ton attribut est final, qu'il le restera pour toujours dans les évolutions de ta classe. Il y a de multiple raison qui font qu'un attribut peut évoluer sans que la propriété qu'il représente n'en fassent autant... Et je ne parle pas du fait qu'il ne peut pas y avoir de surcharge d'attribut... Citation:
Citation:
Citation:
Pour en revenir à l'article en question, le problème c'est qu'il se présente comme des généralités, mais cela s'applique pour la plupart des points à des cas très particulier...
a++ |
|||||||||||||||
|
00
|
|
|
#15 | |
![]() ![]() |
Citation:
Ne pas hésiter à utiliser le refactoring autant que nécessaire. Extraire une interface dans un IDE, et refaire tous les code qui utilise la classe pour qu'ils utilisent l'interface, ca met 30 secondes dans un IDE moderne.
__________________
⥀⥁ Чиз faq java, cours java, javadoc N'oubliez pas de marquer vos discussions et de poucer les réponses qui vous ont été utiles.
|
|
|
|
00
|
|
|
#16 | |
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 281 ![]() |
Citation:
C'est pour cela que je disais qu'il ne fallait pas en abuser ! Par contre il est bien de penser aux interfaces standard lorsque cela s'applique, comme Iterable/Closeable/Readable/Appendable... a++ |
|
|
00
|
|
|
#17 | |||||
|
Membre régulier
![]() Inscription : septembre 2008 Messages : 71 ![]() |
Et ben, ça a fait couler de l'encre (électronique)
Citation:
Citation:
Citation:
D'abord, on ne casse absolument pas les possibilités d'évolution. Ce qui ne peut être fait par dérivation peut toujours l'être par composition et délégation (méthode qui est d'ailleurs celle recommandée par les auteurs du GoF et qui a le gros avantage d'éviter les overrides avec oubli d'appel de la "super" méthode). Ensuite, lorsque on fournit une certaine bibliothèque, qui possède des API, pour peu que celles-ci aient été bien conçues (cas certes rarissime), elles doivent aussi avoir une méthode d'emploi bien déterminée. Le fait que tout le monde puisse tout dériver et faire des overrides sur tout et n'importe quoi est une très sérieuse source de problèmes ET de perte de temps. En effet, une personne qui développe ne perdra pas de temps à savoir quelle méthode il doit dériver pour générer tel ou tel comportement si la plupart de celles qui sont disponibles ne peuvent pas l'être. Pour ce qui est du JDK, le fait que rien ne soit finalisé pose parfois des problème (revérifie bien tchize_ mais Vector n'est pas final et ne comporte pas de méthode final). Petit exemple: JComponent. Cette classe est effectivement basée sur le fait qu'on peut tout dériver pour surcharger tous les comportements (dessin du composant, des bordures, des enfants). Combien de fois j'ai dû régler des problèmes (pas dans mon équipe) de personnes qui ont surchargé paint() de manière brute et pas paintComponent(), si possible sans appeler super.paint() et qui n'arrivaient pas au résultat attendu (un petit cas parmi d'autres). L'exemple du JDK pas la seule référence en matière de bibliothèque. Prenons par exemple SWT. Celle-ci interdit (en runtime, certes) la dérivation des classes des widgets. Tiens donc Tout ça pour dire que, dans le cadre du pilotage de développement volumineux, il faut pouvoir organiser de la manière la plus précise possible le travail des gens, et l'organisation c'est:
D'ailleurs les (quelques une parmi beaucoup d'autres) contraintes que j'évoque ici, je ne les ai pas sorties su chapeau. Elles sont le résultat d'un consensus discuté par un collège d'experts et leur application a été notoirement profitable. Citation:
Citation:
Je suis d'accord aussi sur la problématique de portée. Ces pratiques ont une nature plutôt "interne". Mais pour résumer, je dirais que je ne suis pas catégorique sur le fait de systématiquement masquer les attributs. Bon aller, c'est tout pour l'instant... Dernière modification par Yomhgui ; 19/08/2009 à 11h37. |
|||||
|
|
00
|
|
|
#18 | |||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 281 ![]() |
Citation:
Disons que j'aime bien cela non pas pour des raisons d'optimisations, mais simplement pour éviter de manipuler deux références vers le même objet... Citation:
Citation:
Si une méthode ne doit pas être dérivé, elle doit bien sûr être final bien sûr ! a++ |
|||
|
00
|
|
|
#19 | ||
|
Membre régulier
![]() Inscription : septembre 2008 Messages : 71 ![]() |
Citation:
Maintenant, dans le cas de code sur lequel on a pas la maîtrise, on peut faire face à des situations un peu plus délicates. Il est vrai que si tu veux passer à une méthode qui attend un Vector (par exemple) une instance qui possède des comportements légèrement différents d'un Vector standard, pas d'autres moyens que de dériver. Ceci dit:
Citation:
|
||
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 356 ![]() |
Les possibilités d'évolution ne sont nullement cassées avec des attributs finaux publics, et c'est une légende urbaine que de dire qu'avec des getters et des setters elles sont facilitées.
Encore pire, les possibilités d'évolution ne sont nullement facilités par la multiplication des interfaces, l'accumulation des configurations ou que sais-je encore. Ce qui facilite l'évolution est de comprendre ce que l'on informatise, comment cette chose évolue, et comment l'écrire dans le langage que l'on utilise. Ce n'est pas le code seul qui évolue, c'est le couple chose + écriture. Si l'on ne pense qu'à l'évolution du code, alors effectivement on multiplie les interfaces et les getters, et l'on voit apparaître ces horipilantes FactoryBuilderImplImpl communes aux bibliothèques XML. Un attribut final public a comme signification, en gros : - cet attribut se contrôle entièrement à la création de l'objet, - vous pouvez toutefois utiliser librement cet attribut, l'objet se comportera de façon logique et compréhensible à toutes vos modifs sur cet attribut. - en lui même il fait partie des constituants visibles de l'objet, non de son état (mais il peut y avoir des constituants de constituants qui marquent un état). Par exemple, une roue de bagnole. Il va de soi qu'une bagnole a des roues a sa construction, toutefois on peut lui retirer (c'est pas tout à fait final, je l'admets) ou modifier ses roues, et si vous voulez faire évoluer la bagnole vous devez aussi réfléchir à l'évolution des roues ce qui me parait parfaitement logique, mais cela n'en bloque pas les évolutions. C'est le contraire qui est illogique : prétendre faire évoluer les roues sans considérer une évolution de la bagnole est complètement illusoire. Enfin, question état, que la bagnole roule ou pas, elle a des roues (cela ne manifeste pas un changement d'état), roues que l'on voit (c'est mieux), et toujours les mêmes ; par contre, si elle roule, alors les roues tournent. Un changement d'état de l'objet peut impliquer un changement d'état des constituants, mais pas forcément de la présence de ces constituants.
__________________
Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java ! Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com