Frage

Welche Richtlinien haben Sie die allgemeine Qualität des Codes zu verbessern, folgen? Viele Menschen haben Regeln darüber, wie C ++ Code zu schreiben, der (angeblich) macht es schwieriger, Fehler zu machen. Ich habe Leute gesehen bestehen , dass jede if Anweisung durch eine geschweifte Klammer Block folgt ({...}).

Ich bin daran interessiert, was Richtlinien andere Menschen folgen, und die Gründe hinter ihnen. Ich interessiere mich auch für Richtlinien, die Sie denken, sind Müll, sondern werden allgemein gehalten. Kann mir jemand ein paar vorschlagen?

der Ball ins Rollen zu bekommen, werde ich nur einige nennen, mit zu beginnen:

  • Verwenden Sie immer Klammern nach jeder if / else Aussage (siehe oben). Die Logik dahinter ist, dass es nicht immer einfach ist, zu sagen, ob eine einzelne Anweisung ist eigentlich eine Anweisung oder ein Präprozessormakro, die mehr als eine Anweisung erweitert, sodass dieser Code brechen würde:
    // top of file:
    #define statement doSomething(); doSomethingElse

    // in implementation:
    if (somecondition)
        doSomething();

, aber wenn Sie Klammern verwenden, dann wird es wie erwartet.

  • Verwenden Sie Präprozessormakros für die bedingte Kompilierung ONLY. Präprozessormakros können alle Arten von Hölle verursachen, da sie nicht C ++ Scoping-Regeln erlauben. Ich habe mit gemeinsamen Namen in Header-Dateien gestrandet oft aufgrund Präprozessormakros laufen. Wenn Sie nicht vorsichtig sind, können Sie alle Arten von Chaos verursachen!

Jetzt über dir.

War es hilfreich?

Lösung

Ein paar meiner persönlichen Favoriten:

Strive Code zu schreiben, konst korrekt ist. Sie werden die Compiler gewinnen auszusondern einfach zu beheben zu helfen, aber manchmal schmerzhaften Fehler. Ihr Code wird auch sagen, eine Geschichte von dem, was man damals im Sinn hatte man es geschrieben -. Wertvoll für Einsteiger oder Maintainer, wenn Sie weg sind

Get aus dem Speicher-Management-Geschäft. Erfahren Sie intelligente Zeiger verwenden: std::auto_ptr, std::tr1::shared_ptr (oder boost::shared_ptr) und boost::scoped_ptr. Lernen Sie die Unterschiede zwischen ihnen und wenn man gegen ein anderes zu verwenden.

Sie werden wahrscheinlich die Standard Template Library zu verwenden. Lesen Sie die Josuttis Buch . Hören Sie nicht nur nach den ersten paar Kapitel über Container zu denken, dass Sie die STL kennen. Drücken Sie bis zur guten Sache. Algorithmen und Funktionsobjekte

Andere Tipps

  1. unnötigen Code löschen.

Das ist alles.

  • Verwenden und erzwingt einen gemeinsamen Codierung Stil und Richtlinien. Begründung:. Jeder Entwickler im Team oder in der Firma ist in der Lage, den Code ohne Ablenkungen zu lesen, die aufgrund unterschiedlicher Klammer Arten oder ähnliches auftreten können,
  • Sie regelmäßig eine vollständige Ihrer gesamten Source-Basis wieder aufzubauen (das heißt täglich tun baut oder baut nach jedem checkin) und alle Fehler berichten! Begründung:. Die Quelle fast immer in einem benutzbaren Zustand ist, und Probleme erkannt werden, kurz nachdem sie „umgesetzt“ werden, wo Problemlösung billig ist

Schalten Sie alle Warnungen, die Sie in Ihrem Compiler stehen kann (gcc: -Wall ist ein guter Anfang, aber beinhaltet nicht alles so die Dokumentation prüfen), und sie Fehler machen, damit Sie sie beheben müssen (gcc: -Werror).

Google-Style-Guide, in einer dieser Antworten erwähnt, ist ziemlich solide. Es gibt einige sinnlose Sachen drin, aber es ist mehr gut als schlecht.

Sutter und Alexandrescu schrieben ein anständiges Buch zu diesem Thema, die so genannten C ++ Coding Standards .

Hier einige allgemeine Tipps von lil‘ole mir:

  1. Ihre Vertiefung und Bracketing-Stil sind beide falsch. So sind alle anderen ist. So die Standards des Projekts folgen hierfür. Schlucken Sie Ihren Stolz und Setup-Editor, so dass alles so konsistent wie möglich mit dem Rest der Codebasis ist. Es ist wirklich wirklich ärgerlich mit Code zu lesen, die inkonsistent eingekerbt ist. Das heißt, Belichtungsreihen und nichts Einrücken haben auch immer mit dem zu tun „Verbesserung Ihres Codes.“ Es geht mehr um Ihre Fähigkeit, mit anderen zu arbeiten verbessern.

  2. gut Kommentar. Dies ist äußerst subjektiv, aber im Allgemeinen ist es immer gut zu schreiben Kommentare über Warum Code funktioniert so, wie es der Fall ist, anstatt zu erklären, was es tut. Natürlich für komplexen Code ist es auch gut für Programmierer, die nicht mit dem Algorithmus oder Code vertraut sein können, eine Idee von haben, was es auch tut. Links zu Beschreibungen der Algorithmen verwendet werden, sind sehr willkommen.

  3. Express-Logik in so unkompliziert wie möglich zu. Ironischer Vorschläge wie „Konstanten auf der linken Seite der Vergleiche setzen“ haben hier falsch gegangen, glaube ich. Sie sind sehr beliebt, aber für englische Muttersprachler, brechen sie oft den logischen Ablauf des Programms zu jenen Lesen. Wenn Sie nicht vertrauen können selbst (oder Compiler) Gleichheit zu schreiben richtig vergleicht, dann mit allen Mitteln Tricks wie diese verwendet werden. Aber du bist zu opfern Klarheit, wenn Sie es tun. Auch unter diese Kategorie fallen, sind Dinge wie ... „Hat meine Logik 3 Stufen der Vertiefung? Könnte es einfacher sein?“ und Roll ähnlichen Code in Funktionen. Vielleicht sogar Funktionen Aufspaltung. Es braucht Erfahrung, Code zu schreiben, die elegant die zugrunde liegende Logik zum Ausdruck bringt, aber es lohnt sich daran zu arbeiten.

Das war ziemlich allgemein. Für konkrete Tipps und Tricks kann ich eine viel bessere Arbeit als Sutter und Alexandrescu nicht tun.

In if-Anweisungen setzen die Konstante auf der linken Seite d.

if( 12 == var )

nicht

if( var == 12 )

Beacause wenn Sie vermissen ein ‚=‘ eingeben, dann wird es Aufgabe. In der Top-Version sagt der Compiler dies nicht möglich ist, im letzteren läuft und die, wenn immer wahr ist.

Ich benutze Klammern für wenn ist, wenn sie nicht auf der gleichen Linie sind.

if( a == b ) something();
if( b == d )
{
    bigLongStringOfStuffThatWontFitOnASingleLineNeatly();
}

Öffnen und Schließen von Klammern immer ihre eigenen Linien erhalten. Aber das ist natürlich persönliche Konvention.

Nur Kommentar, wenn es nur notwendig ist, zu erklären, was der Code tut, wo Sie den Code lesen kann man nicht sagen, das gleiche.

Sie Kommentar nicht aus Code, den Sie nicht mit mehr sind. Wenn Sie alten Code wiederherstellen möchten, verwenden Sie das Quellkontrollsystem. Auskommen Code nur macht die Dinge aussehen unordentlich, und macht Ihre Kommentare, die tatsächlich wichtig in den Hintergrund Chaos von kommentierten Code sind.

  1. Verwenden Sie eine konsistente Formatierung.
  2. Bei Arbeiten an Legacy-Code, um den vorhandenen Stil der Formatierung verwenden, esp. Klammer-Stil.
  3. Holen Sie sich eine Kopie von Scott Meyers Buch Effective C ++
  4. Holen Sie sich eine Kopie von Steve MConnell Buch Code Complete.

Es gibt auch eine schöne C ++ Style Guide intern verwendet von Google, die hier erwähnt die meisten Regeln enthält.

Starten Sie eine Menge Kommentare zu schreiben - aber verwenden, die als eine Gelegenheit, den Code zu Refactoring, so dass es selbsterklärend ist.

ie:

for(int i=0; i<=arr.length; i++) {
  arr[i].conf() //confirm that every username doesn't contain invalid characters
}

Sollte habe etwas mehr wie

for(int i=0; i<=activeusers.length; i++) {
  activeusers[i].UsernameStripInvalidChars()
}
  • Verwenden Sie Registerkarten für Vertiefungen, sondern ausrichten Daten mit Leerzeichen Dies bedeutet, dass Menschen wie viel einrücken, indem Sie die Registerkarte Größe entscheiden können, sondern auch, dass die Dinge ausgerichtet bleiben (zB möchten Sie vielleicht alle ‚=‘ in einer vertikalen Linie, wenn assign Werte auf eine Struktur)

  • Allways verwenden Konstanten oder Inline-Funktionen anstelle von Makros wo posible

  • Never ‚mit‘ in Header-Dateien verwenden, weil alles, was das heafer betroffen sein wird auch beinhaltet, auch wenn die Person Ihren Kopf includeing will nicht alle std (zum Beispiel) in ihrem globalen Namensraum.

  • Wenn etwas länger als etwa 80 columes ist, sie brechen in mehrere Zeilen zB

    if(SomeVeryLongVaribleName != LongFunction(AnotherVarible, AString) &&
       BigVaribleIsValid(SomeVeryLongVaribleName))
    {
        DoSomething();
    }
    
  • Nur Überlastung Betreiber, um sie zu tun, was der Benutzer erwartet, zum Beispiel des + und Überlastung - Betreiber für eine 2dVector ist in Ordnung

  • Sie immer Ihren Code kommentieren, auch wenn es nur zu sagen, was der nächste Block (zB „löschen Sie alle Texturen, die für diese Ebene nicht benötigt werden“) tut. Jemand müssen später mit ihm arbeiten, posibly, nachdem Sie verlassen haben, und sie wollen nicht mit keine Kommentare 1000 von Codezeilen zu finden, um anzuzeigen, was zu tun, was.

  1. Setup-Konvention Codierung und alle Beteiligten machen die Konvention folgen (Sie würde nicht wollen, Code zu lesen, die Sie benötigen, um herauszufinden, wo die nächste Anweisung / Ausdruck ist, weil es nicht richtig eingerückt ist)
  2. ständig Ihren Code Refactoring (eine Kopie von Refactoring erhalten, von Martin Fowler, Vor-und Nachteile in dem Buch sind detailliert)
  3. schreiben lose gekoppelten Code (vermeiden Schreiben Kommentar von selbsterklärend Code zu schreiben, lose gekoppelten Code neigt dazu, leichter zu verwalten / anpassen ändern)
  4. , wenn möglich, Einheit testen Sie Ihren Code (oder, wenn Sie Macho genug sind, TDD).
  5. Release früh, Release oft
  6. vermeiden vorzeitige Optimierung (Profilierung hilft bei der Optimierung)

In ähnlicher Weise können Sie einige nützliche Anregungen finden Sie hier: Wie stellen Sie falschen Code falsch aussehen? Welche Muster verwenden Sie semantische Fehler zu vermeiden?

Wenn Sie können, verwenden Sie Prä-Inkrement statt Nachinkrement.

Ich benutze PC-Lint auf meine C ++ Projekte und vor allem wie, wie sie bestehende Publikationen wie die MISRA-Richtlinien oder Scott Meyers ‚Effective C ++‘ und ‚More Effective C ++‘ verweist. Auch wenn Sie sich auf das Schreiben sehr detaillierte Begründungen für jede Regel Ihre statische Analyse-Tool prüft planen, ist es eine gute Idee zu etablierten Publikationen hinweisen, dass Ihre Benutzer vertraut.

Hier ist die wichtigste Rat, den ich durch eine C ++ Guru gegeben wurde, und es hat mir geholfen, in einigen kritischen Gelegenheiten Fehler in meinem Code zu finden:

  • Verwenden Sie const Methoden, wenn eine Methode ist nicht annehmen das Objekt zu ändern.
  • Verwenden Sie const Referenzen und Zeiger in Parameter, wenn das Objekt nicht annehmen das Objekt zu ändern.

Mit diesen zwei Regeln, der Compiler wird Ihnen sagen, kostenlos, wo in Ihrem Code die Logik fehlerhaft ist!

Auch für einige gute Techniken könnten Sie folgen Google-Blog "Testen auf der Toilette" .

Sehen Sie es ein halbes Jahr später

stellen Sie sicher einrücken richtig

Hmm -. Ich wahrscheinlich ein wenig präziser sein sollte

Ich bin nicht so sehr suche Rat für mich - ich bin ein statisches Code-Analyse-Tool zu schreiben (die aktuellen kommerziellen Angebote sind einfach nicht gut genug für das, was ich will), und ich bin auf der Suche nach Ideen für Plugins mögliche Fehler im Code zu markieren.

Einige Leute haben Dinge wie const Korrektheit und mit Smart-Pointer erwähnt - das ist die Art von denke ich überprüfen kann. Überprüfen auf Einbuchtung und Kommentierung ist ein bisschen schwerer zu tun (von einer Programmier Sicht sowieso).

Smart-Pointer haben eine schöne Art und Weise das Eigentum sehr deutlich anzugeben. Wenn Sie eine Klasse oder eine Funktion:

  • , wenn Sie einen Rohzeiger zu bekommen, Sie besitzen nichts. Sie durften die pointee, mit freundlicher Genehmigung des Anrufers verwenden, die garantiert, dass der pointee länger am Leben bleiben, als Sie.
  • , wenn Sie erhalten eine weak_ptr , müssen Sie die pointee nicht besitzen, und oben auf, dass die pointee jederzeit verschwinden kann.
  • , wenn Sie ein shared_ptr erhalten, besitzen Sie das Objekt zusammen mit anderen, so dass Sie sich keine Sorgen machen. Weniger Stress, aber auch weniger Kontrolle.
  • , wenn Sie erhalten eine auto_ptr , Sie sind der alleinige Eigentümer des Objekts. Es gehört dir, du der König bist. Sie haben die Macht, das Objekt zu zerstören, oder geben es an jemand anderen (und damit das Eigentum zu verlieren).

Ich finde den Fall für auto_ptr besonders stark: in einem Design, wenn ich ein auto_ptr sehe, weiß ich sofort, dass das Objekt von einem Teil des Systems zum anderen zu „wandern“ wird

.

Dies ist zumindest die Logik, die ich auf meinem Haustier Projekt verwenden. Ich bin mir nicht sicher, wie viele Variationen gibt es zu dem Thema sein kann, aber bis jetzt diese ruleset hat mich gut bedient.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top