Konventionen



  • Nein



  • Nette Diskussion, gefällt mir eigentlich ... und jetzt erkläre mir bitte noch jemand den ach so großen Vorteil der camelCase vor PascalCase. "Machen alle so" ist natürlich keine gültige Begründung. 🤡



  • Wenn man PascalCase für alles verwendet, hat man keine Unterscheidung zwischen Typen und Rest. Das gilt natürlich für jede Konvention, aber camelCase kenne ich eigentlich nur in 'gemischten' Konventionen. PascalCase wird in .NET z.B. für fast alles verwendet.



  • operator void schrieb:

    Wenn man PascalCase für alles verwendet, hat man keine Unterscheidung zwischen Typen und Rest.

    Nun ja ... der Unterschied sollte eigentlich aus dem Kontext erschließbar sein, nicht aus der Groß-/Kleinschreibung des Namens, die nicht gerade einen sehr lesbaren Unterschied darstellt.

    just my € 0,02



  • Und ich finde es eklig, mir Synonyme und Abkürzungen für triviale Namen auszudenken. Ich will "stringToInt(String string)" schreiben können. Und "Map map". Wenn es nur ein Objekt gibt, dessen größtes Merkmal sein Typ ist, kann er auch so heißen.



  • Ich will "stringToInt(String string)"

    und genau dafür kann man Funktionen überladen:

    to_string(int);
    to_string(double);
    to_string(MeinType);

    Das ist nicht nur ein Still Tipp! Man merke:

    template<class T>
    class MyTemplate{
      T t;
    public:
      void foo(){
        to_string(t);
      }
    };
    

    Mit deinen stringToInt, stringToDouble etc geht sowas nicht.

    So kommen wir nun zum eigentlichen Thema zurück damit wir auch ja nicht auf einen grünen Zweig kommen 😃

    Bei Variablen und Funktionen schreib ich alles klein und trenne die Wörter mit einem Unterstrich.

    Bei Typen kommt es darauf an wofür sie gebraucht werden.

    Ist es ein Type der sich ähnlich wie buildin Typen verhält, das heist ein Type der ==, =, CopyCtor, und kein virtual Dtor hat (das heist nicht zur public Vererbung taugt), also sowas wie std::string oder std::vector, dann schreib ich ihn wie Variablen und Funktionen. Do as the ints do und die machen es halt so.

    Andern fals der erste Buchstabe eines jeden Wortes gross und Wörter aneinander wobei wenn man aufpasst selten viele Wörter aneinander reihen muss. Also:

    Window win;
    

    jedoch

    Window::size size;
    

    Wer seine Variablen und Typen immer schön lokal hält und seine Klassen und Funktion immer schön klein hält braucht auch fast keine Unterstriche, da sich Wörter wie size sehr sehr oft recyclen lassen, und fals einmal nicht kann man immer noch win_size draus machen.

    Ach



  • operator void schrieb:

    Und ich finde es eklig, mir Synonyme und Abkürzungen für triviale Namen auszudenken. Ich will "stringToInt(String string)" schreiben können. Und "Map map". Wenn es nur ein Objekt gibt, dessen größtes Merkmal sein Typ ist, kann er auch so heißen.

    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.



  • Irgendwer schrieb:

    und genau dafür kann man Funktionen überladen:

    Es war nur ein allgemein verständliches Beispiel. Gerade bei sehr speziellen Klassen nehme ich gerne den Klassennamen auch als Instanznamen. "Player player", "ConnMgr connMgr" und sowas. Aber davon gibt es leider nicht viele verbreitete Beispiele.



  • 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.


Anmelden zum Antworten