Sollten wir Codierungsstile zugunsten der Autonomie der Entwickler fördern oder diese zugunsten der Konsistenz entmutigen?

15

Ein Entwickler schreibt if/elseBlöcke mit einzeiligen Code-Anweisungen wie:

if (condition)
   // Do this one-line code
else
   // Do this one-line code

Ein anderer verwendet geschweifte Klammern für alle:

if (condition) 
{
   // Do this one-line code
}
else
{
   // Do this one-line code
}

Ein Entwickler instanziiert zuerst ein Objekt und verwendet es dann:

HelperClass helper = new HelperClass();
helper.DoSomething();

Ein anderer Entwickler instanziiert und verwendet das Objekt in einer Zeile:

new HelperClass().DoSomething();

Ein Entwickler ist mit Arrays und forSchleifen einfacher :

string[] ordinals = new string[] {'First', 'Second', 'Third'};
for (i = 0; i < ordinals.Length; i++)
{
    // Do something
}

Ein anderer schreibt:

List<string> ordinals = new List<string>() {'First', 'Second', 'Third'};
foreach (string ordinal in ordinals)
{
    // Do something
}

Ich bin sicher, dass Sie wissen, wovon ich spreche. Ich nenne es Codierungsstil (weil ich nicht weiß, wie es heißt). Aber wie auch immer wir es nennen, ist es gut oder schlecht? Hat die Förderung eine höhere Produktivität der Entwickler zur Folge? Sollten wir Entwickler bitten, zu versuchen, Code so zu schreiben, wie wir es ihnen sagen, damit das gesamte System stilkonform wird?

Saeed Neamati
quelle
1
Eigentlich kam ich hierher, um eine sehr ähnliche Frage zu stellen: Wenn automatische Code-Formatierungs-Tools verfügbar und praktisch sind, ist es wichtiger, dass diese Tools nicht ausgeführt werden (und inkonsistente persönliche Stile beibehalten werden) oder dass ein Stil erzwungen wird?
flauschiger
Konsistenter Stil erleichtert das Lesen von Code. Verwenden Sie daher einen konsistenten Stil. In Ihren Beispielen ist 2, 1, 2 am einfachsten zu lesen. Der letzte Fall ist jedoch anders. In leistungskritischen Anwendungen ist die for-Schleife beim Durchlaufen von Listen schneller. Die Leistung ist bei der Iteration über Arrays identisch. Verwenden Sie in jedem Fall varanstelle des vollqualifizierten Typnamens.
Stephen

Antworten:

19

Ein Kodierungsstandarddokument ist nützlich. Es ist am nützlichsten, wenn es kurz genug ist, damit sich jeder ohne allzu viel Mühe an das Ganze erinnern kann und wenn es niemanden zu viel Schmerz verursacht.

Wie Sie sich entscheiden, Code in Ihre Organisation einzurücken, Namen in Großbuchstaben zu schreiben, Ihre Schleifen zu implementieren oder Ihren Code zu kommentieren, spielt keine Rolle. Der hilfreiche Teil besteht darin, alle dazu zu bringen, Code zu schreiben, der ungefähr so ​​aussieht wie der Code aller anderen.

  • Es wird vermieden, dass Sie eine Minute brauchen, um Ihre Erwartung, wo sich Klammern befinden sollten, neu zu kalibrieren, und dies jedes Mal, wenn Sie den Code eines anderen untersuchen.
  • Es wird vermieden, dass mehrere verschiedene Codestile in derselben Datei enthalten sind.
  • Vielleicht am wichtigsten ist, dass ein geschriebener Standard Argumente über Codierungspraktiken während der Codeüberprüfung vermeidet.

Auch hier spielt es keine Rolle, was die Standards sind, sondern eine Art einfacher, unkomplizierter Standard. Stellen Sie also alle Ihre Entwickler in einen Raum und lassen Sie sie darüber streiten, welche Standards gelten sollen. Dieses Treffen könnte auf unbestimmte Zeit stattfinden, daher gelten folgende Regeln:

  • Alles, was bis zum Ende des Meetings nicht entschieden wurde, wird vom Manager entschieden.
  • Die Besprechung endet nach zwei Stunden oder wenn jemand anfängt zu schreien oder zu weinen, je nachdem, was zuerst eintritt.
  • Der gesamte Standard passt (in angemessener Schriftgröße!) Nur dann auf ein oder zwei Blatt Papier, wenn dies unbedingt erforderlich ist.

Betrachten wir die Annahme jemand | sonst ist | Standards entweder als Ausgangspunkt für Ihre eigene Kodierungsstandards-Besprechung oder als Möglichkeit, die Besprechung vollständig zu vermeiden.

Sobald eine Einigung erzielt wurde, sollten Entwickler in der Lage sein (und von ihnen erwartet werden), sich selbst zu überwachen. Gelegentliche Abweichungen von der Norm sollten keine große Sache sein (und sind möglicherweise sogar zu rechtfertigen), jedoch sollte die unredliche Weigerung, einen bevorzugten persönlichen Stil zugunsten der Norm aufzugeben, zur sofortigen Verlegung in das Büro mit undichten Wasserleitungen oder was auch immer führen .

Demian Brecht zeigt auf fusselfreie Werkzeuge. Dies ist eine perfekte Ergänzung zu einem Kodierungsstandarddokument. Es ist nur gut Codierung zu halten Stil Standards; Es ist wichtig , sich an Kodierungsstandards zu halten, die sich auf gefährliche Praktiken beziehen. Niemand anderes als der Autor wird prüfen, ob jede Codezeile dem Standard für Stil entspricht, aber Sie sollten auf jeden Fall in Betracht ziehen, ein Flusentool in den Workflow Ihres Teams zu integrieren, um wahrscheinliche Fehler automatisch zu erkennen. Darüber hinaus kann das Tool selbst die akzeptierten Praktiken kodifizieren, sodass Sie sie nicht alle einzeln in den Kodierungsstandards auflisten müssen. Geben Sie einfach die Konfiguration des Tools an.

Hinweis: Die Idee der "Codierungsstandards" ist nicht nur auf die Programmierung beschränkt. "Kodierungsstandards" werden in vielen Bereichen verwendet, manchmal innerhalb einer Organisation, häufiger in einer ganzen Branche oder einem ganzen Beruf. Einige Beispiele:

In jedem Fall (und in vielen anderen Fällen) könnte ein kompetenter Praktiker leicht "Code" verstehen, der nicht dem erwarteten Standard entspricht. Warum schreiben so viele Branchen weiterhin detaillierte Anforderungen für Dokumente, die nicht einmal von einem Compiler analysiert werden müssen? Weil Stil zählt . Durch die Darstellung von Informationen in einem Standardstil kann sich der Leser vollständig auf den Inhalt konzentrieren, das Lesen beschleunigen, das Verständnis fördern und Fehler reduzieren.

Caleb
quelle
1
Wenn Sie Ihrem Beitrag die Verwendung von Fusselwerkzeugen hinzufügen, lösche ich meins und +1 deins :)
Demian Brecht
@DemianBrecht, Guter Vorschlag, danke. Es wurden fusselfreie Tools hinzugefügt, um meine Antwort zu verbessern, aber ich denke, Sie sollten auch Ihre verlassen.
Caleb
Na gut dann. +1 sowieso :)
Demian Brecht
Und auch dir!
Caleb
+1 für die "... sofortige Verlagerung ...", da nach meiner Erfahrung ein solches Verhalten mit soziopathischen und / oder narzisstischen Tendenzen vereinbar ist, die mit Softwareentwicklungsteams unvereinbar sind.
Mattnz
16

Stil spielt keine Rolle.

Da habe ich es gesagt.

Nach 30 Jahren und Hunderten von Kundenstandorten und Code von (geschätzten) 500 (oder mehr) Teammitgliedern in diesen Jahren habe ich festgestellt, dass dieser Stil einfach keine Rolle spielt.

Bring es zuerst zum Laufen.

Holen Sie sich ein optimales Volumen an Ressourcen (dh die richtige Datenstruktur, den richtigen Algorithmus).

Fummel über "Stil", nachdem alles andere gelöst wurde. Viel "Stil" nur mit Werkzeugen, niemals manuell.

S.Lott
quelle
2
Amen! Codierungsstandards müssen in Bezug auf echte Vorteile gerechtfertigt sein, und Konsistenz ist kein echter Vorteil, sondern ein Luxus.
JohnFx
12
Aber bei Stil geht es selten um Stil. Es geht darum, häufige Fehler zu vermeiden.
Martin York,
6
Aber es hilft, '=' anstelle von '==' zu vermeiden (verwenden Sie keine Zuweisung innerhalb der Bedingung). Es hilft zu vermeiden, if (t) { x;y;}anstatt if (t) x;y;(verwenden Sie immer '{}' nach if). Bevorzugen Sie konstanten korrekten Code (es ist sehr schwierig, konstante Korrektheit in den Code einzufügen, nachdem er geschrieben wurde. Verwenden Sie std :: cout / std :: cin nicht fprintf / scan, da erstere sehr viel wahrscheinlicher Fehler verursachen. Verwenden Sie Vektor statt Arrays (um ein Überlaufen zu verhindern)
Martin York
5
Es ist offensichtlich von größter Bedeutung, dass es funktioniert. Aber nur weil es funktioniert, heißt das noch lange nicht, dass es erledigt ist. Es muss auch getestet werden. Und dann überprüft. Das alles könnte ein paar Tage dauern. Dann muss es jahrelang gelesen, verstanden und gepflegt werden. Nützlicher Code (warum eine andere Art schreiben?) Wird viel öfter gelesen als geschrieben, so dass das einfache Lesen und Verstehen die Produktivität bis in die Zukunft verbessert. Die Verwendung eines einheitlichen Stils im gesamten Unternehmen ist eine Möglichkeit, diesbezüglich Abhilfe zu schaffen.
Caleb
1
Was ist mit der Erzwingung der Verwendung automatischer Formatierungswerkzeuge? Eclipse und XCode machen es sehr einfach, den Code formatiert zu halten - aber einer der Ingenieure, mit denen ich zusammenarbeite, ist äußerst verärgert, wenn jemand den Code "seines" (dh des Unternehmens) automatisch formatiert, um ihn mit dem Rest der Codebasis in Einklang zu bringen. Die Formatierung ist nur ein kleiner Teil des Stils, aber auch wichtig, insbesondere bei Problemen wie if / else-Verschachtelung und allgemeinem Code-Fluss (ganz zu schweigen von der Lesbarkeit).
flauschiger
4

Es gibt Codierungsstile und es gibt Codierungsgerüche. Es war nicht einmal das ich gefunden habe:

    if(debugCondition)
//         printf("DEBUG: state:%s at debugCondition\n",dbg_state());

    for(i=0; i<MAX;i++)
    {
       //some essential business logic
    }

Mein früherer Arbeitgeber hat es rigoros verboten, Mehrfachleitungen if()ohne Klammern zu verwenden. Es wurde als Fehler vom Typ "Mach es noch einmal und du bist gefeuert" gewertet. Die erlaubten Konstrukte waren

     if(condition) break; 
     if(condition) continue; 
     if(condition) return; 
     if(condition) for()...; 

Dies ergab sich aus einem Fehler wie dem oben gezeigten, der einige Stunden dauerte, um die Hauptseite des Portals zum Stillstand zu bringen.

Es gibt Dinge, die Sie einfach immer tun sollten. Wie switch():

     case 1:
         something();
     break;
     case 2:
         something();
     return;
     case 3:
         something();
     continue;
     case 4:
     case 5:
         something();
     break;
     case 6:
         something();
     //fallthrough;
     case 7:
     ...

Währenddessen tippen Sie:

     case 1:
         something();
     case 2:
         something();
     break;

ohne ein casemit zu schließen //fallthroughgilt als fehler.

Im Allgemeinen gibt es den Kodierungsstandard, bei dem es sich um Richtlinien handelt, die für bestimmte Anforderungen ignoriert, kreativ interpretiert oder geändert werden können. Und es gibt den Abschnitt über "Gerüche" und es ist streng zu befolgen.

SF.
quelle
3

Erstellen Sie Konsistenz mit einem guten Upfront-Design. Was Sie in der Frage beschreiben, ist nichts weniger als Mikromanagement. Ich mache viel Webentwicklung. Deshalb bevorzuge ich RESTful- und CRUD-Entwicklung, die als Services bereitgestellt werden. Dies stellt einfache, gut definierte Entitäten sicher, die auf verschiedene Arten verwendet werden können.

Dieses Design ermöglicht es mir auch, Implementierungsdetails an andere Entwickler zu delegieren. Auf diese Weise füllen sie die Lücken aus, anstatt ein komplettes Systemdesign zu erstellen.

Das Fehlen eines Gesamtdesigns führt zu Inkonsistenzen im System. Die Kritik grundlegender Iterationen und Schleifenkonstrukte trägt wenig zur Verbesserung des Systemdesigns bei. Diese Probleme lassen sich besser mit StyleCop lösen.

Können Sie ein relativ einfaches Diagramm Ihres gesamten Systemaufbaus zeichnen? Ein Entwurf, der die Elemente / Entitäten beschreibt, die an einem neuen Teamentwickler beteiligt sind. Wenn Sie es nicht können oder wenn es sehr aufwendig ist, fehlt das Design.

P. Brian Mackey
quelle
3

IMHO kommt es darauf an ...

Ihre ersten beiden Beispiele sind für mich nicht nur eine Frage des persönlichen Geschmacks.

if (condition)
   // Do this one-line code
else
   // Do this one-line code

(ohne Klammern) = Fehleranfälliger, wenn später mehr Code hinzugefügt wird:

if (condition)
   // Do this one-line code
else
   // Do this one-line code
   // ...and this line as well... oops! this will actually execute either way

Und das ist weniger bequem zu debuggen:

new HelperClass().DoSomething(GetSomeData()); // etc.

Sie können einen Haltepunkt nicht einfach dort setzen, wo Sie ihn benötigen. Wenn dies einmalig ist - fair genug, aber wir diskutieren es als eine Frage des Stils, und sobald Sie solche Dinge überall haben, wird das Debuggen unangenehmer, als es sein muss.

Was Ihr drittes Beispiel betrifft (für vs foreach), sehe ich es jedoch als Geschmackssache an.

Konrad Morawski
quelle
2

Weder. Ich würde strenge Codierungsregeln vermeiden, um nicht mühsam, wählerisch, mikromanagementorientiert und am schlimmsten zeitverschwendend zu sein. Ihr Gefühl der Autonomie ist Ihr eigenes Problem. Wenn ich möchte, dass Sie sich besser fühlen, kaufe ich Ihnen eine Runde Ihres Lieblingsgetränks. Ansonsten erledige etwas.

JeffO
quelle
2

Die Verwendung von Konventionen, Variablennamen, Klassennamen usw. ist eine gute Praxis. Codierungsstile wie die von Ihnen bereitgestellten Beispiele sind jedoch eher trivial und wirken sich weder auf die Lesbarkeit noch auf die Effizienz des Codes aus. Auf der anderen Seite wird der Aufwand, der durch die Durchsetzung eines bestimmten Stils in Kombination mit den Bemühungen der Entwickler entsteht, Probleme verursachen.

AJC
quelle
2

Verwenden Sie ein branchenübliches Flusentool (anscheinend FxCop für C #). Obwohl dies nicht das A und O ist , ist Konsistenz bei großen Projekten wichtig, an denen mehrere Mitarbeiter arbeiten.

Wenn Sie nur an Ihrem eigenen Projekt oder einem kleinen Team arbeiten, würden viele behaupten, es sei übertrieben. Ich glaube anders (ich benutze PEP8 für Python, auch in meinen persönlichen Einzelentwicklerprojekten ).

Die meisten der von Ihnen genannten Beispiele würden jedoch höchstwahrscheinlich nicht von einem Flusenwerkzeug erfasst, da sie einfach keine Rolle spielen.

Demian Brecht
quelle
1

Die Durchsetzung eines einheitlichen Codierungsstils ist immer schwierig. Idealerweise sollte eine solche alltägliche Aufgabe einem Werkzeug überlassen werden. Ich begrüße die Go-Community dafür.

grokus
quelle
1

Es ist eine Mischung aus beidem. Nur weil es ein Standard ist, ist er nicht lesbar und wartbar. Wenn es noch keinen instillierten Standard gibt oder wenn fehlerhafte und unlesbare Aspekte vorhanden sind, ist eine Überarbeitung angebracht.


quelle
1

Letztendlich ist es der Programmierer, der die Programmierung vorantreibt. Es gibt Stilprobleme, die jedoch zweitrangig sind, wenn das Programm veröffentlicht wird.

Es ist hilfreich, Programmierern eine Anleitung zu geben. Dies kann / sollte erfolgen, bevor die Programmierer an die Arbeit gehen, insbesondere wenn sie relativ zum Umfeld oder zur Programmierung selbst Anfänger sind. Unter Anleitung sind einige Programmierer sehr stilbewusst, andere weniger. Die zu Beginn des Projekts gegebenen Anleitungen helfen der ersten Gruppe von Programmierern und erleichtern so die Gesamtaufgabe. Es könnte wenig für die zweite Gruppe tun, was (hoffentlich) an Kreativität wettmachen wird, was ihnen an Konformität fehlt.

Tom Au
quelle
1

Ich denke, es hängt von der Größe des Projekts ab und davon, wie viele Leute daran arbeiten. Ein erfahrener Programmierer kann sich beide verschiedenen Formatstile ansehen und wissen, was in beiden vor sich ging, aber es muss eine Konsultation geben, damit das Auge sie leicht erkennen kann. Wenn Sie Ihre einzeiligen if-Anweisungen ohne die geschweiften Klammern ausführen, sollte dieses Projekt sie nicht verwenden. Wer auch immer dieses Projekt leitet, sollte diese Wahl haben. Ich mag Dinge, die klar und auch sehr kompakt aussehen, wie ich sie bekommen kann. Wenn Sie eine einzelne Zeile machen, wenn statmeents sie besser so aussieht

if() {}
else() {}

Oder auch:

if() {} else () {}

Aber eine einzelne Zeile sollte nicht den Abstand eines Mulitilins verwenden, wenn. Es ist nur so, wie ich Dinge tue. Es macht mir nichts aus, wie das Objekt aufgerufen wird, und das hängt davon ab, wie oft es aufgerufen wird. Wenn es ein paar mal aufgerufen wird, starte ich das Objekt lieber und hängt davon ab, ob es Konstruktoren hat und was nicht auch. Denn wenn Sie einen Konstruktor haben und aufrufen:

Object.method();
Object.method2();

Anschließend haben Sie die Objektkonstruktormethode zweimal aufgerufen, wenn dies durch eine vollständige Instanzierung des Objekts vermieden werden konnte.

Wenn es um foreach und for-Schleifen geht Bei einigen lanauges geht es auch um die lanauge, damit Sie den Schlüssel und den Wert in temporären Arrays besser kontrollieren können, wenn Sie das Array in einer foreach-Schleife betrachten. Und ich weiß, dass einige Sprachen eine Art Optimierung haben, weil sie sich die Schleife ansehen können und genau wissen, wie oft sie aufgerufen wird.

WojonsTech
quelle
1

Während Ihr erstes Beispiel nicht besonders gut ist (das Argument, dass es bei Modifikationen fehleranfälliger ist), habe ich mich im Allgemeinen zu etwas entwickelt Vorzug erhalten, dass Entwickler leicht unterschiedliche Codierungsstile verwenden.

Nach der Arbeit mit dem Code anderer Teammitglieder, manchmal erst nach ein paar Monaten, beginnt die Arbeit im Wesentlichen in einer Inline-Zeile git blame . Nachdem ich über 10 Jahre in meiner Firma gearbeitet habe, kann ich Ihnen wahrscheinlich mit einer Genauigkeit von über 80% sagen, wer eine bestimmte Klasse an einer beliebigen Stelle in unseren 500.000 Codezeilen geschrieben hat.

Während es ein bisschen "Rampenzeit" gibt, wenn Sie anfangen, Code zu betrachten, der einen Stil verwendet, mit dem Sie nicht einverstanden sind, sagen Sie in dieser Zeit wirklich: "Oh, das sieht aus wie John Does Code (weil er benutzt Stil X, aber nicht Stil Y usw.) ". Und das bringt eine Menge Kontext mit sich. In erster Näherung wissen Sie, was Sie von Johns Code erwarten können - welche anderen Teile der Codebasis er gut versteht und welche Teile er nicht versteht, ob er ein SQL-Guru oder ein GUI-Neuling ist usw. usw.

Wenn Sie den Code aller Benutzer über einen Formatierer ausführen, werden diese Informationen im Wesentlichen entfernt und hinter einem ausgeblendet git blame, was Sie möglicherweise nicht tun.

Matt McHenry
quelle
0

Dies hängt sehr stark von der Art der Organisation ab.

Wenn Sie eine kleine Gruppe von Superhelden sind, ist jede Art von Stil in Ordnung. Wenn jeder seinen eigenen Stil hat und sowohl gut als auch intern konsistent ist, dann ist das alles, was Sie brauchen. Die Superhelden werden sagen: "Jane hat Klammern, das ist es, was sie meint" oder "Jack benutzt camelCase für Variablen".

Universelle Standards sind in der Regel am besten geeignet, um jeden zum B + -Spieler zu machen. Deine Superhelden werden dadurch runtergezogen. Aber wenn Sie wollen, dass ein A-Spieler und ein halbes Dutzend B-Spieler und ein halbes Dutzend C-Spieler einen Durchschnitt von bis zu B + erreichen, dann wollen Sie einheitliche Standards. In diesem Fall soll jeder das Gleiche tun, damit der A-Spieler so schnell wie möglich durch den Code eines jeden gehen kann.

Viele von euch sagen: "Aber warte, warum nicht die B- und C-Spieler abschaffen?"

In Wirklichkeit gibt es nicht viele Superhelden. Während es sich lohnt, sie bei Google zu finden und zu pflegen, kann die Einführung eines neuen Abrechnungssystems für Ma Bell für das letztgenannte Team kostengünstiger sein. (Und wenn Sie wirklich Superhelden haben, sind 4 oder 5 doppelt so teuer wie ein Dutzend Junioren)

MathAttack
quelle