Der schlechteste Kodierungsstandard, dem Sie jemals folgen mussten? [geschlossen]

77

Mussten Sie jemals an Codierungsstandards arbeiten, die:

  • Ihre Produktivität stark verringert?
  • Wurden sie ursprünglich aus guten Gründen aufgenommen, aber lange nachdem die ursprüngliche Besorgnis irrelevant wurde, beibehalten?
  • Waren sie so lange in einer Liste, dass es unmöglich war, sich an alle zu erinnern?
  • Haben Sie gedacht, der Autor wollte nur Spuren hinterlassen, anstatt eine gute Codierungspraxis zu fördern?
  • Sie hatten keine Ahnung, warum sie aufgenommen wurden?

Wenn ja, welche Regel gefällt Ihnen am wenigsten und warum?


Einige Beispiele hier

finnw
quelle
4
Ich habe übrigens schon einmal eine ähnliche Frage (aber nicht genau die gleiche) zu SO gestellt: stackoverflow.com/questions/218123/…
Brian R. Bondy
@Brian, danke, ich hatte deine Frage gesehen, aber vergessen.
8.
4
Das eigentliche Problem bei Codierungsstandards ist die Zeit- und Müheverschwendung bei der Frage, ob sie korrekt sind oder nicht. Nichts ist besser als ein Kampf gegen die Curly-Brace, bei dem es um die Entstehung von Internecine-Konflikten geht ...
MZB

Antworten:

97

Dies mag ein paar Federn zerzaust haben, aber Standards, die Blockkommentare am Anfang jeder Methode vorschreiben, nerven mich immer.

1) Sie sind immer veraltet, da sie zu weit von dem Code entfernt sind, der die eigentliche Arbeit erledigt, um zu bemerken, wenn Sie Dinge aktualisieren. Schlechte Kommentare sind schlimmer als keine Kommentare.

2) Oft wiederholen sie nur Informationen, die bereits im Versionsverwaltungs-Tool enthalten sind, nur ungenauer. Zum Beispiel: Zuletzt geändert von, Liste der Änderungsdaten / -gründe.

JohnFx
quelle
12
Ich finde (zumindest jetzt, früher in der Schule, das schien seltsam), dass das Kommentieren insgesamt eine schlechte Praxis ist
Shady M. Najib
14
Nicht nur das, sondern ich habe auch festgestellt, dass der mit dem Erstellen einer neuen Klassendatei verbundene Aufwand, wenn Sie eine Last von Boilerplate an die Spitze setzen müssen, Entwickler tatsächlich davon abhält, neue Klassen zu erstellen, und enorme unhandliche Klassen und daher schlechtes Design fördert.
Gaz
13
Nicht zustimmen! Wir fügen keine unnötigen Erzredundanzen und Informationen hinzu, sondern eine tatsächliche textuelle Erklärung der Funktionsweise (in der .h-Datei), die so nützlich ist! Selbstverständlich sind wir bemüht, es mit dem Code synchron zu halten.
Wizard
5
@Shady M Najib schlecht, immer oder schlecht, wenn es erlaubt ist, unkontrolliert / ungepflegt zu bleiben? Im Allgemeinen wird guter Code seinen Zweck so deutlich machen, dass keine Kommentare erforderlich sind. Dies ist jedoch nicht immer der Fall, und ich bin der Ansicht, dass in diesen Szenarien das Kommentieren von entscheidender Bedeutung ist. Ich kann mir keinen schlechten Grund vorstellen, XMLDoc-Kommentare aufzunehmen.
Nathan Taylor
7
Ein Block, der erklärt, was er tut, ist gut. Ein Block, der lediglich die Typen und Namen der Argumente und den Rückgabewert wiederholt, ist fehlerhaft. Als ich mit einem Standard arbeiten musste, der letzteren vorschrieb, schrieb ich ein Emacs-Skript, um den Großteil davon automatisch zu generieren.
AShelly
130

Hatte einmal einen Professor, der verlangte, wir hätten mindestens einen Kommentar für jede Codezeile.

//Set x to 3
var x = 3;

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

    //Print x
    Print(x);
}

Es war ziemlich lächerlich.

Fischtoaster
quelle
10
Ist das nicht nur so, damit der Professor weiß, dass Sie genau wissen, was los ist?
John MacIntyre
80
Ich denke, es ist klar, was los ist, und es ist keine Erziehung.
Dan Ray
18
Das obige Beispiel ist klar, aber was ist, wenn ein Schüler einen Funktionsaufruf aus einer anderen App oder einem Buch kopiert oder was auch immer und es nicht wirklich versteht? Wie wird der Professor es wissen? Diese blöde Regel erlaubt keine Grauzone (die zu seiner Verteidigung wahrscheinlich schon mal missbraucht wurde). So interpretiere ich das. ... wohlgemerkt, wenn ich das in einem nicht akademischen Umfeld sehe, kann es mir ein bisschen Angst machen. ;-)
John MacIntyre
4
Ja, außer Sie können immer Kommentare schreiben, die nur den Code wiederholen und kein Verständnis zeigen. Macht er dich richtig "// Ending Brace" vor der Ending Brace?
Alternative
6
Was ist, wenn Ihr Code versehentlich einen nützlichen Kommentar enthält? Müssen Sie // commentdavor eine Verbindung herstellen?
Konfigurator
103

Unser C # -Codierungsstandard forderte die umfassende Verwendung von #REGIONs (für diejenigen, die es nicht wissen, markiert er Quellcodeblöcke, die in Visual Studio zu einer einzelnen Zeile zusammengefasst werden). Infolgedessen haben Sie immer eine Klasse geöffnet, die anscheinend gut strukturiert war, und nur Stapel von Müll gefunden, die unter tief verschachtelten Teppichen aus #REGION-Konstrukten gefegt wurden. Es gibt sogar Bereiche um einzelne Zeilen, z. B. muss ein LOG-Bereich ausgeklappt werden, um eine einzelne Deklaration des Loggers zu finden. Natürlich wurden viele Methoden, die hinzugefügt wurden, nachdem eine Region erstellt wurde, ebenfalls in den Bereich "falsche" Region gestellt. Der Horror. Der Horror.

Regionen sind eine der schlimmsten Funktionen, die Visual Studio jemals hinzugefügt wurde. Es fördert eher die Strukturierung der Oberfläche als die eigentliche OO-Struktur.

Heutzutage töte ich #REGIONs auf Anhieb.

Cumbayah
quelle
11
Ich habe ein Dutzend Mal versucht, dies zu
bewerten
22
Wenn Sie glauben, dass Sie #REGION brauchen, müssen Sie nacharbeiten.
Jay Bazuzi
23
Im Allgemeinen organisiere ich Code nach Regionen in Konstruktoren, Eigenschaften, Ereignisse, Methoden und Member. Das Verwalten und Navigieren in der Quelle wird zum Kinderspiel (insbesondere in einigen statischen Dienstprogrammklassen, die sehr umfangreich werden können). Ich würde sie aber nicht mehr benutzen.
Evan Plaice
26
Wir haben einen einfachen Kodierungsstandard: Verschachteln Sie niemals Regionen. Verwenden Sie sie einfach, um verwandte Methoden zu gruppieren (Initialisierung, Serialisierung, Eigenschaften usw.)
Jason Williams
6
Der einzige gute Zweck von #regions besteht darin, Code auszublenden, der nicht bearbeitet werden muss . Das kann Code sein, oder Code mit einem schwer zu beschaffenden Algorithmus, den man lieber nicht anfassen möchte, oder hässliche Debugging-Codeblöcke. Aber kein Code, an dem die Leute arbeiten werden. Für diejenigen, die in einem #region-Shop stecken, habe ich ein Makro, das zu Definitionen reduziert, Regionen jedoch erweitert. Siehe hier: stackoverflow.com/questions/523220/awesome-visual-studio-macros/…
Kyralessa
80

In einem Job mussten wir eine seltsame Form der ungarischen Notation in der Datenbank verwenden.

Ich kann mich nicht an die Details erinnern, aber aus dem Gedächtnis musste jeder Feldname enthalten:

  • Keine Vokale
  • Alle Großbuchstaben
  • Ein Verweis auf die Tabelle
  • Ein Datentypindikator
  • Eine Datenlänge
  • Ein nullwertfähiger Indikator

Beispielsweise könnte die Spalte mit dem Vornamen einer Person aufgerufen werden: PRSNFRSTNMVC30X(Personentabelle, Spalte Vorname, Varchar 30 Zeichen, Nicht Null)

Damovisa
quelle
14
Entschuldigung, aber was passiert, wenn Sie die Datenbank umgestalten oder wenn Sie entscheiden, dass die Länge von VARCHAR unterschiedlich sein muss? Plötzlich musst du all deinen Code durchgehen und dich ändern ... oh Gott. Das sieht schrecklich aus.
Tom Morris
71
Keine Vokale ??! Sie scherzen, oder?
Daniel Cassidy
39
Hatten die Leute, die diesen Standard durchsetzten, Grate auf der Stirn und diskutierten oft über Ehre und Kampf?
Ryan Roberts
10
Haha, nun, sie waren DBAs, also ...;)
Damovisa
14
Sie sollten Ihre Spaltennamen über einen URL-Shortner gesendet haben. PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
Billy Coover
48

Bestehen Sie darauf, dass nach allen Klammern ein Kommentar für das Ende der Klammer folgt:

z.B:

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
quelle
21
Sinnvoller: Wenn Sie einen Kommentar benötigen, um anzugeben, wie der Blockanfang lautete, ist der Block zu lang oder sein Inhalt zu komplex => refactor.
Richard
5
Ich möchte abstimmen, weil es schwierig sein kann, lange, tief verschachtelte Blöcke auszusortieren, und diese Kommentare könnten hilfreich sein. Ich möchte abstimmen, weil diese Kommentare bald falsch (und sehr verwirrend) werden und weil lange, tief verschachtelte Blöcke ein Zeichen sind, das Sie überarbeiten müssen, und keine weiteren Kommentare hinzufügen müssen.
Jay Bazuzi
7
Das war eine großartige Idee für eine Welt ohne leistungsstarke IDE.
IAdapter
9
@ Jay in jeder anständigen IDE können Sie eine Klammer markieren und es wird die andere entsprechende Klammer markieren. Ich persönlich hasse es, wenn Leute das tun.
Evan Plaice
3
Ihr Beispiel ist zwar ein bisschen verrückt (da es nicht lang genug ist, dass es etwas ausmacht, und Sie beim Ändern der Logik verlangsamen würde), aber das ist nicht immer eine schlechte Sache. Solche Kommentare sind sehr nützlich, um Namespaces / Endif-Deklarationen zu schließen, die sich über eine ganze Datei erstrecken.
Sternberg
38
#define AND  &&
#define OR   ||
#define EQ   ==

'nuff sagte.

Niall C.
quelle
9
Wäre #include <iso646.h> nicht eine viel bessere Wahl?
AndrejaKo
3
@AndrejaKo: Dies ist ein älteres <iso646.h>; Dies war ein Versuch, C wie FORTRAN aussehen zu lassen.
Niall C.
2
War das wirklich ein Kodierungsstandard? dh gab es eine firmenrichtlinie gegen das direkte schreiben der betreiber?
9.
21
Hatte es auch #define BEGIN {und #DEFINE END }?
JBRWilkinson
3
Das erinnert mich an einen Daily WTF-Artikel, den ich gesehen habe, in dem einige C ++ - Programmierer eine Menge Definitionen hatten, damit er wie Visual Basic aussah (oder vielleicht nur Basic, irgendein Dialekt). #define void Sub, #define} End, solche Dinge.
Wayne Molina
37
  • Lokale Variablennamen sind alle Kleinbuchstaben ohne Unterstriche

Reale Beispiele: paymentmethodtotalshtml, contracttypechangecontexts, customsegmentspectexts,potentialmsceventref

Die New York Times wiegt in :

„Worträume sollten nicht als selbstverständlich angesehen werden. Altgriechisch, das erste Alphabet mit Vokalen, konnte ohne Worträume entziffert werden, wenn Sie es ausprobierten, und kam ohne sie aus. […] Auch Latein hörte im zweiten Jahrhundert auf, Wörter zu trennen. Der Verlust ist rätselhaft, weil das Auge viel härter arbeiten muss, um nicht getrennten Text zu lesen. Aber wie der Paläograf Paul Saenger erklärt hat, wollte die Antike nicht, das Lesen leichter und schneller machen. '
John Siracusa
quelle
3
+1. Die kleinen Ärgernisse summieren sich. Sie sind auch schwer zu bestreiten, weil der Editor für Codierungsstandards oder der PM sagen kann: "Es ist keine große Belastung, es lohnt sich also nicht, sie zu ändern."
9.
1
Genau. (Obwohl in diesem Fall das Lesen von unzähligen Variablennamen wie diesem wirklich eine große Belastung sein kann.)
John Siracusa
57
Amüsieren Sie sich, indem Sie Namen erfinden, als auf zwei Arten analysiert zu werden. Seitenzugriffe, Penisup usw.
Jay Bazuzi
4
@ Jay * sexchange
Konfigurator
2
@configurator: Als das Visual Studio-Debugger-Team an einer Funktion arbeitete, mit der Sie die derzeit im Flug befindliche Ausnahme im Überwachungsfenster sehen konnten, wurde eine Pseudovariable mit dem Namen "$ ex" hinzugefügt. Wir haben es lange nicht bemerkt. Dann haben wir in "$ exception" umbenannt, aber ich habe immer noch gelesen, dass es ein 's' hat.
Jay Bazuzi
36

Ich war von der Software Führer eines Unternehmens gefragt „zu tun , einfach, re n dundante Code “. Es war beispielsweise verboten, einer bestehenden Funktion einen neuen Parameter hinzuzufügen. Sie mussten stattdessen die Funktion duplizieren und das Original unberührt lassen, um Regressionen zu vermeiden. Natürlich keine formellen Tests (Zeitverschwendung).

Wir durften auch keine Merge-Software verwenden. Jede Datei kann jeweils nur von einem Programmierer geändert werden. Revisionskontrollsoftware war natürlich Science-Fiction.

Der glücklichste Tag meines Lebens war, als er gefeuert wurde (bedenken Sie, dass es sehr, sehr schwierig ist, jemanden in Italien zu feuern).

Lorenzo
quelle
Vielleicht hat er nie das Wort 'refactoring' gehört
nanda
3
Er hörte nie auch viele andere Wörter ...
Wizard79
Nun, Sie brauchten keine formalen Tests, weil Sie nie die Methoden geändert haben ...
Konfigurator
36

Alle Interaktionen mit der Datenbank müssen über gespeicherte Prozeduren erfolgen . Es könnte sinnvoll sein, wenn wir 1997 und nicht 2010 leben.

Ich habe gerade festgestellt, dass dies tatsächlich alle Kriterien der ursprünglichen Frage abdeckt:

  • Ihre Produktivität stark verringert? PRÜFEN. Bitte - benutze einfach einen ORM .
  • Wurden sie ursprünglich aus guten Gründen aufgenommen, aber lange nachdem die ursprüngliche Besorgnis irrelevant wurde, beibehalten? PRÜFEN. Der Manager war vor 1000 Jahren Entwickler eines Datenbankservers und hat diesen Kodierungsstandard eingeführt.
  • Waren sie so lange in einer Liste, dass es unmöglich war, sich an alle zu erinnern? PRÜFEN. Dies beinhaltete "so viel Logik wie möglich in der Datenbank gespeichert werden sollte".
  • Haben Sie gedacht, der Autor wollte nur Spuren hinterlassen, anstatt eine gute Codierungspraxis zu fördern? PRÜFEN. Kehrt immer wieder zu dem Manager zurück, der ein ehemaliger Datenbankserverentwickler ist.
  • Sie hatten keine Ahnung, warum sie aufgenommen wurden? PRÜFEN.
Jaco Pretorius
quelle
2
Wir haben einige Leute in diesem Lager an meinem Arbeitsplatz. Es ist lustig, wenn sie versuchen, die Leistungskarte zu spielen und zu demonstrieren, wie veraltet ihr Wissen ist
Reinstate Monica
3
Warten Sie ... im Ernst, ich dachte, SP WÄRE in Bezug auf die Leistung besser als reine SQL-Aufrufe von beispielsweise C #.
Sk93
3
Klingt so, als wüssten Sie genau, warum sie enthalten waren. : P
Mason Wheeler
4
Als ich aufgewachsen bin, habe ich endlich verstanden, warum alles durch die DB gehen sollte :) Im Ernst, das vereinfacht so viele Dinge, versuche nicht, das Rad neu zu erfinden.
Jé Queue 16.09.10
3
Ich habe die schöne Argumentation "Wir können kein OR / M verwenden, weil alle Interaktionen SPs verwenden müssen" gehört. Eine solche Verschwendung von Arbeitskraft.
Konfigurator
33

Es ist uns nicht gestattet, die STL oder andere Standard-C ++ - Bibliotheken zu verwenden, da der CTO der Ansicht war, wir könnten das besser und schneller machen. Sogar grundlegende Konstrukte wie Listen und die String-Klasse.

David B
quelle
5
Das einzige Mal, dass ich jemals von jemandem gehört habe, der die STL nicht benutzt, weil sie nicht schnell genug und richtig war, war für Spiele. EA hat eine eigene Implementierung der STL für ihre Spiele erstellt. Ich bezweifle sehr, dass es noch wichtig ist (moderne Spiele sind GPU-begrenzt) und ich bezweifle, dass sie es verwenden. Trotzdem war es eine Implementierung der STL, keine völlig neue Bibliothek. Sie haben noch die STL verwendet, als Sie EASTL verwendet haben.
Matt Olenik
1
@Matt: Um dies hinzuzufügen, konzentrierte sich die EA-Beschwerde auf die Speichernutzung und die Initialisierung. Ihre eigene Implementierung verbrauchte weniger Speicher, gab ihn früher frei und vermied es, Objekte zu initialisieren, die später initialisiert werden würden.
Matthieu M.
Ich würde ihm sagen, dass er es selbst codieren soll.
Rightfold
31

Ungarische Notation

Beispiel aus " Charles Simonyis Erklärung der Namenskonvention für ungarische Notationskennungen " auf MSDN.

1 #include "sy.h"
2 extern int * rgwDic;
3 extern int bsyMac;
4 struct SY * PsySz (char sz [])
6 {
7 char * pch;
8 int cch;
9 struct SY * psy, * PsyCreate ();
10 int * pbsy;
11 int cwSz;
12 vorzeichenloses wHash = 0;
13 pch = sz;
14 while (* pch! = 0
15 wHash = (wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy = & rgbsyHash [(wHash & 077777)% cwHash];
18 für (; * pbsy! = 0; pbsy = & psy-> bsyNext)
19 {
20 char * szSy;
21 szSy = (psy = (struct SY *) & rgwDic [* pbsy]) -> sz;
22 pch = sz;
23 while (* pch == * szSy ++)
24 {
25 if (* pch ++ == 0)
26 Rückkehr (Psy);
27}
28}
29 cwSz = 0;
30 if (cch> = 2)
31 cwSz = (cch-2 / sizeof (int) +1;
32 * pbsy = (int *) (psy = PsyCreate (cwSY + cwSz)) - rgwDic;
33 Null ((int *) psy, cwSY);
34 bltbyte (sz, psy → sz, cch + 1);
35 Rückkehr (Psy);
36}
J8D
quelle
5
Oh, oh, oh, oh, oh!
Setzen Sie Monica
22
Das größte Problem bei diesem Beispiel sind die bedeutungslosen Variablennamen. Entfernen Sie die ungarischen Präfixe und einige von ihnen sind 1 oder sogar 0 Zeichen lang.
9.
8
Dies ist Systems hungarian, das in schwach typisierten Sprachen nützlich ist (da es die Typinformationen codiert, die für das Arbeiten in diesen Sprachen in den Namen von entscheidender Bedeutung sind) - es ist in stark typisierten Sprachen nutzlos. Die bessere Alternative für stark typisierte Sprachen ist Apps Hungarian, das wichtige Informationen zur Verwendung einer Variablen (Member, Pointer, Volatile, Indexer) codiert - etwas, für das die Sprache selbst keine Unterstützung bietet.
Jason Williams
5
Oh bitte. Ich habe noch nie jemals ein lokales mit einem Mitglied verwirrt, und ich verwende nicht so dumm ungarischen für Mitglieder / Einheimische / Felder / was auch immer. Ich denke, sie könnten nützlich sein, um zwischen verschiedenen Arten von Zeichenfolgen zu unterscheiden, wie 'sicher' und 'unsicher', wie Joels Beispiel in Make Wrong Code Look Wrong
Konfigurator vom
3
@configurator: Joels Beispiel ist schrecklich, es wäre besser, wenn er verschiedene Typen hätte, dann würde der Compiler die Verwendung erzwingen.
Matthieu M.
28

Ich habe einmal an einem Projekt gearbeitet, bei dem der Projektleiter vorschrieb, dass jeder Variablen - JEDER Variablen - das Präfix "v" vorangestellt wird. Also, vCount, vFirstName, vIsWarranty usw.

Warum? "Weil wir in VBScript arbeiten und sowieso alles eine Variante ist".

WTF.

Christopher Hawkins
quelle
93
Ich habe einmal in einer Sprache gearbeitet, in der jeder Variablen - JEDER Variablen - das Präfix "$" vorangestellt werden musste.
Keine 10.09.10
6
@nohat: Und du hast gemerkt, dass es unglaublich war, oder?
Josh K
Ich habe einmal in einer Sprache gearbeitet, in der alle meine Variablen mit Interpunktion wie '$' oder '%' oder '@' begannen. Das mache ich immer noch ab und zu.
David Thornley
3
Dies wird erst dann wirklich zum Problem, wenn Sie eine fVor-Funktion setzen müssen, dann ist Ihr Code wirklich fUcked (vUp).
Joe D
1
Klingt nach verschiedenen Versionen von Perl ...
26

Habe das fast vergessen:

Zitat eines Managers:

Beheben oder dokumentieren Sie keine Fehler, die Sie in Ihrem eigenen Code finden. Der Kunde bezahlt uns, um sie in den nächsten Jahren zu identifizieren und zu reparieren.

Dies war nicht für Consumer-Software gedacht, sondern für eine einzelne große Organisation. Selbstverständlich hat der Kunde danach jahrelang gezahlt. Mag trivial erscheinen, aber es ist schwieriger, Fehler zu ignorieren, als sie zu finden.

David B
quelle
2
Dies ist eine schreckliche Politik. Ich hoffe, dieser Manager wurde konserviert.
Bernard
@ Bernard-In den meisten Organisationen ist die Schaffung einer langfristigen Einnahmequelle ein Grund für eine rasche Werbung. Hoffentlich hat jemand anderes den Wahnsinn darin gesehen und ihn / sie versehentlich auf dem Parkplatz überfahren.
Jim Rush
24

Erzwungene XML-Kommentare für alle nicht privaten Methoden, Konstanten, Enums und Eigenschaften.

Dies führte zu ziemlich unübersichtlichem Code, vor allem, da das Endergebnis war, dass die Leute entweder nur /// gedrückt haben, um einen leeren Kommentarstub für alles zu erstellen, oder GhostDoc installiert haben und automatisch generierte Kommentare hinzugefügt haben:

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

[Bearbeiten] Der Grund, warum ich dies als lächerlichen Standard erwähne, liegt nicht darin, dass ich Methodenkommentare für dumm halte, sondern dass die Qualität dieser Kommentare in keiner Weise erzwungen wurde und nur eine Menge Durcheinander in den Codedateien erzeugt hat . Es gibt bessere Möglichkeiten, aussagekräftige Codedokumente zu erstellen, als die Build-Anforderung blind "muss einen Kommentar haben".

Anna Lear
quelle
13
' Validations the handler' - uh-oh
Eric
8
+1 Ugh, ich hasse das. Ich denke, wenn Sie Software verwenden, um Kommentare zu generieren, brauchen Sie sie nicht.
Bleevo
9
Ich denke nicht, dass dies eine schlechte Regel ist. Wenn ich eine Methode lese, die ich zum ersten Mal pflegen muss, hilft es mir sehr, wenn ich Spezifikationen für alle Argumente habe. Es gibt übliche Feinheiten (z. B. was passiert, wenn das Argument null ist, wenn es sich um eine leere Sammlung handelt, den Namen einer nicht vorhandenen Datei usw.).
9.
3
@finnw Ich denke, es ist eine gute Übung, aber ein schlechter Standard. Wenn Entwickler an Bord sind und aussagekräftige Methodenkommentare verfassen, wenn sie dazu berechtigt sind (Ausnahmedetails usw.), ist das großartig. Wenn nicht, kommt es zu einem großen Durcheinander. Und im ersten Fall benötigen Sie überhaupt keine Durchsetzung auf Kompilierungsebene.
Adam Lear
7
Klassischer Fall von Undokumentation. Kommentare, die nichts anderes aussagen als das Offensichtliche, sollten sofort getötet werden.
Cumbayah,
23

Nicht wirklich ein Codierungsstandard, aber wir hatten eine Datei in der Quellcodeverwaltung namens "changelog.txt"

Jedes Mal, wenn Sie einchecken, müssen Sie dieser Datei manuell einen Eintrag hinzufügen. Dieser Eintrag war die Subversion-Revisionsnummer und Ihr Check-in-Kommentar.

Als der neue CTO anfing und jemand ihm dies mitteilte, traf er umgehend eine Entscheidung der Geschäftsleitung und sagte: "Wir werden das nicht mehr tun" und löschte die Datei. Das war schon seit Jahren so.

Jim A
quelle
6
Und niemand wusste davon svn log?
Htbaa
1
Diejenigen, die mit der Politik begonnen hatten, waren schon lange nicht mehr da, und die folgenden hielten sie am Laufen. Ich habe in der gleichen Woche angefangen wie der neue CTO (mein Freund) und wir haben uns beide das angeschaut und gesagt, WTF?
Jim A
20

Einige der Orte, mit denen ich zusammengearbeitet habe, bestanden darauf, nicht verwendeten oder veralteten Code zu kommentieren, anstatt ihn zu löschen. Anstatt dem VCS für den Verlauf usw. zu vertrauen, wurde es durch auskommentierten Code schmerzhaft in den Dateien festgehalten.

Das große Problem dabei ist, dass Sie oft keine Ahnung hatten, warum der Code auskommentiert wurde. War es, weil ein Entwickler aktiv Änderungen vornahm und diese als Referenz behalten wollte, oder wurde sie nicht mehr benötigt?

Jeremy Wiebe
quelle
3
Ich habe in letzter Zeit viele alte auskommentierte Codes gelöscht.
CoderDennis
2
Normalerweise lösche ich auskommentierten Code, es sei denn, er wird mit einer guten Erklärung dafür versehen, warum er auskommentiert ist und warum er beibehalten werden sollte.
Jeremy Wiebe
Ich bin völlig einverstanden. Das Auskommentieren von Code, solange Sie damit arbeiten, ist in Ordnung, aber alles, was in einer Release-Version / einem Hauptzweig enthalten ist, sollte keinen kommentierten Code enthalten. Jemand sagte mir, dass sie "gerne wüssten, wie es anders geht". Ich finde es nur aus den genannten Gründen irritierend: Ist das veraltet, eine Problemumgehung, eine andere Möglichkeit, es zu tun? WTF
Anne Schuessler
Mit VS2013 "Peeks" ist das alles aus dem Fenster. Wir haben jedoch einen Kommentar mit der Aufschrift "Changed Equation - Initials" (Geänderte Gleichung - Initialen) oder so ähnlich eingefügt, damit sich jemand fragt, wie der alte Code in TFS / VCS aussehen würde, wenn dies erforderlich wäre. Es ist also eine Zeile anstelle von 10 auskommentierten Zeilen. Aber VS2013 ist großartig, es zeigt die TFS-Geschichte genau dort, wo Sie sie haben.
Suamere,
17

Der schlechteste Codierungsstandard, an dem ich jemals teilgenommen habe, sind Codebasen, die überhaupt keine hatten. Ich würde lieber einem Codierungsstandard folgen, mit dem ich überhaupt nicht einverstanden bin, als in Codebasen zu arbeiten, in denen es überhaupt keinen gibt. Es macht es sehr viel schwieriger, neue Teile der Codebasis zu lernen.

JaredPar
quelle
16

Das Erzwingen von Inline-Kommentaren für die Versionskontrolle war der sinnloseste Codierungsstandard, den ich ignoriert habe.

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

Der Oracle-Datenbankadministrator, der auf der korrekten Verwendung von Leerzeichen bestand, während eine Datenbank mit einer stark umkämpften Tabelle mit über 200 Feldern und 40 Triggern "gepflegt" wurde, kommt dem nahe.

Ryan Roberts
quelle
Das ist ziemlich abscheulich
Evan Plaice
5
Mmm. Dim Sum ...
Konfigurator
Das habe ich natürlich gemacht, bevor wir die Quellcodeverwaltung hatten. Sobald wir die Quellcodeverwaltung hatten, war es so eine Gewohnheit, dass wir praktisch eine Intervention brauchten, damit das Team damit aufhört. Schließlich haben wir angehalten und alle vorhandenen gelöscht, als wir sie gefunden haben.
Scott Whitlock
Unser leitender Entwickler versucht immer noch, uns dazu zu zwingen. Ich ignoriere die Richtlinie, wenn ich denke, dass ich damit durchkommen kann (und manchmal, wenn ich weiß, dass ich es nicht kann).
Joshua Smith
Wir haben einen Mann in unserem Team, der dies immer noch überall tut (er fügt auch riesige "Change Log" -Dinge in unsere SQL-Skripte ein, die ebenfalls unter Versionskontrolle stehen). Wie mir erklärt wurde, ist das Argument, dass Sie sich nach einigen Änderungen / Festschreibungen nicht mehr an das Datum erinnern, an dem etwas geändert wurde. Das Änderungsprotokoll ist also gut, um sofort zu erkennen, wer was geändert hat und warum, wenn Sie eine Datei öffnen.
Wayne Molina
14

Ich habe Codeüberprüfungen für ein Projekt durchgeführt, das von einem C ++ - Erstauslöser geleitet wurde. Dieser entschied, dass allen Klassenmitgliedsfunktionen der Klassenname und die Sichtbarkeit vorangestellt werden sollten:

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}
user1006
quelle
1
Hast du sie gefragt warum ? Ich würde nur gerne ihre Motivation wissen ..
JBRWilkinson
1
Wow, warum benutzt dieser Typ überhaupt Unterricht ?
Mateen Ulhaq
9

Muss den gesamten Code um vier Leerzeichen einrücken;)

RedFilter
quelle
2
Wie war das schlimm?
Jay Bazuzi
1
Weil dann jede Zeile 4 nicht benötigte Leerzeichen am Anfang hat?
Freitag,
Oh, ich verstehe es jetzt.
Alternative
21
Ja, StackOverflow hat einen wirklich schlechten Codierungsstandard. :-)
P Shved
Große Einrückungen zwingen Sie, die Code-Verschachtelungsstufe niedrig zu halten. Ich habe Einrückungen von 8 gesehen und es hat gut funktioniert.
Toon Krijthe
9

Ich hatte vor Jahren einen Job, bei dem unser gesamter Code linksbündig sein musste - ohne Einrückungen. Der Typ, der diese Richtlinie entwickelte, mochte es nicht, horizontal hin und her zu scrollen, wenn er lange Codezeilen betrachtete, und das Ping-Pong-Spielen mit seinen Augen gleichzusetzen.

Jeremy
quelle
Das ist ein schrecklicher, schrecklicher Kodierungsstandard, dem man folgen muss. Und ein blöder Grund auch dafür!
gablin
4
Wenn Sie horizontal scrollen müssen (zum Beispiel mehr als eine halbe Seite), stimmt wahrscheinlich auch etwas nicht. Kein Einzug ist auch nicht gut, da er den Code völlig unleserlich macht. Ich versuche mich an ein 78-Col-Limit zu halten, aber wenn es erforderlich ist, diesen Betrag zu überschreiten, macht es mir nichts aus, aber ich versuche es zu vermeiden.
Htbaa
8

Dies ist eher ein Beispiel dafür, wie das Fehlen von Codierungsstandards schaden kann.

Ein Auftragnehmer, der bei einer großen Bank arbeitete, bestand darauf, dass die Einhaltung der Standards die besten sei, die es je gab. Die Anwendung wurde in dBase / Clipper geschrieben, für die er der einzige Entwickler war, und natürlich hat er den Standard entwickelt.

  • Alles ist in Großbuchstaben. Ich meine alles, einschließlich der seltenen Kommentare, die er gemacht hat.
  • Keine Einrückung.
  • Die Benennung von Variablen war etwas im Sinne von APRGNAME. A = Gültigkeitsbereich der Variablen, z. B. P für public, PRG = die ersten drei Zeichen der Quelldatei, aus der die Variable erstellt wurde, NAME = Variablenname in den verbleibenden 6 Zeichen, die dBase / Clipper zulässt.
  • Die ersten 4 und letzten 4 Zeilen des Quellcodes waren 80 * lang. Warum? So konnte er hören, wie der Nadeldrucker den Druck einer Datei startete und beendete. Speicher ist das gesamte Programm, das wöchentlich über den Mainframe gedruckt wurde, 20.000 Seiten.
  • Ich bin sicher, es gab noch viele mehr, die ich aus meinem Gehirn verbannt habe.

Zu diesem Zeitpunkt war ich ein sehr neuer Autodidakt, wusste aber genug, um nicht auf den verrückten Wissenschaftler zu hören und die Hölle loszuwerden, bevor ich darum bat, das Projekt zu übernehmen.

Und ja, wir sagten dem Management, wie schlecht diese Praktiken waren, bekamen aber immer das Übliche: "Bezahle diesem Bauunternehmer den höchsten Dollar, von dem er wissen muss, wovon er spricht."

Tim Murphy
quelle
7
Verspotten Sie bitte keine älteren Dinosaurier. Sie machten uns möglich.
P Shved
4
Klingt nach Arbeitsplatzsicherheit.
MIA
7
Es ist genial, einen Audiomarker zu haben, damit Sie wissen, wann jede Datei gedruckt wird. Ich werde \07jetzt am Anfang jeder Datei hinzufügen .
Konfigurator
2
Die Verwendung eines solchen Benennungsschemas (nicht in Großbuchstaben) machte Sinn, da die Regeln für das "Scoping" der dBase-Variablen nicht existierten. Alles war effektiv global. Ein iArray, mit dem ein Array in einer Prozedur indiziert wird, kann ieine aufrufende Prozedur stören . Sie müssen verwenden PRIVATE ALL LIKE m*und PRIVATE ium dieses "Abschatten" zu verhindern
Gerry
8

Noch eine Explosion von meiner Vergangenheit.

Zitat des Firmeninhabers:

Es wird keinen Code geben, der mit interpretierenden Sprachen geschrieben wurde, da ich 25 Millionen durch das in Java geschriebene {expletive} Projekt verloren habe.

Das Java-Projekt war ein Aktienhandelssystem, das für einige Dutzend Aktien entwickelt wurde und nun zur Verarbeitung von Tausenden verwendet wurde. Anstatt die Designmängel oder die schlechte Hardware zu beheben, musste das gesamte Unternehmen alle Nicht-C / C ++ - Anwendungen auf C / C ++ umstellen, und alle Neuentwicklungen mussten in C / C ++ erfolgen. Interpretierende Sprachen bedeuteten alles, was nicht kompiliert war, und der Eigentümer betrachtete Assembler, C und C ++ nur als kompiliert.

Für ein Unternehmen mit 800 Mitarbeitern, in dem der größte Teil des Codes in Java und Perl war, bedeutete dies, dass das gesamte Unternehmen in den nächsten Jahren den größten Teil seiner Zeit damit verbrachte, perfekten Code in C / C ++ umzuschreiben.

Lustigerweise war ich ungefähr zwanzig Jahre vor diesem Fiasko in einer anderen Firma, in der der technische Leiter entschied, dass unsere Sortierlogik (es war eine Blasensortierung) in Assembler neu codiert werden musste, anstatt durch Quick Sort ersetzt zu werden, weil - Algorithmen dies tun Leistung nicht verbessern. Die einzige Möglichkeit, die Leistung zu verbessern, bestand darin, dieselbe Logik in Assembler neu zu schreiben.

In beiden Fällen bin ich kurz nach dem Diktat gegangen.

David B
quelle
Läuft heute noch eines der beiden Unternehmen?
4.
Die eine, die Java "verlegt" hat, ist die andere längst weg. Sie haben den Umzug von TRS-80 auf einen PC nie überstanden.
David B
6

Wie viele Programmierer (aber nicht genug) hasse ich Code-Dekoration. Es macht mich wütend, wenn ich ein Dollarzeichen ($) als Präfix für Variablennamen oder Unterstriche für private Variablen verwenden muss, auch ohne Getter / Setter. Wenn Sie Ihren Code dekorieren müssen, um ihn zu verstehen, müssen Sie die Hölle loswerden!

Adam Harte
quelle
Nun, wie "Will" sagt: "Ich stelle den Unterstrich voran, damit meine privaten Variablen in meinem Intellisense gruppiert werden. Ich mache dies jedoch nur für Variablen, die auf einen Typ bezogen sind. Variablen, die innerhalb einer Methode oder eines engeren Bereichs deklariert wurden, lasse ich den Unterstrich off. Macht es einfach, sie getrennt zu halten und weniger benutzte Variablen zusammen zu halten. " und ich muss ihm zustimmen.
7wp
1
Ich denke nicht, dass die Gruppierung Ihrer Variablen in Ihrer bevorzugten proprietären IDE ein guter Grund ist, Ihren gesamten Code zu entstellen.
Adam Harte
Wenn es Ihr Code ist, erscheint es völlig vernünftig, ihn in Ihrer IDE verwendbar zu machen. Das Voranstellen von Unterstrichen ist auch in vielen Sprachen üblich, sodass die Benutzer wissen, was es bedeutet, wenn sie es sehen.
rjmunro
1
+1 Die Verwendung einer guten IDE (eine, die Regex-Suche verwenden kann ) ist für mich sinnvoller. Scratch IDE, lernen Sie, einen Texteditor und ein Terminal zu verwenden, und Sie werden ein viel besserer Programmierer sein. Als Randnotiz, ich mag die Perl-Siegel nicht besonders, aber zumindest haben sie einen Nutzen, anders als die PHP-Siegel.
Alternative
6
Seufz ... eine andere dieser "IDEs sind für Fotzen".
Nagler
6

Ich arbeite seit einiger Zeit mit einem Web-System, bei dem alle übergebenen Parameter P1, P2, P3 usw. heißen mussten. Keine Chance in der Hölle zu wissen, wozu sie dienen, ohne umfangreiche Dokumentation.

Außerdem sollte - obwohl dies kein strikter Kodierungsstandard ist - im selben System jede einzelne Datei den Namen xyz0001.ext, xyz0002.ext, xyz0003.ext usw. tragen, wobei xyz der Code für die Anwendung an sich war.

CB Du Rietz
quelle
6

Dies war vor langer Zeit - 1976 um genau zu sein. Mein Chef hatte noch nie von Edsger Dijkstra gehört oder eine Ausgabe von CACM gelesen, aber er hatte irgendwo das Gerücht gehört, dass "GOTO ist schlecht", so dass wir GOTO nicht in unseren COBOL-Programmen verwenden durften. Dies geschah, bevor COBOL das "end if" hinzufügte, also zu der Zeit nur zweieinhalb der drei klassischen Kontrollstrukturen (Sequenz, if / then / else, perform (dh do while)). Er erlaubte widerwillig GOTO in unseren Basisprogrammen und Verzweigungsanweisungen in unseren Assembler-Sprachprogrammen.

Tut mir leid, dass dies eine Art "Du musstest da sein" -Geschichte ist. Soweit ich weiß, verfügt jede seit 1976 erfundene Sprache über angemessene Kontrollstrukturen, sodass Sie GOTO niemals verwenden müssen. Der Chef wusste jedoch nie, WARUM GOTO als schädlich eingestuft wurde oder welche Sprache die kindliche Störung und welche die tödliche Krankheit war.

Mark Lutton
quelle
6

Ich arbeitete in einem Projekt, in dem der Chefarchitekt (auch) expliziten Code schreiben wollte. Eines der schlimmsten Beispiele, die ich im Code gefunden habe (und er stimmte dem erfreut zu), war das Folgende.

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

Sogar ReSharper hat dir gesagt, dass das falsch ist!

Jax
quelle
9
Es würde Ihnen schwer fallen, etwas von einer als ungültig deklarierten Funktion zurückzugeben.
Mircea Chirea
7
@MAttB Überlegen Sie, unter welchen Bedingungen der final ( else) - Zweig ausgeführt werden soll.
Richard
6
else {return string.Empty; } wird ausgeführt, wenn die obigen 2 Zeilen in 5 Jahren von einem Wartungsentwickler bearbeitet wurden. Wenn Sie jedoch string.Empty zurückgeben, wird die Tatsache ausgeblendet, dass es sich um eine unmögliche Bedingung handelt. Stattdessen sollte InvalidOperationException ausgelöst werden ("Dieser Code sollte keine Drei-Werte-Logik unterstützen").
MatthewMartin
1
Das ist schrecklich. Was ist los mit return verbose ? someString : someOtherString;?
Callum Rogers
1
@ Callum Ternary Betreiber könnte verboten werden :) war schon da, bevor ...
hplbsh
6

Bei meinem letzten Job wäre "Standards" ein sehr starker Ausdruck für das, was mir der Typ gegeben hat, der mich eingestellt hat. Beim Programmieren von Websites in ColdFusion und SQL wurden mir folgende Codierungsanforderungen gestellt:

  • Verwenden Sie keine Includes. Ich mag eine große Seite
  • Trennen Sie Wörter in Variablen- und Spaltennamen immer durch Unterstriche (außer isactive, firstname usw.)
  • Verwenden Sie niemals Abkürzungen - schreiben Sie immer den Vornamen aus (er schrieb häufig fname und so weiter)
  • Verwenden Sie keine verwirrenden Namen (wie amount_charged und charge_amount, die verschiedene, aber verwandte Dinge messen).
  • Verwenden Sie keine DIVs und nur minimales CSS - verwenden Sie stattdessen verschachtelte Tabellen (ich habe einmal sechs Ebenen tief gefunden).
  • Zwischenspeichern Sie keine Abfragen. Je.
  • Wird eine Variable auf mehreren Seiten verwendet? Anwendungsbereich.
  • Jede Seite ist ein eigener Try / Catch-Block. Wir brauchen / wollen keinen globalen Fehlerbehandler.

Ich fing an, diese zu ändern, sobald er aufhörte.

Ben Doom
quelle
"Verwenden Sie keine verwirrenden Namen" scheint mir fair genug ...
8128
1
Es ist absolut eine faire Richtlinie. Mein Punkt war, dass er es überhaupt nicht befolgte. Ich denke, seine Vorstellung von "nicht verwirren" und meine waren unterschiedlich.
Ben Doom
4

In meinem Leben als C ++ - Programmierer wurden zwei wirklich üble "Regeln" durchgesetzt:

  1. "Wir können die STL nicht verwenden, da sie von VC ++ 4.1 nicht unterstützt wird (und wir derzeit nicht auf VC ++ 6.0 umsteigen können)."
  2. „Sie nicht verwenden QuickSort, weil es O sein kann (n ^ 2) in schlimmen Fällen, benutzen Sie diese Implementierung des Algorithmus HeapSort I (Name des Projektleiters gelöscht) als Student schrieb.“

quelle
6
Was war falsch an der HeapSort des Projektleiters?
7wp
4
Tatsächlich kann QuickSort falsch sein, wenn der Code von externen Benutzern akzeptiert wird, da er für O(n^2)DOS-Angriffe geöffnet wird (Zuführung von Worst-Case-Eingaben). Auch, warum es nicht möglich war, zu wechseln - es war selbst eine gültige Entschuldigung, STL nicht zu verwenden.
Maciej Piechotka
4

Ich bin gezwungen, XML-Dokumentation für alle Klassen und Klassenmitglieder zu haben. Einschließlich privat. Es wird empfohlen, standardmäßige Ghostdoc-Kommentare zu verwenden.

public class User 
{
    /// <summary>
    /// the _userID
    /// </summary>
    private int _userID;
}
Carl Bergquist
quelle
Sehr ähnlich zu dieser früheren Antwort .
10.
Ja. Alles was ich brauche, um auch private Mitglieder zu kommentieren. Was noch weniger Sinn macht.
Carl Bergquist,
Ermutigt, Ghostdoc zu verwenden ?! Gah
Konfigurator