La pire norme de codage que vous ayez eu à suivre? [fermé]

77

Avez-vous déjà eu à travailler selon des normes de codage qui:

  • A considérablement diminué votre productivité?
  • Ont-ils été inclus à l'origine pour de bonnes raisons, mais ont-ils été conservés longtemps après que la préoccupation initiale soit devenue sans objet?
  • Étaient dans une liste si longue qu'il était impossible de se souvenir de tous?
  • Vous avez pensé que l'auteur essayait juste de laisser sa marque plutôt que d'encourager de bonnes pratiques de codage?
  • Vous ne saviez pas pourquoi ils étaient inclus?

Si oui, quelle est votre règle la moins préférée et pourquoi?


Quelques exemples ici

final
la source
4
Au fait, j'ai déjà posé une question similaire (mais pas tout à fait la même) sur SO: au fait, stackoverflow.com/questions/218123/…
Brian R. Bondy, le
@ Brian, merci, j'avais vu votre question, mais oublié à ce sujet.
fin
4
Le véritable problème des normes de codage est le temps et les efforts gaspillés pour se demander si elles sont correctes ou non. Rien ne vaut une bonne guerre d'accolades pour créer des conflits internes ...
MZB

Réponses:

97

Cela peut ébouriffer quelques plumes, mais les normes qui imposent des commentaires de bloc basés sur un modèle en haut de chaque méthode me dérangent toujours.

1) Ils sont toujours obsolètes, car ils sont trop éloignés du code qui fait le travail pour que vous remarquiez lorsque vous mettez à jour des choses. Les mauvais commentaires sont pires que pas de commentaires.

2) Ils ne font souvent que répéter des informations déjà contenues dans l’outil de contrôle de source, mais moins précises. Par exemple: Dernière modification par, liste des date / raisons de modification.

JohnFx
la source
12
Je trouve (au moins maintenant, plus tôt à l'école, cela semblait étrange) que les commentaires sont une mauvaise pratique
Shady M. Najib
14
Non seulement cela, mais j'ai aussi constaté que les frais généraux associés à la création d'un nouveau fichier de classe lorsque vous deviez placer une charge supérieure en haut de la table dissuadaient les développeurs de créer de nouvelles classes et encourageaient d'énormes classes lourdes et donc une mauvaise conception.
Gaz
13
Être en désaccord! Nous n’ajoutons pas d’informations inutiles sur les redondances, mais une explication textuelle de ce que fait la fonction (dans le fichier .h) et elle est si utile! Bien sûr, nous nous engageons à le maintenir en phase avec le code.
Wizard
5
@ Shady M Najib est-il toujours mauvais ou mauvais lorsqu'il est autorisé à rester incontrôlé / non maintenu? En règle générale, un bon code fera en sorte que son objectif devienne suffisamment évident pour ne pas avoir à commenter - mais ce n'est pas toujours le cas et j'estime que dans ces scénarios, le commentaire est crucial. Je ne peux pas penser à une mauvaise raison d'inclure des commentaires XMLDoc.
Nathan Taylor
7
Un bloc expliquant ce que cela fait est bien. Un bloc qui ne fait que réitérer les types et les noms des arguments et la valeur renvoyée est mauvais. Lorsque je devais travailler avec une norme obligeant celle-ci, j'ai écrit un script emacs pour en générer automatiquement la majorité.
AShelly
130

Si un professeur avait déjà demandé, nous avions au moins un commentaire pour chaque ligne de code.

//Set x to 3
var x = 3;

//if x is greater than 2
if(x>2){

    //Print x
    Print(x);
}

C'était assez ridicule.

Fishtoaster
la source
10
N'est-ce pas simplement pour que le professeur sache que vous savez exactement ce qui se passe?
John MacIntyre
80
Je pense que ce qui se passe est clair, ce n'est pas de l'éducation.
Dan Ray
18
L'exemple que vous avez ci-dessus est clair, mais que se passe-t-il si un élève copie un appel de fonction d'une autre application ou d'un livre ou quoi que ce soit d'autre et ne le comprend pas vraiment? Comment le prof saura-t-il? Cette règle stupide ne permet aucune zone grise (qui, dans sa défense, a probablement été abusée auparavant). C'est comme ça que j'interprète ça. ... remarquez que si je voyais cela dans un environnement non universitaire, cela pourrait me faire peur un peu. ;-)
John MacIntyre le
4
Oui, sauf que vous pouvez toujours écrire des commentaires qui ne font que répéter le code et ne montrent aucune compréhension. Est-ce qu'il vous fait juste "// Ending Brace" avant l'accolade de fin?
alternative le
6
Et si vous aviez accidentellement un commentaire utile dans votre code? Avez-vous besoin de mettre // commenten ligne avant cela?
configurateur
103

Notre norme de codage d'entreprise (C #) préconisait une utilisation intensive de #REGIONs (pour ceux qui l'ignorent, elle marque des blocs de code source qui seront réduits à une seule ligne dans Visual Studio). En conséquence, vous avez toujours ouvert ce qui semblait être une classe bien structurée, uniquement pour trouver des piles et des piles d'ordures balayées sous des tapis profondément imbriqués de constructions #REGION. Vous auriez même des régions autour de lignes simples, par exemple devoir plier une région LOG pour trouver une seule déclaration de l'enregistreur. Bien sûr, de nombreuses méthodes ajoutées après la création d’une région ont également été placées dans la "mauvaise" portée. L'horreur. L'horreur.

Les régions constituent l'une des pires fonctionnalités jamais ajoutées à Visual Studio. il encourage la structuration de la surface plutôt que la structure réelle de OO.

De nos jours, je tue des #REGIONs à vue.

Cumbayah
la source
11
J'ai essayé de voter jusqu'à une douzaine de fois ...
TGnat le
22
Si vous pensez avoir besoin de #REGION, je pense que vous avez besoin de refactoriser.
Jay Bazuzi
23
J'organise généralement le code par régions en constructeurs, propriétés, événements, méthodes et membres. La gestion et la navigation dans la source deviennent un jeu d'enfant (en particulier dans certaines classes d'utilitaires statiques qui peuvent devenir très volumineuses). Je ne les utiliserais pas plus que cela cependant.
Evan Plaice
26
Nous avons une norme de codage simple: ne jamais imbriquer de régions. Il suffit de les utiliser pour regrouper les méthodes associées (initialisation, sérialisation, propriétés, etc.)
Jason Williams
6
Le seul bon objectif de #regions est de masquer le code qui n'a pas besoin d'être modifié . Cela pourrait être du code généré, ou du code avec un algorithme difficile à obtenir que vous préférez ne pas toucher, ou peut-être des blocs de code de débogage laids. Mais pas le code sur lequel les gens vont travailler. Pour ceux qui sont bloqués dans un magasin #region, j'ai une macro qui se réduit aux définitions mais qui étend les régions. Voir ici: stackoverflow.com/questions/523220/awesome-visual-studio-macros/…
Kyralessa
80

Dans un travail, nous avons été forcés d'utiliser une forme étrange de notation hongroise dans la base de données.

Je ne me souviens pas des détails, mais de mémoire, chaque nom de champ devait contenir:

  • Pas de voyelles
  • Toutes les lettres majuscules
  • Une référence à la table
  • Un indicateur de type de données
  • Une longueur de données
  • Un indicateur nullable

Par exemple, la colonne contenant le prénom d'une personne peut s'appeler: PRSNFRSTNMVC30X(Table de personnes, colonne Prénom, Varchar 30 caractères, Non Null)

Damovisa
la source
14
Désolé, mais que se passe-t-il lorsque vous modifiez la base de données ou décidez que la longueur de VARCHAR doit être différente. Tout à coup, vous devez parcourir tout votre code et changer ... oh mon dieu. Cela semble horrible.
Tom Morris
71
Pas de voyelles ??! Vous plaisantez, non?
Daniel Cassidy
39
Les personnes qui ont appliqué cette norme ont-elles des crêtes sur le front et discutent souvent d'honneur et de bataille?
Ryan Roberts le
10
Haha, eh bien, c'étaient des DBA, donc ...;)
Damovisa le
14
Vous auriez dû envoyer vos noms de colonnes par le biais d'un raccourci d'URL. PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
Billy Coover
48

Insister pour que tous les accolades soient suivis d'un commentaire indiquant le but de l'accolade:

par exemple:

for (int i = 0; i < 10; i++)
{
    if (foo > bar)
    {
        printf("Foo greater than bar");
    } // End If (foo > bar)

    while (baz)
    {
       farb();
    } // End while (baz)
} // End For
Kris Erickson
la source
21
Plus seniable: si vous avez besoin d’un commentaire pour indiquer le début du bloc, celui-ci est trop long ou son contenu trop complexe => refactor.
Richard
5
Je souhaite refuser, car de longs blocs profondément imbriqués peuvent être difficiles à résoudre et ces commentaires pourraient aider. Je souhaite voter, car ces commentaires deviendront bientôt faux (et très confus), et parce que de longs blocs profondément imbriqués sont un signe que vous devez refactoriser et non ajouter des commentaires.
Jay Bazuzi
7
c'était une excellente idée pour un monde sans IDE puissant.
IAdapter
9
@Jay dans n'importe quel IDE décent, vous pouvez mettre en surbrillance une accolade et l'autre accolade correspondante sera mise en évidence. Personnellement, je déteste quand les gens font cela.
Evan Plaice
3
Bien que votre exemple soit un peu du côté fou (comme ils ne sont pas assez longs, cela importerait et vous ralentirait si vous changiez de logique), mais ce n'est pas toujours une mauvaise chose. Des commentaires comme celui-ci sont vraiment utiles pour fermer des déclarations d'espaces de nom / endif couvrant un fichier entier.
Jsternberg
38
#define AND  &&
#define OR   ||
#define EQ   ==

'Nuff a dit.

Niall C.
la source
9
#Include <iso646.h> ne serait-il pas un meilleur choix?
AndrejaKo
3
@AndrejaKo: cela a précédé <iso646.h>; c'était une tentative de faire en sorte que C ressemble à FORTRAN.
Niall C.
2
Était-ce vraiment une norme de codage? c'est-à-dire, existe-t-il une politique de l'entreprise interdisant d'écrire directement les opérateurs?
finnw
21
Avait-il aussi #define BEGIN {et #DEFINE END }?
JBRWilkinson le
3
Cela me rappelle un article du Daily WTF que j’ai vu et qui a donné à un programmeur C ++ une tonne de définitions pour lui donner l’apparence de Visual Basic (ou peut-être simplement de base, un dialecte). #define void Sub, #define} End, des choses comme ça.
Wayne Molina
37
  • Les noms de variables locales sont tous en minuscule sans soulignement

Des exemples concrets: paymentmethodtotalshtml, contracttypechangecontexts, customsegmentspectexts,potentialmsceventref

Le New York Times pèse :

«Les espaces de mots ne doivent pas être pris pour acquis. Le grec ancien, le premier alphabet à comporter des voyelles, peut être déchiffré sans espaces de mots si vous le prononcez et vous le faites sans. […] Le latin a également cessé de séparer les mots dès le deuxième siècle. La perte est déconcertante, car l’œil doit travailler beaucoup plus fort pour lire un texte non séparé. Mais comme l'a expliqué le paléographe Paul Saenger, le monde antique ne souhaitait pas "rendre la lecture plus facile et plus rapide".
John Siracusa
la source
3
+1 Les ennuis mineurs s'additionnent. En outre, ils sont difficiles à argumenter, car l'éditeur de normes de codage ou le PM peut dire: "Ce n'est pas un lourd fardeau, il ne vaut donc pas la peine de le changer."
finnw
1
Exactement. (Bien que dans ce cas, lire un grand nombre de noms variés comme ceci puisse être vraiment un adduptoquitea greatburden.)
John Siracusa
57
Amuse-toi en inventant des noms à analyser de deux manières. pageshits, penisup, etc.
Jay Bazuzi
4
@Jay * sexchange
configurateur du
2
@configurator: lorsque l'équipe de débogage de Visual Studio travaillait sur une fonctionnalité vous permettant de voir l'exception actuellement en vol dans la fenêtre de surveillance, elle allait ajouter une pseudo-variable appelée "$ ex". Nous n'avons pas remarqué depuis longtemps. Ensuite, nous avons renommé "$ exception", mais je le lis quand même comme ayant un 's'.
Jay Bazuzi
36

On m'a demandé par le leader mondial des logiciels d'une entreprise à faire « simple, re n du code redondantes ». Par exemple, il était interdit d'ajouter un nouveau paramètre à une fonction existante. Au lieu de cela, vous avez dû dupliquer la fonction, en laissant l'original intact afin d'éviter les régressions. Pas de test formel bien sûr (perte de temps).

Il nous était également interdit d'utiliser un logiciel de fusion; chaque fichier ne peut être modifié que par un programmeur à la fois. Le logiciel de contrôle de révision était de la science-fiction, bien sûr.

Le jour le plus heureux de ma vie a été celui où il a été licencié (considérez qu'il est très, très difficile de licencier quelqu'un en Italie).

Lorenzo
la source
il n'a peut-être jamais entendu le mot 'refactoring'
nanda le
3
Il n'a jamais entendu aussi beaucoup d'autres mots ...
Wizard79
Eh bien, vous n'avez pas besoin de tests formels parce que vous n'avez jamais changé de méthode ...
configurateur, le
36

Toutes les interactions avec la base de données doivent être effectuées via des procédures stockées . Cela pourrait avoir un sens si nous vivons en 1997 et non en 2010.

Je viens de me rendre compte que cela couvre en fait tous les critères de la question initiale:

  • A considérablement diminué votre productivité? VÉRIFIER. S'il vous plaît - utilisez simplement un ORM .
  • Ont-ils été inclus à l'origine pour de bonnes raisons, mais ont-ils été conservés longtemps après que la préoccupation initiale soit devenue sans objet? VÉRIFIER. Le responsable était développeur pour un serveur de base de données il y a 1000 ans et a mis cette norme de codage en oeuvre.
  • Étaient dans une liste si longue qu'il était impossible de se souvenir de tous? VÉRIFIER. Cela incluait «autant de logique que possible devrait être stockée dans la base de données».
  • Vous avez pensé que l'auteur essayait juste de laisser sa marque plutôt que d'encourager de bonnes pratiques de codage? VÉRIFIER. Continue à revenir au gestionnaire en tant que développeur de serveur de base de données.
  • Vous ne saviez pas pourquoi ils étaient inclus? VÉRIFIER.
Jaco Pretorius
la source
2
Nous avons des gens dans ce camp sur mon lieu de travail. C'est drôle quand ils essaient de jouer la carte de la performance et démontrent à quel point leurs connaissances sont obsolètes
Réintégrer Monica le
3
attends… sérieusement, je pensais que les SP étaient meilleurs, en termes de performances, que des appels SQL directs à partir de, disons, C #?
Sk93
3
On dirait que vous savez exactement pourquoi ils ont été inclus. : P
Mason Wheeler
4
Quand j'ai grandi, j'ai enfin compris pourquoi tout devait passer par la BD :) Sérieusement, cela simplifie tellement de choses, n'essayez pas de réinventer la roue.
Jé Queue
3
J'ai entendu le beau raisonnement "Nous ne pouvons pas utiliser un OR / M car toutes les interactions doivent utiliser des SP". Un tel gaspillage de force humaine.
configurateur
33

Ne pas être autorisé à utiliser la STL ou d'autres bibliothèques C ++ standard, car le CTO pensait que nous pouvions le faire mieux et plus rapidement. Même les constructions de base comme les listes et la classe string.

David B
la source
5
La seule fois où j'ai jamais entendu parler d'une personne qui n'utilisait pas la STL parce que ce n'était pas assez rapide et qui avait raison, c'était pour les jeux. EA a réalisé sa propre implémentation de la STL pour ses jeux. Je doute fortement que cela compte plus (les jeux modernes sont limités par le GPU) et je doute qu'ils l'utilisent. Mais même quand même, c'était une implémentation du TSL, pas une toute nouvelle bibliothèque. Vous utilisiez toujours la STL lorsque vous utilisiez EASTL.
Matt Olenik
1
@ Matt: pour ajouter à cela, la plainte d'EA était centrée sur l'utilisation de la mémoire et son initialisation. Leur propre implémentation consomme moins de mémoire, la libère plus tôt et évite d’initialiser des objets qui seraient initialisés plus tard.
Matthieu M.
Je lui dirais de le coder lui-même.
Droitier
31

Notation hongroise

Échantillon extrait de " l'explication de Charles Simonyi de la convention de dénomination de l'identificateur de notation en hongrois " sur MSDN.

1 #include “sy.h”
2 extern int * rgwDic;
3 externe int bsyMac;
4 struct SY * PsySz (char sz [])
6 {
7 caractères * pch;
8 int cch;
9 struct SY * psy, * PsyCreate ();
10 int * pbsy;
11 int cwSz;
12 non signé wHash = 0;
13 pch = sz;
14 tant que (* pch! = 0
15 wHash = (wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy = & rgbsyHash [(wHash & 077777)% cwHash];
18 pour (; * pbsy! = 0; pbsy = & psy-> bsyNext)
19 {
20 char * szSy;
21 szSy = (psy = (struct SY *) & rgwDic [* pbsy]) -> sz;
22 pch = sz;
23 tant que (* pch == * szSy ++)
24 {
25 if (* pch ++ == 0)
26 retour (psy);
27}
28}
29 cwSz = 0;
30 si (cch> = 2)
31 cwSz = (cch-2 / sizeof (int) +1;
32 * pbsy = (int *) (psy = PsyCreate (cwSY + cwSz)) - rgwDic;
33 zéro ((int *) psy, cwSY);
34 milliards de octets (sz, psy-> sz, cch + 1);
35 retour (psy);
36}
J8D
la source
5
Ow ow ow ow ow ow ow!
Réintégrer Monica le
22
Le principal problème de cet exemple réside dans les noms de variables sans signification. Supprimez les préfixes hongrois et certains d'entre eux comportent 1, voire 0 caractères.
fin
8
Il s'agit de Hongrois de Systems, ce qui est utile dans les langues faiblement typées (car il code les informations de type essentielles au travail dans ces langues dans les noms) - il est inutile dans les langues fortement typées. La meilleure alternative pour les langues fortement typées est Apps Hungarian, qui code des informations importantes sur l' utilisation d'une variable (membre, pointeur, volatile, indexeur), ce que la langue ne prend pas en charge.
Jason Williams le
5
Oh s'il vous plait. Je n'ai jamais confondu une section locale avec un membre, et je n'utilise pas ce hongrois ridicule pour les membres / les sections locales / les terrains / quoi que ce soit. Je pense qu'ils pourraient être utiles pour différencier différents types de chaînes, telles que "safe" et "unsafe", comme dans l'exemple de Joel dans Making Wrong Code Look Wrong
configurateur,
3
@configurator: L'exemple de Joel est horrible, il serait préférable qu'il ait différents types, le compilateur imposerait l'utilisation.
Matthieu M.
28

J'ai déjà travaillé sur un projet dans lequel le responsable du projet avait demandé que chaque variable - CHAQUE variable - soit précédée de "v". Donc, vCount, vFirstName, vIsWarranty, etc.

Pourquoi? "Parce que nous travaillons sous VBScript et que de toute façon, tout est une variante".

WTF.

Christopher Hawkins
la source
93
Une fois, j'ai travaillé dans une langue qui nécessitait chaque variable - CHAQUE variable - soit précédée de "$".
nohat
6
@ nohat: Et vous avez réalisé que c'était incroyable, n'est-ce pas?
Josh K
J'ai déjà travaillé dans une langue où toutes mes variables commençaient par une ponctuation telle que '$' ou '%' ou '@'. Je le fais encore, de temps en temps.
David Thornley
3
Cela ne devient vraiment un problème que lorsque vous devez mettre un favant des fonctions, alors votre code est vraiment fUcked (vUp).
Joe D
1
Cela ressemble à différentes versions de Perl ...
26

Presque oublié celui-ci:

Citation d'un manager:

Ne corrigez pas et ne documentez pas les bugs des problèmes que vous trouvez dans votre propre code. Le client nous paiera pour les identifier et les réparer au cours des prochaines années.

Ce n'était pas pour les logiciels grand public, mais personnalisé pour une seule grande entreprise. Inutile de dire que le client a payé pour des années après. Cela peut sembler trivial, mais il est plus difficile d’ignorer les bogues que de les trouver.

David B
la source
2
C'est une politique horrible. J'espère que ce responsable a été mis en conserve.
Bernard
@ Bernard-In Dans la plupart des organisations, créer une source de revenus à long terme est un motif de promotion rapide. J'espère que quelqu'un d'autre a vu la folie à ce sujet et l'a accidentellement écrasé sur le parking.
Jim Rush
24

Commentaires XML appliqués sur toutes les méthodes, constantes, enums et propriétés non privées.

Cela a conduit à un code assez encombré, en particulier parce que le résultat final était que les gens tapaient /// simplement pour créer un talon de commentaire vide ou installaient GhostDoc et le faisaient ajouter des commentaires générés automatiquement:

/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName) 
{
   // whatever
}

[Modifier] La raison pour laquelle je mentionne cela comme une norme ridicule n'est pas parce que je pense que les commentaires de méthode sont stupides mais parce que la qualité de ces commentaires n'était en aucun cas appliquée et avait pour conséquence de simplement créer beaucoup de fouillis dans les fichiers de code. . Il existe de meilleurs moyens de créer des documents de code significatifs que aveugle "doit avoir un commentaire", condition de génération requise.

Anna Lear
la source
13
' Validations the handler' - euh-oh
Eric
8
+1 Ugh je déteste ça. Je pense que si vous utilisez un logiciel pour générer des commentaires, vous n'en avez pas besoin.
bleevo
9
Je ne pense pas que ce soit une mauvaise règle. Lors de la lecture d'une méthode que je dois maintenir pour la première fois, cela m'aide beaucoup d'avoir des spécifications pour tous les arguments. Il y a habituellement des subtilités (par exemple, que se passe-t-il si l'argument est null, s'il s'agit d'une collection vide, le nom d'un fichier inexistant, etc.) Une autre bonne règle (IMHO) est que les noms de méthodes doivent être des verbes, mais dans votre exemple, c'est un nom.
finnw
3
@finnw Je pense que c'est une bonne pratique, mais un mauvais standard. Si les développeurs sont à bord et écrivent des commentaires de méthode significatifs lorsqu'ils sont garantis (détails des exceptions, etc.), c'est très bien. Sinon, vous vous retrouvez avec un gros bazar. Et dans le premier cas, vous n'avez pas du tout besoin d'application au niveau de la compilation.
Adam Lear
7
Cas classique de non-documentation. Les commentaires qui ne disent rien en dehors de l'évidence flagrante devraient être tués à vue.
Cumbayah le
23

Pas vraiment une norme de codage, mais nous avions un fichier dans le contrôle de source appelé 'changelog.txt'

Chaque fois que vous avez effectué un enregistrement, vous deviez ajouter manuellement une entrée dans ce fichier. Cette entrée était le numéro de révision de subversion et votre commentaire d’arrivée.

Lorsque le nouveau CTO a commencé et que quelqu'un lui a dit cela, il a rapidement pris une décision de l'exécutif et a déclaré: "Nous n'allons plus le faire" et a supprimé le fichier. Cela durait depuis des années.

Jim A
la source
6
Et personne n'était au courant svn log?
Htbaa
1
Ceux qui ont commencé la politique étaient partis depuis longtemps et ceux qui ont suivi l'ont maintenue. J'ai commencé dans la même semaine que le nouveau CTO (ami à moi) et nous avons tous deux examiné cela et dit WTF?
Jim A
20

Certains des endroits avec lesquels j'ai travaillé ont insisté pour commenter le code inutilisé ou obsolète au lieu de le supprimer. Au lieu de faire confiance au VCS pour l'historique, etc., il a été péniblement maintenu dans les fichiers par le biais d'un code commenté.

Le gros problème que j'ai trouvé avec ceci est que souvent vous ne saviez pas pourquoi le code était commenté. Est-ce parce que certains développeurs étaient en train de faire des changements et qu'ils voulaient le garder comme référence ou était-ce devenu inutile?

Jeremy Wiebe
la source
3
J'ai récemment supprimé beaucoup de vieux codes commentés.
CoderDennis
2
Je supprime généralement le code commenté, à moins qu'il ne soit accompagné d'une bonne explication de la raison pour laquelle il a été commenté et de la raison pour laquelle il doit être conservé.
Jeremy Wiebe
Je suis entièrement d'accord. Commenter du code tant que vous travaillez avec lui est correct, mais tout ce qui entre dans une version / branche principale ne devrait pas contenir de code commenté. Quelqu'un m'a dit qu'ils "aimaient savoir comment cela pourrait être fait différemment". Je trouve cela simplement irritant pour les raisons évoquées: est-ce obsolète, une solution de contournement, une autre façon de le faire? WTF
Anne Schuessler le
Avec VS2013 "Peeks" c'est tout par la fenêtre. Mais nous avons mis un commentaire qui disait "Équation modifiée - Initiales" ou quelque chose du genre, donc quelqu'un se demandant quel était l'ancien code chercherait dans TFS / VCS s'il le fallait. Donc, c'est une ligne au lieu de 10 lignes commentées. Mais VS2013 est génial, il affiche l’histoire de TFS pour vous.
Suamere
17

La pire norme de codage à laquelle j'ai jamais participé est celle des bases de code, qui n'en avaient aucune. Je préfère suivre une norme de codage avec laquelle je suis complètement en désaccord que de travailler dans des bases de codes où il n’en existe aucune. Cela rend d'autant plus difficile l'apprentissage de nouvelles parties de la base de code.

JaredPar
la source
16

Forcer des commentaires en ligne pour le contrôle de version était à peu près la norme de codage la plus inutile que j'ignorais.

//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed

Le DBA Oracle qui insistait sur l'utilisation correcte des espaces tout en "conservant" une base de données avec une table hautement contestée comportant plus de 200 champs et 40 déclencheurs se rapproche.

Ryan Roberts
la source
C'est assez odieux
Evan Plaice
5
Mmm. Dim Sum ...
configurateur
Je l'ai fait avant d'avoir le contrôle à la source, bien sûr. Une fois que nous avions le contrôle à la source, c’était une telle habitude que nous avions pratiquement besoin d’une intervention de la part de l’équipe pour qu’elle cesse de le faire. Finalement, nous avons arrêté et supprimé tous ceux existants lorsque nous les avons trouvés.
Scott Whitlock
Notre développeur senior essaie toujours de nous forcer à le faire. J'ignore la politique chaque fois que je pense pouvoir m'en tirer (et parfois lorsque je sais que je ne peux pas).
Joshua Smith
Nous avons un membre de notre équipe qui continue de le faire partout (il inclut également d’énormes éléments de "Journal des modifications" dans nos scripts SQL qui sont également sous contrôle de version). L'argument, comme expliqué à moi, est qu'après quelques modifications / validations, vous ne vous souveniez pas de la date de modification, le journal des modifications est donc utile pour noter immédiatement qui a modifié quoi et pourquoi lorsque vous ouvrez un fichier.
Wayne Molina
14

J'ai effectué des revues de code sur un projet dirigé par un premier temporisateur C ++ qui a décidé que toutes les fonctions de membre de classe devraient être précédées du nom et de la visibilité de la classe:

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}
utilisateur1006
la source
1
Leur avez-vous demandé pourquoi ? J'adorerais connaître leur motivation.
JBRWilkinson
1
Wow, pourquoi ce type utilise- t-il même des cours ?
Mateen Ulhaq
9

Être obligé d'indenter tout le code de quatre espaces;)

RedFilter
la source
2
Comment était-ce mauvais?
Jay Bazuzi
1
Parce qu'alors chaque ligne a 4 espaces inutiles au début?
Nohat
Oh, je le comprends maintenant.
alternative le
21
Ouais, StackOverflow a un très mauvais standard de codage. :-)
P Shved
Les retraits importants vous obligent à maintenir un niveau d'imbrication de code faible. J'ai vu des retraits de 8 et cela a bien fonctionné.
Toon Krijthe le
9

J'avais un travail il y a des années où tout notre code devait être aligné à gauche - pas d'indentation. Le gars qui a proposé cette politique n'aimait pas avoir à faire défiler les lignes de code horizontalement, ce qui équivaut à jouer au ping-pong avec ses yeux.

Jeremy
la source
C'est une norme de programmation horrible à suivre. Et une raison stupide pour cela aussi!
gablin
4
Si vous avez besoin de faire défiler horizontalement (par exemple plus d'une demi-page), il y a probablement quelque chose qui ne va pas. Aucun retrait n'est mauvais non plus, car cela rend le code complètement illisible. J'essaie de m'en tenir à une limite de 78 cols, mais s'il est nécessaire de dépasser ce montant, cela ne me dérange pas, mais j'essaie de l'éviter.
Htbaa
8

Ceci est un exemple de non-respect des normes de codage.

Un entrepreneur travaillant dans une grande banque a insisté sur le fait que le respect des normes était le meilleur de tous les temps. L'application était écrite en dBase / Clipper dont il était l'unique développeur et, bien entendu, il a élaboré la norme.

  • Tout est en majuscule. Je veux dire tout, y compris les rares commentaires qu'il a faits.
  • Aucune indentation.
  • La dénomination des variables ressemblait à APRGNAME. A = portée de la variable, par exemple P pour public, PRG = les trois premiers caractères du fichier source qui a créé la variable, NOM = nom de la variable dans les 6 caractères restants autorisés par dBase / Clipper.
  • Les 4 premières et les 4 dernières lignes du code source avaient une longueur de 80 *. Pourquoi? Il pouvait donc entendre l’imprimante à matrice de points commencer et terminer l’impression d’un fichier. La mémoire est l'ensemble du programme a été imprimé via l'ordinateur central hebdomadaire, 20 000 pages.
  • Je suis sûr qu'il y en a beaucoup d'autres que j'ai réussi à vider de mon cerveau.

J'étais un tout nouveau programmeur autodidacte à ce stade, mais je savais assez pour ne pas écouter le scientifique fou et s'enfuir avant que je ne demande à reprendre le projet.

Et oui, nous avons dit à la direction à quel point ces pratiques étaient mauvaises, mais nous avons toujours eu l'habituel "payaient cet entrepreneur à un gros prix, il devait savoir de quoi il parlait".

Tim Murphy
la source
7
Ne vous moquez pas des vieux dinosaures, s'il vous plaît. Ils nous ont rendu possible.
P Shved
4
Cela ressemble à la sécurité d'emploi.
MIA
7
Avoir un marqueur audio pour savoir quand chaque fichier est en cours d'impression est ingénieux. Je vais ajouter \07au début de chaque fichier maintenant.
configurateur
2
Utiliser un schéma de nommage comme celui-ci (ce n’est pas le cas en majuscule) était logique car les règles de "portée" variables de dBase étaient inexistantes. Tout était effectivement global. Un système iutilisé pour indexer un tableau dans une procédure pourrait interférer avec une iprocédure appelante. Vous devez utiliser PRIVATE ALL LIKE m*et PRIVATE iéviter ce "shadowing"
Gerry
8

Encore un souffle de mon passé.

Citation du propriétaire de l'entreprise:

Il n'y aura pas de code écrit à l'aide de langages d'interprétation car j'ai perdu 25 millions d'euros sur ce projet {explétif} écrit en Java.

Le projet Java était un système de négociation d’actions conçu pour traiter quelques dizaines d’actions, qui était maintenant utilisé pour traiter des milliers de personnes. Au lieu de s'attaquer aux défauts de conception ou à un matériel médiocre, l'ensemble de la société a été obligé de convertir toutes les applications non C / C ++ en C / C ++, et tous les nouveaux développements devaient se faire en C / C ++. Les langages d'interprétation signifiaient tout ce qui n'était pas compilé, et le propriétaire ne considérait que Assembler, C et C ++ compilé.

Pour une entreprise de 800 personnes, dont la majeure partie du code était en Java et en Perl, cela signifiait que toute la société passait l'essentiel de son temps au cours des deux prochaines années à réécrire du code parfaitement fin en C / C ++.

Assez drôle, une vingtaine d’années avant ce fiasco, j’étais chez une autre société dans laquelle le responsable technique avait décidé que notre logique de tri (c’était une sorte de bulle) devait être recodée en assembleur au lieu d’être remplacée par Quick Sort parce que - les algorithmes le font. pas améliorer les performances. Le seul moyen d'améliorer les performances était de réécrire la même logique dans l'assembleur.

Dans les deux cas, je suis parti peu de temps après la dictée.

David B
la source
Est-ce que l'une ou l'autre société fonctionne encore aujourd'hui?
finnw
Celui qui s'est déplacé hors de Java est, l'autre est parti depuis longtemps. Ils n'ont jamais survécu au passage du TRS-80 à un PC.
David B
6

Comme beaucoup de programmeurs (mais pas assez), je déteste la décoration de code. Cela me met en colère lorsque je dois utiliser un préfixe de signe dollar ($) pour les noms de variables, ou un trait de soulignement pour les variables privées, même sans getters / setters. Si vous avez besoin de décorer votre code pour le comprendre, alors vous devez sortir le diable!

Adam Harte
la source
Eh bien, comme le dit "Will", je rajoute le caractère de soulignement pour que mes variables privées soient regroupées dans mon intellisense. Toutefois, je ne le fais que pour les variables associées à un type. Variables déclarées dans une méthode ou une portée plus étroite, je laisse le soulignement. Il est facile de les séparer et de garder ensemble les variables moins utilisées. " et je suis d'accord avec lui.
7wp
1
Je ne pense pas que le regroupement de vos variables dans votre IDE propriétaire favori soit une raison suffisante pour altérer tout votre code.
Adam Harte le
Si c'est votre code, le rendre utilisable dans votre IDE semble tout à fait raisonnable. De plus, les caractères de soulignement sont courants dans de nombreuses langues, ainsi chaque fois que les gens le voient, ils savent ce que cela signifie.
rjmunro
1
+1 Utiliser un bon IDE (qui peut utiliser la recherche par regex ) me semble plus logique. Scratch IDE, apprenez à utiliser un éditeur de texte et un terminal et vous serez un meilleur programmeur. En passant, je n'aime pas particulièrement les sigils en perl, mais au moins ils ont une utilité, contrairement à ceux en PHP.
alternative le
6
Soupir ... un autre de ces "IDE sont pour les chattes" personnes.
Cloueur
6

Cela fait un moment que je travaille avec un système Web où tous les paramètres passés doivent être nommés P1, P2, P3, etc. Aucune chance en enfer de savoir ce qu’ils étaient sans une documentation exhaustive.

De plus, bien que n'étant pas strictement une norme de codage, dans le même système, chaque fichier devait s'appeler xyz0001.ext, xyz0002.ext, xyz0003.ext, etc., où xyz était le code de l'application en elle-même.

CB Du Rietz
la source
6

C'était il y a très longtemps - 1976 pour être exact. Mon chef n’avait jamais entendu parler d’Edsger Dijkstra ni lu un numéro du CACM, mais il avait entendu dire que "GOTO est mauvais", nous n’avions donc pas le droit d’utiliser GOTO dans nos programmes COBOL. C'était avant que COBOL ajoute "end if", donc à l'époque il ne disposait que de deux et demi des trois structures de contrôle classiques (sequence, if / then / else, effectuer (c'est-à-dire faire pendant)). À contrecoeur, il a autorisé GOTO dans nos programmes de base et les instructions de branche dans nos programmes de langue Assembler.

Désolé que ce soit une sorte de "tu devais être là". Autant que je sache, chaque langage inventé depuis 1976 dispose de structures de contrôle adéquates pour que vous n'ayez jamais besoin d'utiliser GOTO. Mais le fait est que le patron n'a jamais su POURQUOI GOTO était considéré comme dangereux, ou quelle langue était la maladie infantile et quelle était la maladie mortelle.

Mark Lutton
la source
6

J'ai travaillé dans un projet où l'architecte en chef avait demandé d'écrire un code explicite. L'un des pires exemples que j'ai trouvés dans le code (et qu'il a approuvé avec joie) est le suivant.

private string DoSomething( bool verbose )
{
    if ( verbose ) { return someString; }
    else if ( !verbose ) { return otherString; }
    else { return string.Empty; }
}

Même ReSharper vous a dit que c'est faux!

Jax
la source
9
Vous auriez du mal à renvoyer quelque chose d'une fonction déclarée nulle.
Mircea Chirea
7
@MAttB Considérez dans quelles conditions la elsebranche final ( ) serait prise.
Richard
6
else {return string.Empty; } sera exécuté lorsque les 2 lignes ci-dessus auront été modifiées par un développeur de maintenance dans 5 ans. Toutefois, le retour de string.Empty masquera le fait que cette condition était auparavant impossible . Au lieu de cela, il devrait renvoyer InvalidOperationException ("Ce code n'était pas destiné à prendre en charge la logique à trois valeurs");
MatthewMartin
1
C'est horrible. Quel est le problème avec return verbose ? someString : someOtherString;?
Callum Rogers
1
@callum L'opérateur Ternary pourrait être banni :) déjà passé par là ...
hplbsh le
6

Lors de mon dernier emploi, "normes" serait un terme très fort pour ce que m'a donné le type qui m'a embauché. En programmant des sites Web sous ColdFusion et SQL, on m'a donné des exigences de codage telles que:

  • Ne pas utiliser comprend. J'aime une grande page
  • Toujours séparer les mots dans les noms de variables et de colonnes avec des traits de soulignement (sauf isactive, prénom, etc.)
  • N'utilisez jamais d'abréviations - écrivez toujours le prénom (il écrivait souvent fname et ainsi de suite)
  • N'utilisez pas de noms déroutants (tels que amount_charged et charge_amount, qui mesuraient des choses différentes mais liées)
  • N'utilisez pas de DIV , et utilisez un minimum de CSS - utilisez plutôt des tables imbriquées (j'ai trouvé une profondeur de six couches, une fois).
  • Ne cachez aucune requête. Déjà.
  • Vous allez utiliser une variable sur plus d'une page? Domaine d'application.
  • Chaque page est son propre bloc try / catch. Nous n'avons pas besoin / ne voulons pas d'un gestionnaire d'erreur global.

J'ai commencé à les changer dès qu'il a arrêté.

Ben Doom
la source
"N'utilisez pas de noms déroutants" me semble assez juste ...
8128
1
C'est une directive absolument juste. Mon point était qu'il ne l'a pas suivi du tout. Je suppose que son idée de "ne pas confondre" et la mienne étaient différentes.
Ben Doom
4

Dans ma vie en tant que codeur C ++, deux "règles" vraiment méchantes étaient appliquées:

  1. "Nous ne pouvons pas utiliser la STL, car VC ++ 4.1 ne la prend pas en charge (et nous ne pouvons pas basculer vers VC ++ 6.0 pour le moment)."
  2. "N'utilisez pas QuickSort, car il peut s'agir de O (n ^ 2) dans les cas graves; utilisez cette implémentation de l'algorithme HeapSort I (nom du chef de projet supprimé) écrit en tant qu'étudiant."

la source
6
Quel était le problème avec HeapSort du chef de projet?
7wp
4
En fait, si le code accepté est une entrée utilisateur externe, QuickSort peut être erroné car il s’ouvre aux O(n^2)attaques par DOS (alimentant l’entrée dans le cas le plus défavorable). Aussi, pourquoi il n’était pas possible de changer d’ordinateur - c’était en soi une excuse valable pour ne pas utiliser STL.
Maciej Piechotka
4

Je suis obligé d'avoir une documentation XML pour toutes les classes et tous les membres de la classe. Y compris privé. Je suis encouragé à utiliser les commentaires par défaut de ghostdoc.

public class User 
{
    /// <summary>
    /// the _userID
    /// </summary>
    private int _userID;
}
Carl Bergquist
la source
Très semblable à cette réponse précédente .
finnw
Oui. Tout ce que je suis obligé de commenter les membres privés aussi. Ce qui a encore moins de sens.
Carl Bergquist le
Encouragé à utiliser ghostdoc?! Gah
configurateur