Konventionen



  • operator void schrieb:

    Und ich finde es eklig, mir Synonyme und Abkürzungen für triviale Namen auszudenken.

    Da gebe ich Dir Recht. Es spricht in solch einem Fall auch nichts gegen den folgenden Pseudocode:

    class Tilt;
    
    int main(void)
    {
         auto Tilt Tilt;
         return 0;
    }
    

    Hier ist sowohl der Typenname als auch der Variablenname groß geschrieben. Der Code kompiliert einwandfrei und /IMO/ ist zwischen Klasse und Instanz keine Verwechslung möglich. In C++ ist natürlich die Syntax der Deklaration dann ein wenig irritierend aber das ist ein Fehler der Sprache an sich.



  • das hier funktioniert schon ganz gut:

    int main()
    {
        foo foo;
    }
    

    Leider aber nicht mehr, innerhalb von Klassendefinitionen 😞



  • int main(void)
    {
         auto Tilt Tilt;
         return 0;
    }
    

    Sorry, das ist doch für den allerwertesten. Mit sowas kannst du bei einem obfuscation contest mitmachen, aber das wars dann auch schon.



  • Optimizer schrieb:

    int main(void)
    {
         auto Tilt Tilt;
         return 0;
    }
    

    Sorry, das ist doch für den allerwertesten. Mit sowas kannst du bei einem obfuscation contest mitmachen, aber das wars dann auch schon.

    Bitte begründe. Wie ich sagte: die /Deklaration/ ist (aufgrund der bescheuerten Syntax für Deklarationen) ein wenig komisch.
    Die /Benutzung/ hingegen macht sofort klar, ob ich auf die Instanz oder den Typ zugreife. Das ist genauso viel oder wenig für den Allerwertesten wie eine Deklaration à la 'auto Tilt tilt;'. Das ist dann Eingeweihten-Chinesisch und beim flüchtigen Drüberlesen ebenfalls alles andere als deutlich.



  • DrGreenthumb schrieb:

    Darum wünsche ich mir ein C++, dass sich nicht über "klasse klasse;" beschwert, damit ich *alles* klein schreiben kann. Bisher funktioniert das ja leider nicht, grundsätzlich überall.

    Ist die Grammatik von C++ nicht schon mehrdeutig genug? klasse<klasse> klasse(klasse<klasse>* klasse) ... warum eigentlich nicht, *ich* muss den Compiler ja nicht implementieren, der das alles auseinanderfummelt.



  • Optimizer schrieb:

    Sorry, das ist doch für den allerwertesten. Mit sowas kannst du bei einem obfuscation contest mitmachen, aber das wars dann auch schon.

    finde das überhaupt nicht unverständlich. Erkennt man doch auf Anhieb.
    Nur das 'auto' davor, käme blöd.



  • Bashar schrieb:

    Ist die Grammatik von C++ nicht schon mehrdeutig genug? klasse<klasse> klasse(klasse<klasse>* klasse) ... warum eigentlich nicht, *ich* muss den Compiler ja nicht implementieren, der das alles auseinanderfummelt.

    Sollte eigentlich recht unproblematisch sein. Die beiden Verwendungszwecke können ja nicht verwechselt werden. Wenn der Compiler z.B. eine Produktion 'Typ:KlasseX' erwartet und in der Symboltabelle zwei 'KlasseX' findet, gibt es keine Entscheidungsschwierigkeiten, welches gebraucht wird. Selbes gilt für 'RValue:KlasseX'.

    @DrGreenthumb: Tja, da fehlt C++ eben ein Schlüsselwort. 'auto' etc. schafft Ersatz, um zu verdeutlichen, dass es sich um eine Deklaration handelt.



  • Bashar schrieb:

    Ist die Grammatik von C++ nicht schon mehrdeutig genug?

    ja, deshalb finde ich, kommts darauf auch nicht an. Solange man als Mensch noch mitkommt. Wobei ich nicht weiß, inwiefern es in den Tiefen der Sprache noch eventuelle KO-Kriterien gibt.

    warum eigentlich nicht, *ich* muss den Compiler ja nicht implementieren, der das alles auseinanderfummelt.

    genau 🕶



  • Genau, und das hat auch sicher keinen Grund, dass bei Visual Studio das IntelliSense für C++ mit Abstand das schlechteste ist.

    Und selbstverständlich ist Tilt Tilt; ein Kas.
    Wenn man nicht für einen Typ und einer Instanz auf zwei verschiedene Namen kommt, zeigt mir das, dass derjenige diese beiden Begriffe offenbar nicht so gut auseinander halten kann.
    Was hat denn der Typ mit einer speziellen Instanz (die für einen speziellen Zweck geschaffen wurde) zu tun, von der Programmlogik her? Gar nichts.



  • jeder soll es so machen wie er am besten damit zu recht kommt. Viel wichtiger ist eine antwort auf diese frage:
    http://www.c-plusplus.net/forum/viewtopic.php?t=82992



  • Optimizer schrieb:

    Genau, und das hat auch sicher keinen Grund, dass bei Visual Studio das IntelliSense für C++ mit Abstand das schlechteste ist.

    Ist er das? Hmm. Der ISense in Dev-C++ stürzt mir immer ab. Und Borland ... ist halt Borland. Wo ist der ISense denn besser?

    Optimizer schrieb:

    Was hat denn der Typ mit einer speziellen Instanz (die für einen speziellen Zweck geschaffen wurde) zu tun, von der Programmlogik her? Gar nichts.

    Hmpf. Wir beziehen uns doch auch auf Beispiele, wo das allgemeine Variablen sind, also z.B. in Konversionen:

    string ToString(Foo Foo); // doofe Beispiele, die Methode sollte in der 
    string ToString(Bar Bar); // Klasse implementiert sein aber was soll's
    // etc.
    

    /Ich/ persönlich würde da als Parametername "Value" oder "RHS" oder sowas verwenden -- aber in der irgendwo hier geposteten Sammlung an Empfehlungen stand, man solle den Typennamen verwenden.



  • Optimizer schrieb:

    Wenn man nicht für einen Typ und einer Instanz auf zwei verschiedene Namen kommt, zeigt mir das, dass derjenige diese beiden Begriffe offenbar nicht so gut auseinander halten kann.

    so ein Blödsinn.

    void insert(car car);
    

    Wieso sollte die Klasse anders heißen, als die Instanz?

    void insert(car herbie);
    

    ??

    Das macht keinen Sinn.

    Ich finde es nach wie vor einfacher, wenn ich im Code einfach alles klein schreiben kann.



  • manche schreiben theCar oder aCar, bei Membern itsCar etc. Gar nicht so schlecht, auch wenn ich das nicht machen würde.



  • @DrGreenthumb: Tja, da fehlt C++ eben ein Schlüsselwort. 'auto' etc. schafft Ersatz, um zu verdeutlichen, dass es sich um eine Deklaration handelt.

    Das ist doch wohl nicht dein Ernst? Das blöde völlig überflüssige typename in:

    for(typename vector<vector<T> >::iterator i=nums.begin();i!=nums.end();++i)
    

    ,das ausser mir mehr Tipparbeit, weniger Lesbarkeit und von keinem Compiler gebraucht wird, willst du also überall einführen?

    Und nur mal so ne Frage was zum Geier noch mal ist denn an:

    Foo foo;
    

    schlecht? oder an:

    BigCar big_car;
    

    100% lesbar und Verwechlungen, für Programmierer und Compiler, komplete ausgeschlossen.

    int main(void)
    {
         auto Tilt Tilt;
         return 0;
    }
    

    Wenn wir nun:

    Foo Foo;
    

    schreiben dann überlass ich dir den N00bs zu erklären, dass:

    Foo++::value_type value_type;
    

    genauso falsch ist wie:

    Foo::value_type Foo::value_type;
    

    Und jetzt mal ganz davon abgesehen, dass ein einfaches edit > find jetzt nicht mehr ausreicht um nach Instancen oder Typen zu suchen.

    Wenn man nicht für einen Typ und einer Instanz auf zwei verschiedene Namen kommt, zeigt mir das, dass derjenige diese beiden Begriffe offenbar nicht so gut auseinander halten kann.

    so ein Blödsinn.

    Da sieht man es ja, ein Auto ist eben nicht mein Auto. Also heist das:

    void insert(car my_car);
    


  • DrGreenthumb schrieb:

    Optimizer schrieb:

    Wenn man nicht für einen Typ und einer Instanz auf zwei verschiedene Namen kommt, zeigt mir das, dass derjenige diese beiden Begriffe offenbar nicht so gut auseinander halten kann.

    so ein Blödsinn.

    void insert(car car);
    

    Wieso sollte die Klasse anders heißen, als die Instanz?

    void insert(car herbie);
    

    ??

    Das macht keinen Sinn.

    Ich finde es nach wie vor einfacher, wenn ich im Code einfach alles klein schreiben kann.

    Klassenname == Typbezeichnung. WAS ist es?
    Instanzname == Aufgabenerklärung. WOFÜR ist es da?

    Das sind für mich zwei verschiedene Dinge. Kannst du ja anders sehen.



  • Optimizer schrieb:

    Klassenname == Typbezeichnung. WAS ist es?
    Instanzname == Aufgabenerklärung. WOFÜR ist es da?

    Du meinst vielleicht Rollenbezeichnung? Wenn es passt, warum nicht ... string name, double amount ... aber manchmal hat man eben nur generische Rollen. Entweder weil der Kontext sehr allgemein ist, oder weil die Klasse auf eine bis sehr wenige Rollen eingeschränkt ist.



  • hast sich eigentlich der unterstrich am ende vom member variablen durchgesetz oder ist er schon in vergessenheit geraten?

    bin nicht mehr so uptodate



  • Gerard schrieb:

    hast sich eigentlich der unterstrich am ende vom member variablen durchgesetz oder ist er schon in vergessenheit geraten?

    Unterschiedlich. Ich lese ihn regelmäßig, genauso oft aber den Unterstrich am Anfang und das Präfix 'm_' (das ich selbst inzwischen ebenfalls verwende).



  • Gerard schrieb:

    hast sich eigentlich der unterstrich am ende vom member variablen durchgesetz oder ist er schon in vergessenheit geraten?

    bin nicht mehr so uptodate

    Sollte der sich durchsetzen? 😕 Da hab ich wohl was verschlaffen, oder war das dieser mit dem IDE Namensvervollständigung begründete Still, der anderseits aber nur schlecht aussieht?



  • ahja was ich noch beitragen wollte,
    @volkard ich glaube die kleinschreibung in c++ kommt aus unix/linux, aber ob sie in c++ so viel sinn hat?

    und sonst habe ich schon mit result_set und resultSet gerarbeitet, meine schlussfolgerung ist: variablen namen sind etwas redseliger wenn ich unterstriche benutze, wo durch der code einiges an qualität gewinnt.
    mit resultSet könnte ich noch gut leben, aber damit der still duchgehen gleich ist wird da raus ein result_set


Anmelden zum Antworten