Comment nommer quelque chose lorsque l'option logique est un mot clé réservé? [fermé]

64

Parfois, le nom le plus logique pour quelque chose (par exemple une variable) est un mot clé réservé dans la langue ou l'environnement de votre choix. Quand il n'y a pas de synonyme tout aussi approprié, comment peut-on l'appeler?

J'imagine qu'il existe des heuristiques de meilleures pratiques pour résoudre ce problème. Ceux-ci pourraient être fournis par les créateurs ou les gouverneurs des langages de programmation et des environnements. Par exemple, si python.org (ou Guido van Rossum) explique comment le gérer en Python, ce serait une bonne directive dans mon livre. Un lien MSDN sur la façon de gérer cela en C # serait également utile.
Alternativement, les directives fournies par les principaux influenceurs en génie logiciel devraient également être utiles. Peut-être que Google / Alphabet a un bon guide de style qui nous apprend comment le gérer?

Voici un exemple: dans le langage C #, "default" est un mot clé réservé. Lorsque j’utilise une énumération, j’aimerais peut-être nommer la valeur par défaut "default" (analogue aux instructions "switch"), mais ne le peut pas.
(C # est sensible à la casse et les constantes enum devraient être en majuscules. Le choix par défaut est donc évident, mais supposons que notre guide de style actuel dicte que toutes les constantes enum doivent être en minuscules.)
Nous pourrions considérer le mot "defaultus". ", mais cela n’adhère pas au principe de moindre surprise . Nous devrions également considérer «standard» et «initial», mais malheureusement, «défaut» est le mot qui traduit exactement son objectif dans cette situation.

Un protecteur
la source
15
J'utiliserais quelque chose comme "default_value". La signification reste la même, mais vous devez taper quelques caractères supplémentaires.
Mael
26
@Darkhogg si je trouvais l'un ou l'autre de ceux-ci dans mon code, je les changerais immédiatement. Les fautes d'orthographe ou les violations des conventions de nommage ne sont pas acceptables.
MetaFight
26
@MetaFight - sauf qu'en Java, appeler une variable qui contient une classe clazzest pratiquement une norme de facto. En substance , elle est partie de la convention de nommage de la plate - forme. Faire autre chose enfreindrait les attentes que d'autres pourraient avoir lues dans votre code. Ne le faites donc que si cela est absolument nécessaire.
Periata Breatta
6
défaut , la valeur enum semble contre-productive. Ce doit être un nom spécifique au domaine qui décrit le nom par défaut. Il devrait y avoir une méthode pour retourner la valeur par défaut, cependant.
Qwerty_so
18
@AndresF. Je ne suis pas d'accord. Je trouve souvent très facile d'argumenter contre les concepteurs de Java. Je ne leur en veux pas, cependant. Ils travaillaient dans l'ouest sauvage.
MetaFight

Réponses:

63

Pour une option enum, vous devriez utiliser un cas de titre comme Default. C # étant sensible à la casse, il n'entrera pas en conflit avec le mot clé réservé. Voir les directives de nommage .net .

Étant donné que tous les membres publics doivent avoir la casse du titre dans .net et que tous les noms réservés sont en minuscule, vous ne devriez pas le rencontrer, sauf avec des variables locales (y compris des paramètres). Et les habitants ont généralement des noms ou des phrases comme noms, il est donc assez rare que le nom le plus naturel entre en collision avec un mot-clé. Par exemple. defaultValueserait généralement un nom plus naturel que default. Donc, dans la pratique, ce n’est pas un gros problème.

En C #, vous pouvez utiliser le @préfixe " " pour échapper aux mots clés réservés afin qu'ils puissent être utilisés comme identifiants (du type @default). Mais cela ne devrait être utilisé que si vous n'avez vraiment aucune autre option, c'est-à-dire si vous vous connectez à une bibliothèque tierce qui utilise un mot clé réservé comme identifiant.


Bien sûr, d'autres langues ont une syntaxe et des mots-clés différents et, par conséquent, différentes solutions à ce problème.

SQL a beaucoup de mots-clés, mais il est très courant d'échapper simplement aux identifiants, comme [Table]. Certains le font même pour tous les identifiants, qu'ils entrent en conflit avec un mot clé ou non. (Après tout, un mot clé conflictuel pourrait être introduit à l'avenir!)

Powershell (et de nombreux autres langages de script) préfixe toutes les variables avec un sigil comme $, ce qui signifie qu'elles n'entreront jamais en conflit avec des mots-clés.

Lisp n'a pas du tout de mots clés, du moins pas au sens conventionnel du terme.

Python a une convention officiellement reconnue dans PEP-8 :

Toujours utiliser cls pour le premier argument des méthodes de classe.

Si le nom d'un argument de fonction entre en conflit avec un mot clé réservé, il est généralement préférable d'ajouter un seul soulignement de fin de phrase plutôt que d'utiliser une abréviation ou une corruption de l'orthographe. Ainsi, class_ est meilleur que clss. (Mieux vaut peut-être éviter de tels affrontements en utilisant un synonyme.)

Certaines langues telles que Brainfuck ou Whitespace évitent de définir des mots, évitant élégamment le problème.

En bref, il n’ya pas de réponse indépendante de la langue à votre question, car elle dépend fortement de la syntaxe et des conventions de la langue spécifique.

JacquesB
la source
2
Vous ne devriez cependant pas compter uniquement sur la sensibilité à la casse. Bien que ce ne soit probablement pas un problème dans la pratique, tous les langages .NET ne sont pas sensibles à la casse. Vous pouvez donc rencontrer des problèmes inattendus à un moment donné.
Vivelin
6
@Vivelin: Vous ne devriez pas avoir de membres publics ou de noms de types ne différant que par les cas, cela risquerait de poser des problèmes pour d'autres langues. Mais cela n'a rien à voir avec ce que je suggère, car les mots-clés ne sont pas des identificateurs (et les autres langues en auront d'autres).
JacquesB
Même si la syntaxe @ est disponible, elle est mieux réservée, à mon humble avis, aux scénarios dans lesquels il est nécessaire d’interagir avec les langages écrits des bibliothèques avec des mots-clés différents. Même là, je pense qu'il aurait peut-être été préférable d'avoir une fonctionnalité de langage un peu comme #define, mais l'opérande de droite serait toujours interprété comme un identifiant sensible à la casse. Cela permettrait de résoudre de nombreux types de conflits de noms (y compris, pour les langages ne respectant pas la casse, l'importation de symboles identiques, sauf pour les cas).
Supercat
@Vivelin tous les langages .NET ne sont pas sensibles à la casse - je connais VB.NET et Powershell; y en a-t-il d'autres?
Zev Spitz
@ZevSpitz l'OP a spécifiquement appelé C #, c'est pourquoi je pense que Vivelin l'a utilisé comme exemple. Cependant, comme vous le dites, VB.NET n'est pas sensible à la casse. . Toutes les langues n'ont pas les mêmes mots réservés
Shaggy13spe le
22

Je voudrais ajouter un trait de soulignement (default_)

Avantages:

  • Facile
  • évident (sinon pourquoi ajouteriez-vous un trait de soulignement?)
  • cohérent
  • facile à utiliser
  • fonctionne dans toutes les langues modernes que je connais
  • plus proche de l'option logique

Pourquoi je n'aime pas les autres solutions:

Synonyme:

  • difficile à trouver
  • souvent pas exactement la même signification (nuances)

Ajouter / Préposer un mot:

  • incohérent (defaultValue, defaultItem)
  • verbosité accrue sans lisibilité accrue

Changer les lettres (clazz au lieu de la classe):

  • incohérent (clazz, klass, klazz)

Ajouter un numéro (par défaut1):

  • soulève la question de default2

Ajouter / ajouter une lettre au préalable:

  • non évident (le programmeur doit deviner qu'il a été utilisé pour namecollision et non comme raccourci pour autre chose)

Échapper à un mot-clé (@default (c #), `default` (scala))

  • seulement possible dans certaines langues
  • fonctionnalité rarement utilisée, principalement pour la compatibilité avec d'autres langues
  • rend plus difficile l'utilisation pour les utilisateurs de votre API (ils doivent savoir comment le faire et se rappeler comment le faire)

Quand ne l'utiliserais-je pas:

  • convention existante, largement utilisée
  • Je connais déjà un synonyme approprié
  • dans votre cas spécifique, je suivrais la réponse de @JacquesB
Siphor
la source
7
C'est une solution souvent utilisée en Python. Je ne le préconise pas comme étant le plus élégant, mais ça marche.
fralau
1
@fralau Python est particulièrement mauvais - je déteste les identifiants comme "input"
Christian Sauer le
Dans beaucoup de langues, on voit klasspour une variable où classest un mot réservé. Je n'ai jamais vu defawltmais c'est la même idée. Je préférerais default_(et probablement class_si ce n’est pas au détriment des conventions établies).
nigel222
Vous n'avez pas inclus l'option d'échapper au mot clé.
CodesInChaos
1
Vous faites des arguments valables et raisonnables, même si je ne suis pas sûr que ce soit "pourquoi le trait de soulignement a été utilisé". J'ai rarement travaillé avec des sources qui connaissent tous les mots-clés des langues dans lesquelles ils travaillent!
Protector un
18

"Default" n'est probablement pas une valeur utile enum. Cela représente un comportement qui peut changer en fonction du contexte dans lequel il est utilisé.

Cela étant dit, si votre langue est sensible à la casse, utilisez une casse différente pour le mot. (Valeur par défaut vs valeur par défaut)

Ou mieux encore, faites l'effort supplémentaire de taper quelques lettres de plus et appelez-le DefaultValue.

Kent A.
la source
3
Je suis d'accord. "Default" n'indique pas quelle est la valeur. Considérez enum ErrorHandlingLevel { Default = 0, ... }vs enum ErrorHandlingLevel { None = 0, ... }. Dans le deuxième exemple, le fait qu'il Nones'agisse de la valeur par défaut peut être connu en définissant la valeur enum sur 0, en utilisant xmldoc ou explicitement dans le code. Vous avez l’avantage supplémentaire de savoir ce que cela signifie quand un objet est ErrorHandlingLevelréglé sur None. Comparez cela à l'inspection d'un objet avec ErrorHandlingLevella valeur par défaut.
Harrison Paine
9

Je recommanderais vivement de NE PAS modifier localement la convention de dénomination (ni ajouter des caractères dénués de sens) aux fins de la désambiguïsation (comme cela a été suggéré dans d'autres messages). Cela crée de la confusion si l'intention n'est pas évidente et peut amener à se demander pourquoi il a été nommé ainsi. Il peut être résolu sans cela.

Dans tous les cas, il devrait être possible d'utiliser un mot ayant une signification synonyme ou de préciser le nom (ou même de le commenter). Même si cela introduit une répétition du contexte, cela peut être une meilleure solution.

Par exemple, disons que vous avez une énumération Modequi devrait exposer une valeur par défaut, comme dans votre cas. Nommer cela default_modepeut ne pas sembler le meilleur en raison de la répétition, mais cela évite les ambiguïtés tout en transmettant le sens souhaité.

Sopel
la source
Vous faites valoir un argument valable, mais je ne sais toujours pas ce qui crée davantage de confusion: avoir un fragment constamment ajouté ou utiliser des mots différents pour chaque situation. Les arguments contre la première option étant bien sûr que les situations dans lesquelles elle serait utilisée en premier lieu sont (espérons-le) si rares que la cohérence ne peut pas être déduite du code existant.
Protector un
3

Vous devrez utiliser des mots différents ou modifiés, cela est clair.
Donc, cela signifie généralement soit

  • un mot complètement différent
  • un préfixe
  • un suffixe

Un autre facteur à déterminer est la manière de joindre les mots multiples et les options sont généralement

  • allonewordnoseparators
  • words_with_underscores-or- dash ( snake_case )
  • CapitalisationForClarityAndReadability ( CamelCase )

Ma suggestion est d’utiliser un préfixe ou un suffixe et des traits de soulignement / tirets, par exemple

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_defaultL'avantage est que toutes les sections locales sont alignées et se démarquent donc rapidement, mais l'inconvénient est que vous devez toujours lire la deuxième partie pour obtenir le nom unique. default_localL’avantage commun est que le nom unique de la variable est rapidement visible, mais les sections locales ne sont pas toujours aussi facilement regroupées visuellement.

Voici quelques exemples de l’approche domain_specific que j’ai vue: vehicle_modelau lieu de modelqui était un mot réservé; room_tablepour une table SQL comme tablec'est un mot réservé.

Les deux autres options que j'ai vu utiliser des langues ou des scripts sont:

  • guillemets ou backtips pour entourer les noms des variables et permettre ainsi l’utilisation de mots réservés. De même, je pourrais imaginer que certaines langues permettraient à un caractère spécial, tel qu'un retour arrière, d'échapper à un nom.
  • espaces dans les noms de variables.
Michael Durrant
la source
Comme petite note peut-être intéressante: j'ai vu words_with_underscores-or-dashesdeux noms se rapporter - snake_caselorsque vous utilisez le trait de soulignement et kebab-caselorsque vous utilisez le tiret. J'ai trouvé ce dernier drôle.
VLAZ
2

Évidemment, faites ce que vous pouvez pour éviter cette situation. J'écris des logiciels depuis la fin des années 1970 et le temps où j'ai vraiment dû tromper un mot réservé est bien inférieur à dix, probablement plus proche de cinq.

Vous pouvez faire beaucoup de choses, comme doubler la première ou la dernière lettre ( reservedd) ou ajouter un trait de soulignement ( reserved_). Ce qui est approprié dépendra beaucoup du langage utilisé dans les conventions, en particulier en ce qui concerne les traits de soulignement. Essayez également de ne pas faire des choses avec des cas qui pourraient être mal interprétés par les humains (par exemple, en utilisant Reservedquand il diffère de reserved).

Une fois que vous avez choisi quelque chose, mettez-le dans vos directives de codage, assurez-vous que les gens le savent et qu'il est utilisé de manière cohérente. Je vais même jusqu'à ajouter un commentaire de rappel pour que les lecteurs ne pensent pas que ce soit une faute de frappe et sachent qu'ils le verront encore:

int ccase;  // Name dodges a reserved word
Blrfl
la source
10
Ce n'est pas le vainqueur, mais la suggestion de "doubler la première ou la dernière lettre" qui m'a fait froid dans le dos ...
Willem van Rumpt Le
@WillemvanRumpt Je n'aime pas trop le faire, mais de temps en temps, il faut choisir entre faire de la gymnastique pour éviter un mot réservé qui provoque beaucoup de grattements de la tête ou un identifiant étrange qui n'en suscite que peu. .
Blrfl
6
Pas de jugement prévu, juste ... des frissons ... des froids ...;)
Willem van Rumpt le
1
Reporter un trait de soulignement est préférable à une dernière lettre doublée. (Des votes pour classs?)
nigel222
1
Directives de codage! Ce serait bien d'avoir! Bon point.
Protecteur un
2

En C #, vous pouvez ajouter le nom d'un identifiant avec @ . Cela indique au compilateur de traiter le nom comme le nom d'un identifiant et non comme un mot clé possible.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 
Robert Stiffler
la source
3
Je me demande qui voterait cette "réponse" qui ne fait que répéter le point déjà présenté (et bien mieux présenté) dans une réponse votée du haut un jour avant
gnat, le