Come nominare qualcosa quando l'opzione logica è una parola chiave riservata? [chiuso]

63

Occasionalmente, il nome più logico per qualcosa (ad esempio una variabile) è una parola chiave riservata nella lingua o nell'ambiente di scelta. Quando non c'è un sinonimo altrettanto appropriato, come si chiama?

Immagino ci siano delle euristiche di best practice per questo problema. Questi potrebbero essere forniti dai creatori o dai governatori dei linguaggi e degli ambienti di programmazione. Ad esempio, se python.org (o Guido van Rossum) dice come affrontarlo in Python, sarebbe una buona guida nel mio libro. Anche un link MSDN su come gestirlo in C # andrebbe bene.
In alternativa, anche le linee guida fornite dai principali fattori di influenza nell'ingegneria del software dovrebbero essere preziose. Forse Google / Alphabet ha una bella guida di stile che ci insegna come affrontarlo?

Ecco un esempio: nel linguaggio C #, "default" è una parola chiave riservata. Quando utilizzo un enum, mi piacerebbe denominare il valore predefinito "default" (analogo alle istruzioni "switch"), ma non è possibile.
(C # fa distinzione tra maiuscole e minuscole e le costanti enumerate devono essere in maiuscolo, quindi "Predefinito" è la scelta più ovvia qui, ma assumiamo che la nostra attuale guida di stile imponga che tutte le costanti enum siano minuscole.)
Potremmo prendere in considerazione la parola "defaultus", ma questo non aderisce al Principio di almeno stupore . Dovremmo anche considerare "standard" e "iniziale", ma sfortunatamente "default" è la parola che esprime esattamente il suo scopo in questa situazione.

    
posta Protector one 02.01.2017 - 13:58
fonte

7 risposte

64

Per un'opzione enum dovresti usare title case come Default . Poiché C # fa distinzione tra maiuscole e minuscole, non si scontrerà con la parola chiave riservata. Vedi . Linee guida per i nomi. .

Poiché tutti i membri pubblici dovrebbero essere title case in .net, e tutti i nomi riservati sono in minuscolo, non dovresti incontrarlo realmente eccetto che con variabili locali (inclusi i parametri). E i locali di solito hanno nomi o frasi come nomi, quindi è piuttosto raro che il nome più naturale vada in collisione con una parola chiave. Per esempio. defaultValue sarebbe in genere un nome più naturale di default . Quindi in pratica questo non è un grosso problema.

In C # puoi usare il prefisso " @ " per evitare parole chiave riservate in modo che possano essere utilizzate come identificatori (come @default ). Ma questo dovrebbe essere usato solo se davvero non hai altra opzione, ad esempio se stai interagendo con una libreria di terze parti che utilizza parole chiave riservate come identificatore.

Naturalmente altre lingue hanno sintassi e parole chiave diverse e quindi soluzioni diverse questo problema.

SQL hanno un sacco di parole chiave, ma è molto comune sfuggire semplicemente agli identificatori, come [Table] . Alcuni addirittura lo fanno per tutti gli identificatori, indipendentemente dal fatto che si scontrino con una parola chiave o meno. (Dopo tutto, una parola chiave di conflitto potrebbe essere introdotta in futuro!)

Powershell (e un mucchio di altri linguaggi di scripting) prefissa tutte le variabili con un sigillo come $, il che significa che non entreranno mai in collisione con le parole chiave.

Lisp non ha affatto parole chiave, almeno non nel senso convenzionale.

Python ha una convenzione ufficialmente riconosciuta in PEP-8 :

Always use cls for the first argument to class methods.

If a function argument's name clashes with a reserved keyword, it is generally better to append a single trailing underscore rather than use an abbreviation or spelling corruption. Thus class_ is better than clss. (Perhaps better is to avoid such clashes by using a synonym.)

Alcune lingue come Brainfuck o Spazio bianco evitano di definire le parole, eludendo elegantemente il problema.

In breve, non esiste una risposta indipendente dalla lingua alla tua domanda, poiché dipende in gran parte dalla sintassi e dalle convenzioni della lingua specifica.

    
risposta data 02.01.2017 - 15:18
fonte
22

Vorrei aggiungere un trattino basso (predefinito _)

Pro:

  • semplice
  • ovvio (perché altrimenti aggiungerebbe un trattino basso?)
  • coerente
  • facile da usare
  • funziona in tutte le lingue moderne che conosco
  • più vicino all'opzione logica

Perché non mi piacciono le altre soluzioni:

Sinonimo:

  • difficile da trovare
  • spesso non ha lo stesso identico significato (sfumature)

Aggiunta / Riproduzione di una parola:

  • Incoerente (defaultValue, defaultItem)
  • aumento della verbosità senza una maggiore leggibilità

Modifica delle lettere (clazz invece della classe):

  • incoerente (clazz, klass, klazz)

Aggiunta di un numero (predefinito1):

  • solleva la domanda per default2

Aggiunta / sospensione di una lettera:

  • non ovvio (il programmatore deve indovinare che è stato usato per namecollision e non una scorciatoia per qualcos'altro)

Escaping di una parola chiave (@default (c #), 'default' (scala))

  • possibile solo in alcune lingue
  • funzione usata raramente, principalmente per compatibilità con altre lingue
  • rende più difficile l'uso per gli utenti della tua API (devono sapere come farlo e ricordare come farlo)

Quando non lo uso:

  • altra convenzione ampiamente utilizzata
  • Conosco già un sinonimo appropriato
  • nel tuo specifico caso enum seguirò la risposta @JacquesB
risposta data 02.01.2017 - 19:35
fonte
18

"Default" non è probabilmente un valore enum utile. Rappresenta un comportamento che può cambiare a seconda del contesto in cui viene utilizzato.

Detto questo, se la tua lingua fa distinzione tra maiuscole e minuscole, usa un caso diverso per la parola. (Default vs default)

O meglio ancora, fai lo sforzo extra di digitare qualche altra lettera e chiamala Valore predefinito.

    
risposta data 02.01.2017 - 15:21
fonte
9

Consiglio vivamente di NON modificare la convenzione di denominazione localmente (o di aggiungere caratteri privi di significato) ai fini della disambiguazione (come è stato suggerito in altri post). Crea confusione se l'intento non è ovvio e può sollevare dubbi sul motivo per cui è stato chiamato così. Può essere risolto senza di esso.

In ogni caso dovrebbe essere possibile utilizzare una parola con un significato sinonimo o rendere il nome più specifico (o addirittura dettagliato). Anche quando può introdurre la ripetizione del contesto, potrebbe essere una soluzione migliore.

Ad esempio, supponiamo tu abbia un enum Mode che dovrebbe esporre un valore predefinito come nel tuo caso. Chiamarlo default_mode potrebbe non sembrare il migliore a causa della ripetizione, ma evita l'ambiguità mentre trasmette il significato desiderato.

    
risposta data 02.01.2017 - 17:12
fonte
3

Dovrai usare parole diverse o modificate, questo è chiaro.
Quindi questo di solito significa o

  • una parola completamente diversa
  • un prefisso
  • un suffisso

Un altro fattore da determinare è come unire le parole multiple e le opzioni sono di solito

  • allonewordnoseparators
  • words_with_underscores-or-dashes ( snake_case )
  • CapitalizationForClarityAndReadability ( CamelCase )

Il mio suggerimento è di usare un prefisso o suffisso e trattini bassi / trattini, ad es.

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

local_default ha il vantaggio che tutti i locali sono allineati e quindi si distinguono rapidamente, ma lo svantaggio è che devi sempre leggere la seconda parte per ottenere il nome univoco. default_local ha il vantaggio opposto che il nome della variabile univoca viene visualizzato rapidamente, ma i locali non sono sempre così facilmente raggruppati visivamente.

Un paio di esempi per l'approccio domain_specific che ho visto sono: vehicle_model invece di model che era una parola riservata; room_table per una tabella SQL come table è una parola riservata.

Le altre due opzioni che ho visto utilizzare lingue o script sono:

  • virgolette o backtip ai nomi delle variabili surround e quindi consentono l'uso di parole riservate. Simile a questo, posso immaginare che alcune lingue possano consentire a un carattere speciale come un backspace di sfuggire a un nome.
  • spazi nei nomi delle variabili.
risposta data 02.01.2017 - 19:08
fonte
2

Ovviamente, fai tutto il possibile per evitare quella situazione. Scrivo software sin dalla fine degli anni '70 e le volte in cui ho davvero dovuto veramente fudge una parola riservata è ben sotto i dieci, probabilmente più vicina alle cinque.

Ci sono molte cose che puoi fare, come raddoppiare la prima o l'ultima lettera ( reservedd ) o aggiungere un underscore iniziale o finale ( reserved_ ). Ciò che è appropriato dipenderà molto dalle convenzioni usate nella lingua che state scrivendo, specialmente per quanto riguarda i caratteri di sottolineatura iniziali o finali. Prova anche a non fare cose con casi che potrebbero essere interpretati erroneamente dall'uomo (ad esempio, utilizzando Reserved quando differisce da reserved ).

Una volta che hai scelto qualcosa, inseriscilo nelle linee guida sulla codifica, assicurati che le persone lo sappiano e che siano utilizzate in modo coerente. Mi spingo fino al punto di aggiungere un commento di promemoria in modo che i lettori non pensino che sia un refuso e sanno che lo vedranno di nuovo:

int ccase;  // Name dodges a reserved word
    
risposta data 02.01.2017 - 16:34
fonte
1

In C #, puoi anteporre il nome di un identificatore con @ . Questo dice al compilatore di considerare il nome come il nome di un identificatore e non come una possibile parola chiave.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 
    
risposta data 03.01.2017 - 08:50
fonte

Leggi altre domande sui tag