Quel est l'intérêt de faire une distinction syntaxique entre les types standard et définis par l'utilisateur?

13

Bien que je fasse référence ici spécifiquement aux conventions de nommage de C ++ et de Bjarne Stroustrup , en principe, j'ai vu que les gens utilisent des règles quelque peu similaires pour d'autres langues ici et là.

Ainsi, l'idée de base est que l'on devrait pouvoir distinguer les types standard des types définis par l'utilisateur lors de la lecture du code. Par exemple, Bjarne Stroustrup suggère que l'on utilise

une lettre majuscule initiale pour les types (par exemple, carré et graphique)

qui, compte tenu du fait que

Le langage C ++ et la bibliothèque standard n'utilisent pas de majuscules

permet d'atteindre l'objectif mentionné ci-dessus.

Mais pourquoi devons-nous le faire? Quel peut être le but de distinguer les types standard et définis par l'utilisateur?

Je n'ai trouvé aucun raisonnement de Bjarne Stroustrup à ce sujet et, d'ailleurs, je pense moi-même d'une manière diamétralement opposée. : DI sais, je sais, "Qui suis-je pour contester Stroustrup?" Mais, écoutez, un tas de fonctionnalités du langage C ++, par exemple la surcharge des opérateurs, servent à permettre aux types définis par l'utilisateur un niveau de support syntaxique similaire aux types standard. Et puis tout cela est dérouté par une autre discipline de nommage ...

PS Sans compter que souvent un mot ne suffit pas pour nommer une classe et un mot séparé par un trait de soulignement qui commence par une majuscule a l'air si étranger.

Chat sauvage
la source
6
En fin de compte, vous pouvez également l'appeler une forme de notation hongroise (c'est-à-dire intégrer des informations sur le type / l'utilisation dans un nom), ce qui est généralement mal vu. Par conséquent: bonne question.
stijn
2
@stijn: Oui, mais savez-vous pourquoi il est mal vu? À l'époque, lorsque tout le monde utilisait un éditeur de texte pour écrire ses programmes, il était utile de connaître le type en regardant l'identifiant. Mais aujourd'hui, vous pouvez simplement survoler l'identifiant dans n'importe quel IDE moderne et il vous indiquera le type.
Robert Harvey
4
@RobertHarvey Sauf que la notation hongroise est également évitée dans les communautés qui n'ont pas d'IDE puissants, ou plutôt, utilisent principalement des éditeurs de texte brut.
1
@RobertHarvey Non, je suis au courant des deux ("applications hongroises" et "systèmes hongrois"), et d'après mon expérience, ni l'un ni l'autre n'est commun dans, par exemple, Python et Rust.
3
@RobertHarvey Êtes-vous en train de dire que la notation hongroise n'a jamais existé qu'en C, C ++ et VB? Quoi qu'il en soit, mon point de vue était de remettre en question la raison pour laquelle vous donnez raison pour qu'il soit désapprouvé (que c'est redondant uniquement car nous avons des IDE qui vous indiquent le type) car cette raison ne s'applique pas aux langues qui n'ont pas de tels ID et, par votre raisonnement, devrait bénéficier du hongrois. Le fait que Python soit typé dynamiquement ne fait aucune différence, en fait, il devrait améliorer le raisonnement car généralement le programmeur connaît les types lors de l'écriture du code, mais ils ne peuvent pas être déduits automatiquement.

Réponses:

5

Il n'y a absolument aucun but ou avantage à cela. L'un des objectifs du C ++ était de traiter les UDT et les primitives de manière interchangeable, et bien qu'ils n'aient pas entièrement réussi, c'est un domaine où vous n'avez pas à vous différencier.

Quand il s'agit de nommer, Stroustrup est fou, et c'est un fait scientifiquement prouvé.

DeadMG
la source
2
Je vais voir votre RAII et vous élever un SFINAE.
Robert Harvey
5
Je pouvais voir comment il pourrait être utile de distinguer les types standard des UDT. Vous ne devriez pas changer le code dans une bibliothèque standard sauf si vous avez une très bonne raison, donc voir les minuscules indique que vous n'avez pas à aller regarder le code parce que, bien, il est dans la bibliothèque standard.
Robert Harvey
4
@delnan: Oui. Ce n'est rien de plus qu'un appel à l'autorité de la part de "Beaucoup de gens". Si "Beaucoup de gens" veulent venir ici et discuter de leur raisonnement, ils sont libres de le faire, et jusque-là, ils n'ont rien à ajouter. FTR, j'utilise aussi les majuscules pour les UDT ... mais aussi pour les primitives chaque fois que j'ai besoin de les alias.
DeadMG
2
@RobertHarvey: Cela suppose que vous ne pouvez pas reconnaître les types standard à vue. Ou en les survolant dans votre environnement et en voyant le "std ::". Ou en utilisant Go To Definition ou autre. Donc, fondamentalement, cela ne s'applique pas.
DeadMG
1
J'ai toujours pensé que le but était de distinguer les types standard, avant l'avènement des espaces de noms. De nos jours, c'est juste une relique de la pensée ancienne (une "meilleure pratique" qui a cessé d'être meilleure il y a quelque temps). FWIW, dans mes projets personnels, j'utilise des petites lettres snake_casepour mes classes et espaces de noms et je n'ai eu aucun problème - ou confusion - causé par cela.
utnapistim
3

Les conventions de dénomination concernent la prise en charge de la compréhension humaine (c'est-à-dire programmeur et mainteneur) du code.

Les UDT peuvent être spécifiés de sorte que la déclaration des variables, l'initialisation, les expressions et les instructions fonctionnent différemment de ceux-ci comme c'est le cas pour les types standard. Pour trouver un problème, il est utile que le responsable ait une certaine indication qu'une certaine section de code peut faire des choses amusantes (par exemple, la mise en œuvre d'un type intégral défini par l'utilisateur utilisé dans une fonction peut avoir un défaut dans la façon dont il ajoute).

Il existe de nombreuses façons de fournir de tels indices (commentaires, spécifications de conception, etc.). L'avantage des conventions de dénomination est qu'elles sont présentes dans le code, alors que les commentaires peuvent être omis, obsolètes, etc.

Rob
la source
2

L'une des raisons pour lesquelles j'utilise des mots en majuscules pour les types est de distinguer les variables des types. Cela permet de déclarer une variable avec, à part la capitalisation, le même nom:

Foo foo;
Graph graph;

Cela peut être utile pour les classes dont une seule instance est utilisée dans chaque contexte, par exemple les paramètres de configuration.

Sjoerd
la source
À mon humble avis, cela ne répond pas à la question dans l'en-tête. Peut-être ajouter "à cet égard, nommer les types standard avec des lettres minuscules était uniquement pour une compatibilité descendante avec cstdlib".
Vorac