C++ Coding Overhead



  • Die tiefen Packages sind doch ein Übel aus der Java-Welt. Leider meinen einige C++-Anfänger, sich an diesem Über orientieren zu müssen.

    Der Sinn von Namespaces ist es nicht die Aufgaben zu unterteilen, dafür sind Klassen da. Namespaces sollen einen Namenskonflickt mit fremden Bibliotheken verhindern. Wenn du es innerhalb deiner eigenen Projekte nicht schaffst, Namenskonflickte zu vermeiden, hast du ganz andere Probleme.

    Pack doch einfach alles in eine Namespace-Ebene, die nach deiner Organisation oder Projekt benannt wird. Wenn du dann merkst, das es knapp wird, kannst du z.B. ausnahmsweise einen weiteren Namespace-Ebene einführen, die aber wirklich nur eine Ausnahme ist.

    Die Java-Welt sollte nicht als Vorbild dienen. Ich bekomme in unseren Java-Projekten echt das Ko***. Beispiel: de.firma.abteilung.projekt.unterprojekt.thema.unterthema .
    Und dann noch für Implementierungen, die niemand sehen darf:

    de.firma.abteilung.projekt.unterprojekt.thema.unterthema.impl

    Yo, ohne Codecompletion wären wir verloren, innerhalb eines Projektes.



  • Artchi schrieb:

    Der Sinn von Namespaces ist es nicht die Aufgaben zu unterteilen, dafür sind Klassen da.

    Das ist etwas zu übertrieben dargestellt. Klassen sind Kapselung auf nidriger Stufe, Namespaces fassen in Java idealerweise Klassen zu grösseren Einheiten zusammen.
    Wie du gesagt hast: Klassen -> Namespace für Unterthema -> Namespace für Thema -> Namespace für unterprojekt -> Namespace für Projekt.

    In C++ sind die Einteilungen eher Klassen -> Header -> Ordner -> Namespaces. Es gibt auch Leute die Namespaces und Ordner auf die gleiche Stufe setzen, das kann man von mir aus auch so machen.



  • de.c++.forum.c++.troll schrieb:

    Artchi schrieb:

    Der Sinn von Namespaces ist es nicht die Aufgaben zu unterteilen, dafür sind Klassen da.

    Das ist etwas zu übertrieben dargestellt. Klassen sind Kapselung auf nidriger Stufe, Namespaces fassen in Java idealerweise Klassen zu grösseren Einheiten zusammen.

    Java hat keine Namespaces.



  • Das Projekt hat jetzt 380kB Source und ist bei keine Ahnung 1%. Deshalb die Bemerkung "Overhead". Wenn ich mir überlege, wie ich Java oder PHP programmiere, ist die Entwicklungskurve zu flach. Und wenn ich jetzt noch sage, dass es ein Game wird, werden sicher wieder einige die Augen verdrehen und sagen, "dann soll ich doch Java coden". Will ich aber nicht 😉

    In dem Game gibt es z.B. Kontexte (class Context), die in unterschiedlichen Namespaces liegen momentan, weil die Klasse den identischen Namen hat. Wenn ich jetzt die Namespace Hierarchie aufbreche, muss ich sie App_Context und Game_Context nennen. Das ist vom Schreiben kürzer und alles, nur hab ich generell das Problem, dass es viele Klassen mit identischem Name gibt, deshalb wäre mit einem einfachen entfernen der Namespaces eine Kollision vorprogrammiert :D. Ist alles sehr EventDriven, also kann ich die Module alle austauschen und "binden". Das hat leider zur Folge, dass einige Namen gleichen sind.

    Ich verwalte deswegen die ganzen Files auch in vielen Ordnern, nicht alles in einem Ordner und unterteile optisch mit der logischen Struktur in der IDE.
    Meine includes sind somit auch länger.

    Deswegen habe ich auch alle möglichen IDEs durchprobiert und ein Durchfallkriterium war, wenn keine physikalischen Ordner unterstützt wurden. Somit bin ich dann von Eclipse zu codelite über code-blocks oder so zu QtDevelop zu NetBeans. NetBeans macht seinen Job am besten finde ich. Codecompletion Spitzenreiter ist leider MSVS, jedoch arbeite ich auf Ubuntu.



  • PhilippHToner schrieb:

    Codecompletion Spitzenreiter ist Eclipse

    FTFY

    Und natuerlich kann Eclipse auch Ordner im Filesystem erstellen.



  • Kellerautomat schrieb:

    PhilippHToner schrieb:

    Codecompletion Spitzenreiter ist Eclipse

    FTFY

    Eclipse ist eher Refactoring-Spitzenreiter, zumindest für Java gibts echt nette Features. Aber Codecompletion ist sogar Visual Assist X für C++ besser als Eclipse für Java. Nicht nur, weil standardmässig auch andere Zeichen als der Punkt die Vervollständigung auslösen, sondern auch wegen der ziemlich intelligenten Heuristiken für Vorschläge. Bei Eclipse kämpfe ich z.B. ständig gegen den Versuch, mir nach der Klasse benannte Variablen aufzudrängen (ArrayList objects -> Vorschlag "objectsArrayList").



  • Ich meine hier die Eclipse CDT, also die Version fuer C++. Visual Assist X habe ich nie probiert (Warum sollte ich auch mein Geld zum Fenster herausschmeissen, wenn ich mit Eclipse gluecklicher bin, als ich es je mit VS sein koennte), aber ordentliche C++11/14 Unterstuetzung kann das wohl kaum zu VS hinzufuegen.

    Was du mit den Vorschlaegen meinst, weiss ich nicht. Die IDE kann nicht erraten, wie du deine Variablen nennen willst.



  • Viele Namespaceses sind ein Zeichen von Sauberkeit.
    Namespaceses existieren nur für den Compiler, die Klassen in deinen Namespaces werden eh ohne Berücksichtigung der Namespaceses mit Adressen ausgetauscht. So bald du die Compilzeit ohne Fehler überstanden hast, sind jegliche Art von Namespaceses nichtig. In Java z. B. wäre das mit den Packages als "Synonym" etwas anders.

    Und wenn ich jetzt noch sage, dass es ein Game wird, werden sicher wieder einige die Augen verdrehen und sagen, "dann soll ich doch Java coden".

    Würde ich niemals.

    In dem Game gibt es z.B. Kontexte (class Context), die in unterschiedlichen Namespaces liegen momentan, weil die Klasse den identischen Namen hat. Wenn ich jetzt die Namespace Hierarchie aufbreche, muss ich sie App_Context und Game_Context nennen. Das ist vom Schreiben kürzer und alles, nur hab ich generell das Problem, dass es viele Klassen mit identischem Name gibt, deshalb wäre mit einem einfachen entfernen der Namespaces eine Kollision vorprogrammiert :D. Ist alles sehr EventDriven, also kann ich die Module alle austauschen und "binden". Das hat leider zur Folge, dass einige Namen gleichen sind.

    Du kannst dir auch einzelne Module programmieren und die dann Linken und dafür würde ich persönliche wenn du kein VS nutzen kannst, CodeBlocks benutzen (MinGW ist ein beliebter Compiler). Erstelle für jedes Modul dein eigenes Projekt und linke die Projekte dann untereinander (in VS muss man nur Verweise setzen und die Buildreihenfolge festlegen).



  • Kellerautomat schrieb:

    Die IDE kann nicht erraten, wie du deine Variablen nennen willst.

    Genau darum soll sie es auch nicht versuchen, geschweige denn explizite Interaktion erfordern, um diesen Versuch zu verhindern.



  • Nexus schrieb:

    Genau darum soll sie es auch nicht versuchen, geschweige denn explizite Interaktion erfordern, um diesen Versuch zu verhindern.

    Tut sie bei mir auch nicht. Evtl mal updaten?



  • Nexus schrieb:

    Kellerautomat schrieb:

    PhilippHToner schrieb:

    Codecompletion Spitzenreiter ist Eclipse

    FTFY

    Eclipse ist eher Refactoring-Spitzenreiter, zumindest für Java gibts echt nette Features. Aber Codecompletion ist sogar Visual Assist X für C++ besser als Eclipse für Java. Nicht nur, weil standardmässig auch andere Zeichen als der Punkt die Vervollständigung auslösen, sondern auch wegen der ziemlich intelligenten Heuristiken für Vorschläge. Bei Eclipse kämpfe ich z.B. ständig gegen den Versuch, mir nach der Klasse benannte Variablen aufzudrängen (ArrayList objects -> Vorschlag "objectsArrayList").

    Ich hab Eclipse für Java vor ca. 5 Jahren das letzte mal verwendet und die Codecompletion war damals schon besser als die von Visual Assist X für C++ heute.

    Ich konnte einfach "parent.getChildren()" schreiben und mit einem Shortcut hat Eclipse "RichtigerType children = parent.getChildren()" daraus gemacht. Sowas hab ich mit VA noch nicht gefunden.

    Außerdem schlägt mir VA bei Methodenaufrufen auch immer Sachen für Parameter vor die keinen Sinn machen, z.b. Variablen die vom Typ nicht passen oder manchmal sogar "return". Eclipse hat da immer korrekte Vorschläge gemacht.



  • Eclipse kann z.B. immer noch nur die Basis-Vervollständigung automatisch, und selbst die muss man explizit aktivieren, sonst geht nur der Punkt (ich will doch nicht jedes Mal eine zusätzliche Tastenkombination drücken, um die Autovervollständigung zu aktivieren 🙄). Wenn ich "ThreadPoolExecutor" schreiben will, muss ich tatsächlich die Buchstaben der Reihe nach eintippen, also "ThreadP...", was unter Umständen relativ lange geht, bis das gewünschte eindeutig ist. VAX kann hingegen auch mit Teilen von Wörtern umgehen, also würde hier "tpe" schon reichen.

    Bei Java ist man aber auch zwingend auf solche IDE-Unterstützung angewiesen, weil man für die kleinste Funktionalität immer gleich wahnsinnig viel Code benötigt, auch wenn es in neueren Java-Versionen etwas besser aussieht (Variablendefinitionen mit doppelter Typnennung, Boilerplate innerer Klassen, equals() und hashCode() *). Gleiches gilt für Refactoring mit den vergleichsweise tiefen Klassen- und Interfacehierarchien. VAX ist nicht perfekt, aber dass es mittlerweile mit recht komplexem C++-Code ziemlich effizient umgehen kann, weiss ich durchaus zu schätzen.

    _____
    * Das z.B. ist eine einzige Katastrophe. Der Code, den mir Eclipse generiert, um zwei Klassen mit einem einzelnen float (!) zu vergleichen und zu hashen, sieht so aus:

    class MyClass1 {
    	private float m;
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + Float.floatToIntBits(m);
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		MyClass1 other = (MyClass1) obj;
    		if (Float.floatToIntBits(m) != Float.floatToIntBits(other.m))
    			return false;
    		return true;
    	}
    }
    

    Nicht nur unnötig viel Code und äusserst ineffizient, sondern auch voll mit Implementierungsdetails. Zum Glück bin ich kürzlich auf die Objects -Klasse gestossen. Dass ich für diese Abstraktion aber auch wieder zahle, ist schon etwas schade...



  • Nexus schrieb:

    Eclipse kann z.B. immer noch nur die Basis-Vervollständigung automatisch, und selbst die muss man explizit aktivieren, sonst geht nur der Punkt (ich will doch nicht jedes Mal eine zusätzliche Tastenkombination drücken, um die Autovervollständigung zu aktivieren 🙄).

    Eigentlich finde ich das ganz gut, weil VAX viel zu oft was falsches macht, wenn es plötzlich autovervollständigt. Ich bin jetzt schon fast immer automatisch am ESC drücken, weil VAX beim Punkt sonst irgendwas dummes macht.

    Wenn ich "ThreadPoolExecutor" schreiben will, muss ich tatsächlich die Buchstaben der Reihe nach eintippen, also "ThreadP...", was unter Umständen relativ lange geht, bis das gewünschte eindeutig ist. VAX kann hingegen auch mit Teilen von Wörtern umgehen, also würde hier "tpe" schon reichen.

    Das stimmt.

    Nexus schrieb:

    _____
    * Das z.B. ist eine einzige Katastrophe. Der Code, den mir Eclipse generiert, um zwei Klassen mit einem einzelnen float (!) zu vergleichen und zu hashen, sieht so aus:

    class MyClass1 {
    	private float m;
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + Float.floatToIntBits(m);
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		MyClass1 other = (MyClass1) obj;
    		if (Float.floatToIntBits(m) != Float.floatToIntBits(other.m))
    			return false;
    		return true;
    	}
    }
    

    Nicht nur unnötig viel Code und äusserst ineffizient, sondern auch voll mit Implementierungsdetails. Zum Glück bin ich kürzlich auf die Objects -Klasse gestossen. Dass ich für diese Abstraktion aber auch wieder zahle, ist schon etwas schade...

    Wenn ich try schreibe, generiert VAX auch irgendwelchen Müll.

    Eclipse hatte mir nie Code generiert, der nicht kompiliert, VAX schon oft.


Anmelden zum Antworten