Was ist der Sinn einer syntaktischen Unterscheidung zwischen Standard- und benutzerdefinierten Typen?

13

Obwohl ich hier speziell auf die Namenskonventionen von C ++ und Bjarne Stroustrup eingehen werde , habe ich im Prinzip gesehen, dass die Leute hier und da etwas ähnliche Regeln für andere Sprachen verwenden.

Die Grundidee ist also, dass man in der Lage sein sollte, Standardtypen von benutzerdefinierten Typen zu unterscheiden, während man den Code liest. Bjarne Stroustrup schlägt zum Beispiel vor, dass man verwendet

ein Anfangsbuchstabe für Typen (zB Square und Graph)

welche unter Berücksichtigung der

Die C ++ - Sprache und die Standardbibliothek verwenden keine Großbuchstaben

ermöglicht das Erreichen des oben genannten Ziels.

Aber warum? müssen wir das tun? Was kann der Zweck sein, standardmäßige und benutzerdefinierte Typen zu unterscheiden?

Bjarne Stroustrups Argumentation dazu konnte ich nicht finden, und außerdem denke ich selbst diametral entgegengesetzt. : Ich weiß, ich weiß, "Wer bin ich, um Stroustrup zu bestreiten?" Hören Sie, eine Reihe von C ++ - Sprachfunktionen, z. B. das Überladen von Operatoren, dienen dem Zweck, benutzerdefinierten Typen eine ähnliche syntaktische Unterstützung wie Standardtypen zu ermöglichen. Und dann wird das alles von einer anderen Benennungsdisziplin verblüfft ...

PS Ganz zu schweigen davon, dass ein Wort oft nicht ausreicht, um eine Klasse zu benennen, und ein durch Unterstriche getrenntes Wort, das mit einem Großbuchstaben beginnt, sieht so fremd aus.

Wilde Katze
quelle
6
Am Ende könnte man es auch eine Form der ungarischen Notation nennen (dh Informationen über Typ / Verwendung in einen Namen einbetten), die normalerweise verpönt ist. Daher: gute Frage.
28.
2
@stijn: Ja, aber weißt du warum es verpönt ist? Früher, als alle ihre Programme mit einem Texteditor erstellten, war es hilfreich, den Typ anhand des Bezeichners zu kennen. Aber heute können Sie in jeder modernen IDE einfach mit der Maus über den Bezeichner fahren, um den Typ zu bestimmen.
Robert Harvey
4
@RobertHarvey Abgesehen davon, dass die ungarische Notation auch in Communities vermieden wird, die keine leistungsstarken IDEs haben, oder vielmehr meistens Nur-Text-Editoren verwenden.
1
@RobertHarvey Nein, mir sind beide bekannt ("Apps ungarisch" und "Systeme ungarisch"), und meiner Erfahrung nach ist dies beispielsweise in Python und Rust nicht üblich.
3
@RobertHarvey Sagen Sie, dass die ungarische Notation nur in C, C ++ und VB existiert hat? Ungeachtet dessen war es mein Anliegen, den von Ihnen angegebenen Grund für die Missbilligung in Frage zu stellen (dass er nur dann redundant ist, wenn wir IDEs haben, die Ihnen den Typ mitteilen), da dieser Grund nicht für Sprachen gilt, die solche IDs nicht haben, und Nach Ihrer Überlegung sollte von ungarischen profitieren. Das Python ist dynamisch macht keinen Unterschied eingegeben hat , in der Tat sollte es verbessert die Argumentation da in der Regel die Programmierer die Typen wissen , wann Sie den Code zu schreiben, aber sie können nicht automatisch geschlossen werden.

Antworten:

5

Es gibt absolut keinen Zweck oder Nutzen in solchen. Eines der Ziele von C ++ war es, UDTs und Primitive austauschbar zu behandeln. Dies ist ein Bereich, in dem Sie nicht differenzieren müssen, obwohl dies nicht ganz gelungen ist.

Wenn es um die Benennung geht, ist Stroustrup verrückt, und dies ist eine wissenschaftlich belegte Tatsache.

DeadMG
quelle
2
Ich werde deine RAII sehen und dich zu einer SFINAE erziehen.
Robert Harvey
5
Ich konnte sehen, wie nützlich es sein könnte, Standardtypen von UDTs zu unterscheiden. Sie sollten nicht den Code in einer Standard - Bibliothek ändern , wenn Sie einen haben wirklich guten Grund, so den unteren Fall sehen gibt an, dass Sie nicht Blick auf dem Code gehen müssen , weil, na ja, es in der Standardbibliothek ist.
Robert Harvey
4
@delnan: Ja. Das ist nichts weiter als ein Appell an die Autorität von "Many people". Wenn "Viele Leute" hierher kommen und über ihre Argumentation diskutieren wollen, steht es ihnen frei, und bis dahin haben sie nichts hinzuzufügen. FTR, ich benutze Großbuchstaben auch für UDTs ... aber auch für Primitive, wenn ich Grund habe, sie zu aliasen.
DeadMG
2
@RobertHarvey: Das setzt voraus, dass Sie Standardtypen nicht auf Anhieb erkennen können. Oder indem Sie mit der Maus über sie in Ihrer Umgebung fahren und das "std ::" sehen. Oder mithilfe von Gehe zu Definition oder was auch immer. Es gilt also im Grunde nicht.
DeadMG
1
Ich dachte immer, der Zweck sei es, von Standardtypen zu unterscheiden, bevor Namespaces aufkamen. Heutzutage ist es nur ein Relikt des alten Denkens (ein "Best Practice", das vor einiger Zeit aufgehört hat, das Beste zu sein). FWIW, in meinen persönlichen Projekten benutze ich Kleinbuchstaben snake_casefür meine Klassen und Namespaces und hatte noch keine Probleme - oder Verwirrung - die dadurch verursacht wurden.
utnapistim
3

Namenskonventionen sollen das menschliche (dh Programmierer und Betreuer) Verständnis des Codes unterstützen.

UDTs können angegeben werden, damit die Deklaration von Variablen, die Initialisierung, Ausdrücke und Anweisungen anders auf sie angewendet werden als dies bei Standardtypen der Fall ist. Für die Fehlersuche ist es für den Betreuer nützlich, einen Hinweis darauf zu haben, dass ein Teil des Codes unkonventionelle Funktionen ausführt (z. B. kann die Implementierung eines benutzerdefinierten Integraltyps, der in einer Funktion verwendet wird, einen Fehler in der Art und Weise der Hinzufügung aufweisen).

Es gibt viele Möglichkeiten, solche Hinweise bereitzustellen (Kommentare, Designspezifikationen usw.). Der Vorteil von Namenskonventionen besteht darin, dass sie im Code vorhanden sind, während Kommentare weggelassen werden können, veraltet sind usw.

rauben
quelle
2

Ein Grund, warum ich für Typen großgeschriebene Wörter verwende, ist die Unterscheidung von Variablen und Typen. Dies erlaubt es, eine Variable mit dem gleichen Namen zu deklarieren, abgesehen von der Großschreibung:

Foo foo;
Graph graph;

Dies kann für Klassen nützlich sein, von denen in jedem Kontext nur eine Instanz verwendet wird, z. B. Konfigurationseinstellungen.

Sjoerd
quelle
IMHO beantwortet dies nicht die Frage in der Überschrift. Vielleicht fügen Sie "in dieser Hinsicht war die Benennung der Standardtypen mit Kleinbuchstaben nur aus Gründen der Abwärtskompatibilität mit cstdlib" hinzu.
Vorac