Java-Stilklassen in c ++

8

Ich bin auf diesen Artikel gestoßen, der einen Codierungsstil in C ++ vorschlägt, der auf den ersten Blick etwas seltsam aussieht. Aber nachdem ich es durchgelesen und ein bisschen nachgedacht habe, denke ich wirklich darüber nach, es auszuprobieren.

Der attraktivste Vorteil ist die einfache Umgestaltung der Methoden. Während ich eine neue Klasse schreibe, ändere ich ständig Methodennamen, Parameter usw. In C ++ ist es ziemlich ärgerlich, einen Methodennamen in zwei Dateien (.h, .cpp) ändern zu müssen.

Ich habe versucht, etwas mit diesem Stil nicht zu finden, aber abgesehen von der Tatsache, dass der Code für erfahrene C ++ - Programmierer wirklich seltsam aussieht und sich auch so anfühlt, kann ich keinen größeren Fehler feststellen. Aber da ich ein ziemlich unerfahrener C ++ - Programmierer bin, hoffe ich, dass mich hier jemand auf mögliche Gefahren aufmerksam macht.

Meine Frage lautet also:

Gibt es ernsthafte Nachteile bei der Verwendung dieses Codierungsstils?

Bughi
quelle
2
Sie werden wahrscheinlich Probleme mit Vorlagen haben.
Thomas Eding
1
und Name Mangling
Ratschenfreak
@ThomasEding könnten Sie näher darauf eingehen? Ich habe struct Bim Beispiel eine Vorlage geändert und sie wurde einwandfrei kompiliert.
Bughi
1
Ich verstehe den Punkt des Artikels nicht. Es geht gegen alles, was in C ++ als guter moderner Code angesehen wird ...
Klaim
1
Ich mag die Trennung der Schnittstelle von der Implementierung. Es ist sehr einfach, die * .h-Datei zu lesen und die Benutzeroberfläche auf einen Blick zu sehen (da sie kompakt ist). Ich muss mir die Quelldatei wahrscheinlich nie ansehen, es sei denn, es handelt sich um Code, den ich bearbeite. Wenn Sie alles in einer einzigen Datei zusammenfügen, wird eine der Funktionen der Sprache zerstört, die ich am nützlichsten finde (also nein, danke).
Martin York

Antworten:

13

Ja, Sie werden andere C ++ - Programmierer verwirren, wenn Sie Ihren gesamten Code so schreiben. Ich habe noch nie C ++ - Code ohne Vorlage gesehen, der so geschrieben wurde, mit allem in der Header-Datei. Dies wurde auch in einer Frage zum Stapelüberlauf ausführlich erörtert .

Bei den tatsächlichen technischen Problemen fallen mir einige Dinge ein.

  • Ihr ganzer Code wird effektiv inline. Ihre Kompilierungszeiten werden sich wahrscheinlich erhöhen.
  • Jede Neukompilierung wird die Welt einfach deshalb kompilieren, weil es muss.
  • Sie müssen vorsichtig sein, um nicht gegen die One Definition-Regel zu verstoßen . Variablennamen müssen für alle Quelldateien eindeutig sein, da sie effektiv zu einer riesigen Datei werden.

Vielleicht möchten Sie auch die Programmiersprache D ausprobieren , die meiner Meinung nach viele dieser Probleme löst. Der D-Compiler wurde unter Berücksichtigung dieses Stils entwickelt und unterstützt keine 30-jährige C-Abwärtskompatibilität.

Michael Kristofik
quelle
Wir haben C ++ tatsächlich so geschrieben (alles in .h) in meinem Grundstudium. Ich bin mir nicht sicher warum. Ich musste lernen, Dinge zu trennen und sie selbst richtig zu verknüpfen.
KChaloux
9

Es ist nicht gerade eine neue Idee. Anfängliche Programmierer vermeiden Erklärungen wie die Pest und kommen meistens damit durch, weil ihre Programme so klein sind. Die Folge ist, dass Sie sich jetzt um die Reihenfolge kümmern müssen, in der Sie Ihre Funktionen definieren. Die Konsequenz der Sorge um die Definitionsreihenfolge ist die Versuchung, das Problem zu minimieren, indem Sie Ihre Funktionen zu groß machen.

Sie verlieren auch die schöne Trennung von Schnittstelle und Implementierung. Der Autor selbst beklagt, dass die privaten Mitglieder Teil der Header-Datei sind, und "löst" dann das Problem, indem er alle Implementierungsdetails zu einem Teil der Header-Datei macht.

Karl Bielefeldt
quelle
7

Wenn Sie Klassen im Java -Stil möchten, programmieren Sie in Java !

Er macht in seinem Artikel viele Vermutungen, die völlig falsch sind. In keiner bestimmten Reihenfolge:

Kompilierzeit

Dies ist auch kein Problem. Angenommen, Sie haben alle Betriebssystem-Header und häufig verwendeten Container (STL) oder Mathematikbibliotheken in vorkompilierten Headern, und wenn Ihr Programm wirklich riesig ist, haben Sie es wie oben beschrieben in Komponenten unterteilt, für die die verbleibende Codemenge absolut vernachlässigbar ist ein moderner C ++ - Compiler.

Dies ist einfach falsch und zeigt, dass er noch nie an einem großen C ++ - Programm gearbeitet hat. Laden Sie ein großes Open Source C ++ - Programm herunter , kompilieren Sie das Programm und sagen Sie mir, ob Sie jedes Mal, wenn Sie ein Semikolon vergessen, so lange warten möchten.

Vor Gebrauch deklarieren

Es gibt eine C ++ - Funktion, die nur sehr wenige Programmierer zu kennen scheinen (oder zumindest ausgenutzt haben): und das heißt, dass innerhalb einer Klasse deklariert wird, bevor die Verwendung nicht gilt (!). Offensichtlich war sich Bjarne dieses Legacy-Problems in C ++ bewusst und hat es für das Innere von Klassen behoben, konnte es jedoch aufgrund der Abwärtskompatibilität mit C nicht für Deklarationen der obersten Ebene tun (warum? Es muss eine gewisse Komplexität geben, die mir hier fehlt). .

[... viel viel mehr, jede Zeile schmerzhafter als die letzte ...]

Ok, zunächst einmal ist es keine Funktion, von der "nur sehr wenige Programmierer zu wissen scheinen". Zweitens ist dies ein völliges Missverständnis der Vorwärtserklärung und wofür sie verwendet wird. Der Coding Style Guide von Google enthält eine halbwegs anständige Einführung: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarations

Sie sollen den Compiler vereinfachen und die Kompilierungszeit erheblich verkürzen.

Riwalk
quelle
1
Ich musste mich nur für diesen Link zum Google Style Guide entscheiden. Es ist so ein gigantischer Haufen Unrecht. Wir sollten es auf die schwarze Liste setzen und nicht darauf verlinken.
DeadMG
0

Das scheint mir nur ein doofer Name zu sein, um Vorwärtserklärungen zu machen , anstatt #include <blah>.

Der Vorteil der Forward-Deklarationen besteht darin, dass Ihre Kompilierungszeiten erheblich kürzer sein können. Der Hauptnachteil von IMO ist jedoch, dass Sie sich darüber im Klaren sein müssen, wann Sie mit einer Forward-Deklaration davonkommen können und wann nicht scheinbar unverständliche Fehlermeldungen für einen trivialen Fehler.

Whatsisname
quelle