Qu'est-ce qui fait un «bon style» en Java? [fermé]

9

J'avais posé cette question sur Stackoverflow, et avant qu'il ne soit hué, j'ai reçu la suggestion utile de Péter Török que ce serait un meilleur endroit pour la poster.

Je programme en Java depuis quelques années. J'ai souvent discuté des décisions de conception avec des collègues sur la base de ce qui constitue un «bon style». En effet, il existe un certain nombre de questions / réponses sur StackOverflow qui discutent d'une conception en fonction du fait que quelque chose est de «bon style».

Mais qu'est-ce qui fait le «bon style»? Comme beaucoup de choses, je le sais quand je le vois ... mais je voulais avoir une meilleure idée que ma conscience en disant que ce design ne me semble pas bien.

À quoi pensez-vous pour produire un bon code bien conçu?

(Je reconnais que c'est quelque peu subjectif, car ce qui est du «bon style» dépendra de la tâche à accomplir). (De plus, je dois ajouter que je ne suis pas intéressé par les styles d'équipe - par exemple "nous utilisons des retraits de 2 espaces plutôt que 4" ..., et je ne suis pas intéressé par les conventions du code Java.)

Edit: merci pour toutes les bonnes réponses / commentaires jusqu'à présent. Je suis particulièrement désireux de trouver des réponses qui aideraient à codifier les choses qui font que la conscience (et peut-être l'estomac) d'un programmeur est déchirante?

paiement
la source
Parmi de nombreuses autres choses énumérées ici, je m'assurerais certainement de simplement déclarer que les ordinateurs peuvent compiler du code à peu près de la façon dont vous l'écrivez, mais en fin de compte, le code doit être lisible par l'homme . Commentez comme un fou! Un bon test que j'aime utiliser: une personne pourrait-elle lire uniquement mes commentaires pour savoir ce que fait le code, ce que devraient être ses entrées et sorties, et les algorithmes utilisés pour le faire?
Brian
1
@brian, expliquez comment votre code . Laissez des commentaires réels pour expliquer pourquoi . En d'autres termes, ne commentez pas comme un fou (dans le cas général)
4
Brian: Cette technique n'est certainement pas considérée comme une bonne pratique. La bonne pratique courante consiste à rendre votre code aussi auto-documenté que possible (avec des noms de variables clairs et une cohésion de fonction), avec des commentaires pour expliquer le "pourquoi" et non le "comment". Les commentaires qui expliquent chaque petit détail sont généralement considérés comme distrayants et souvent dangereux, car les gens sont moins susceptibles de conserver les commentaires que le code.
Casey Patton
1
@Brian: Votre dernière déclaration dit tout. Le code doit être lisible. Les commentaires deviennent obsolètes. Le code ne fait jamais. Si vous ressentez le besoin de commentaires, refactorisez jusqu'à ce que le code soit si clair que les commentaires ne feraient que répéter ce que dit le code. Le seul bon commentaire est celui qui dit pourquoi le code fonctionne d'une manière particulière - comme pour éviter un bogue dans une bibliothèque tierce - afin que quelqu'un ne revienne pas et ne le change pas en quelque chose qui ne fonctionnera pas pour une raison ce n'est pas immédiatement apparent.
Ryan Stewart
2
J'ai officiellement été humilié. Désolé @amaidment. Je suppose qu'il faut rechercher de bonnes normes de codage en ce qui concerne les commentaires.
Brian

Réponses:

17

Quelques brèves remarques:

Ryan Stewart
la source
3
+1. Peut-être le plus critique: minimiser le code dupliqué. Si vous êtes tenté de couper et coller plus de quelques jetons, vous devez extraire une fonction. Même si la fonction est une seule ligne de code.
kevin cline
4
Sur le code dupliqué, je prends la position suivante. Couper et coller = ok. Il s'agit simplement de déplacer du code (en supposant que vous utilisez coller une fois). Copiez et collez = horrible. Si vous supprimez simplement le bouton de copie de votre vocabulaire, vous êtes plus susceptible de faire la bonne chose.
jsternberg
@jsternberg: +1 pour la distinction couper / copier, mais je remarque que beaucoup de gens disent "couper / coller" quand ils signifient "copier / coller". Je ne sais pas comment la distinction a été perdue.
Ryan Stewart
5
Ne te répète pas. Ne te répète pas. Ne te répète pas.
configurateur
1
@configurator, vous sentez un peu drôle ...
9

Ajout à la liste de Ryan:

  • Suivez les principes SOLID
  • Assurez-vous que votre code n'a pas trop de complexité cyclique
  • Test Driven Java est toujours une bonne chose
  • Si vous avez une xFactoryFactoryclasse, vous vous trompez :-)
  • Étant donné les bibliothèques open source de l'écosystème Java, réinventer la roue est un mauvais style
  • Utiliser l' heure Joda pour la date et l'heure

Je m'arrête là.

Martijn Verburg
la source
2
Mais qu'en est-il de la HammerFactoryFactoryFactoryclasse? ;-)
Wayne Molina
@Wayne, les usines indiquent que certaines décisions doivent être retardées, et FactoryFactoryFactories indique qu'il y a une décision qui devait vraiment être prise au moment de l'exécution mais qui ne pouvait pas.
Je sais, j'étais sarcastique et je faisais référence à cet article pour expliquer pourquoi alors J2EE était trop complexe, avec HammerFactories et HammerFactoryFactories et je pense que HammerFactoryFactoryFactories. :)
Wayne Molina
@Martijn - merci pour le lien SOLIDE; Je ne l'ai jamais rencontré auparavant. Vous proposez d'utiliser JodaTime; est-ce juste une aversion (appropriée) pour les classes Java Calendar / Date? Qu'en est-il du JSR310 (le successeur de JodaTime)?
paiement
J'espère que JSR-310 arrivera à Java 8 (il y a un tas d'entre nous qui se préparent pour essayer d'aider à y arriver, contactez-moi si vous voulez vous impliquer). Pendant ce temps, l'heure Joda est la norme de facto pour traiter la date et l'heure en Java. Il y a tellement de problèmes avec le système de date et de calendrier de Java que je ne sais même pas par où commencer ;-). Le tueur est que les dates sont mutables et qu'il n'y a pas de concept d'un instant ou d'une période ou ... non, je vais m'arrêter là :-).
Martijn Verburg
1

Tout en appréciant les réponses des autres, j'ai pensé qu'il était juste de partager quelques-unes des choses auxquelles je pense en essayant d'écrire du bon code:

  • que faut-il savoir sur cette classe / méthode / variable? c'est-à-dire où cette connaissance devrait-elle vivre?

  • comment ce code peut-il affecter la mémoire / les performances de mon application? (Je reconnais que `` l'optimisation prématurée est la racine de tout mal ''; je ne suggère donc pas de passer beaucoup de temps à optimiser, mais plutôt une conscience lors de l'écriture initiale de mon code.)

  • est-il clair (à partir du code et des structures de code) ce que cela fait? (J'essaie de suivre la maxime: "Efforcez-vous de ne pas permettre aux gens de comprendre, efforcez-vous de rendre les gens incompréhensibles".)

paiement
la source
1

Lisez la classe String et ArrayList pour d'excellents exemples de programmation Java appropriée. Mais ils sont très concis, presque de style C, ce qui n'est pas nécessairement le meilleur pour le code maintenable avec des documents java minimaux. La pratique courante dans ma boutique n'est pas de commentaires, donc j'essaie de commenter par code en utilisant des noms var verbeux camelCase et une utilisation excessive de nouvelles lignes pour délimiter une ligne de pensée d'une autre. Je continue de débattre sur l'utilisation d'onglets pour séparer les variables de leurs valeurs. Les onglets peuvent améliorer la lisibilité, IMO, mais seulement lorsqu'ils sont effectués de manière minimale et c'est très subjectif. Je trouve que ça concerne vraiment le public. Il n'y a pas de meilleure réponse ici.

carlmart
la source