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


64

Occasionalmente, il nome più logico per qualcosa (ad esempio una variabile) è una parola chiave riservata nella lingua o nell'ambiente prescelto. Quando non esiste un sinonimo ugualmente appropriato, come si fa a chiamarlo?

Immagino che ci siano euristiche delle migliori pratiche per questo problema. Questi potrebbero essere forniti dai creatori o dai governatori di linguaggi e ambienti di programmazione. Ad esempio, se python.org (o Guido van Rossum) dice come gestirlo in Python, sarebbe una buona linea guida nel mio libro. Anche un collegamento MSDN su come gestirlo in C # sarebbe buono.
In alternativa, dovrebbero essere utili anche le linee guida fornite dai principali influenzatori nell'ingegneria del software. Forse Google / Alphabet ha una bella guida di stile che ci insegna come gestirla?

Ecco solo un esempio: nel linguaggio C #, "default" è una parola chiave riservata. Quando uso un enum, mi piacerebbe nominare il valore predefinito "default" (analogo alle istruzioni "switch"), ma non posso.
(C # fa distinzione tra maiuscole e minuscole e le costanti di enum dovrebbero essere in maiuscolo, quindi "Default" è la scelta ovvia qui, ma supponiamo che la nostra guida di stile corrente imponga che tutte le costanti di enum siano in minuscolo.)
Potremmo considerare la parola "defaultus ", ma questo non aderisce al principio del minimo stupore . Dovremmo anche considerare "standard" e "iniziale", ma sfortunatamente "default" è la parola che trasmette esattamente il suo scopo in questa situazione.


15
Userei qualcosa come "default_value". Il significato rimane lo stesso, ma devi digitare qualche altro carattere.
Mael,

26
@Darkhogg se trovassi uno di quelli nel mio codice li cambierei immediatamente. Gli errori di ortografia o le violazioni della convenzione di denominazione non sono accettabili.
MetaFight,

26
@MetaFight - tranne che in Java, chiamare una variabile che contiene una classe clazzè praticamente uno standard di fatto. Essenzialmente è parte della convenzione piattaforma di denominazione. Fare qualsiasi altra cosa sarebbe una violazione delle aspettative che altri potrebbero avere leggendo il tuo codice, quindi dovrebbe essere fatto solo se assolutamente necessario.
Periata Breatta,

6
il valore predefinito come enum sembra controproducente. Dovrebbe essere un nome specifico del dominio che descrive l'impostazione predefinita. Tuttavia, dovrebbe esserci un metodo per restituire il valore predefinito.
qwerty_so,

18
@AndresF. Non sono d'accordo. Trovo spesso molto facile discutere contro i progettisti di Java. Non lo tengo contro di loro, però. Lavoravano nel selvaggio west.
MetaFight,

Risposte:


63

Per un'opzione enum dovresti usare il case del titolo come Default. Poiché C # fa distinzione tra maiuscole e minuscole, non si scontrerà con la parola chiave riservata. Vedere le Linee guida per la denominazione .net .

Poiché tutti i membri pubblici dovrebbero essere case del titolo in .net e tutti i nomi riservati sono in minuscolo, non dovresti trovarlo se non con variabili locali (inclusi i parametri). E i locali in genere avevano nomi o frasi come nomi, quindi è abbastanza raro che il nome più naturale si scontrasse con una parola chiave. Per esempio. defaultValuesarebbe in genere un nome più naturale di default. Quindi in pratica questo non è un grosso problema.

In C # è possibile utilizzare il @prefisso " " per evitare le parole chiave riservate in modo che possano essere utilizzate come identificatori (come @default). Ma questo dovrebbe essere usato solo se in realtà non hai altre opzioni, cioè se stai interfacciarsi con una libreria di terze parti che utilizza parole chiave riservate come identificatore.


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

SQL ha molte parole chiave, ma è molto comune semplicemente sfuggire agli identificatori, come [Table]. Alcuni lo fanno anche per tutti gli identificatori, indipendentemente dal fatto che si scontrino con una parola chiave o meno. (Dopotutto, una parola chiave in conflitto potrebbe essere introdotta in futuro!)

Powershell (e un sacco di altri linguaggi di scripting) prefigura tutte le variabili con un sigillo come $, il che significa che non si scontreranno mai con le parole chiave.

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

Python ha una convenzione ufficialmente riconosciuta in PEP-8 :

Usa sempre cls per il primo argomento per classificare i metodi.

Se il nome di un argomento di funzione si scontra con una parola chiave riservata, è generalmente preferibile aggiungere un carattere di sottolineatura singolo finale anziché utilizzare un'abbreviazione o corruzione ortografica. Quindi class_ è meglio di clss. (Forse meglio è evitare tali scontri usando un sinonimo.)

Alcune lingue come Brainfuck o Whitespace evitano affatto di definire le parole, evitando elegantemente il problema.

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


2
Tuttavia, non dovresti fare affidamento sulla sola distinzione tra maiuscole e minuscole. Sebbene nella pratica non sia probabile che si tratti di un problema, non tutti i linguaggi .NET fanno distinzione tra maiuscole e minuscole, quindi potresti riscontrare problemi imprevisti a un certo punto.
Vivelin,

6
@Vivelin: non dovresti avere membri pubblici o nomi di nomi che differiscono solo nel caso, poiché ciò potrebbe causare problemi per altre lingue. Ma questo non è correlato a ciò che suggerisco, poiché le parole chiave non sono identificatori (e altre lingue avranno altre parole chiave).
Jacques,

Anche se la sintassi @ è disponibile, è IMHO la migliore per gli scenari in cui è necessario interagire con le lingue scritte delle librerie con parole chiave diverse. Anche lì, penso che sarebbe stato meglio avere una caratteristica del linguaggio in qualche modo simile #define, ma l'operando di destra sarebbe sempre interpretato come un identificatore sensibile al maiuscolo / minuscolo. Ciò consentirebbe di risolvere molti tipi di conflitti di denominazione (inclusa, per i linguaggi senza distinzione tra maiuscole e minuscole, l'importazione di simboli identici ad eccezione del caso).
supercat

@Vivelin non tutti i linguaggi .NET fanno distinzione tra maiuscole e minuscole - conosco VB.NET e Powershell; ce ne sono altri?
Zev Spitz,

@ZevSpitz l'OP ha espressamente chiamato C #, motivo per cui penso che Vivelin l'abbia usato come suo esempio, tuttavia, come dici tu, VB.NET non fa distinzione tra maiuscole e minuscole, quindi come al solito, penso che sarebbe sceso in base alla lingua . Non tutte le lingue hanno le stesse parole riservate
Shaggy13spe

22

Aggiungerei un trattino basso (default_)

Professionisti:

  • semplice
  • ovvio (perché altrimenti aggiungerei 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 è lo stesso significato (sfumature)

Aggiunta / Preparazione di una parola:

  • incoerente (defaultValue, defaultItem)
  • maggiore verbosità senza maggiore leggibilità

Cambio di lettere (clazz invece di classe):

  • incoerente (clazz, klass, klazz)

Aggiunta di un numero (predefinito1):

  • solleva la domanda per default2

Aggiunta / Preparazione di una lettera:

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

Escaping a Keyword (@default (c #), `default` (scala))

  • possibile solo in alcune lingue
  • funzionalità 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 userei:

  • altra convenzione esistente, ampiamente usata
  • Conosco già un sinonimo appropriato
  • nel tuo caso specifico seguirei la risposta di @JacquesB

7
Questa è una soluzione spesso usata in Python. Non lo sto sostenendo come il più elegante, ma funziona.
fralau,

1
@fralau Python è particolarmente male - Odio davvero identificatori come "input"
Christian Sauer,

In molte lingue si vede klassper una variabile in cui classè una parola riservata. Non l'ho mai visto defawltma è la stessa idea. Preferirei default_(e probabilmente class_se non calpestare convenzioni stabilite facendo così).
nigel222,

Non hai incluso l'opzione di escape della parola chiave.
CodesInCos

1
Fai argomentazioni valide e sensate, anche se non sono sicuro che sia "ovvio perché sia ​​stato usato il carattere di sottolineatura". Raramente ho lavorato con froods che conoscono tutte le parole chiave delle lingue in cui lavorano!
Protector un

18

"Default" probabilmente non è 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. (Predefinito vs predefinito)

O meglio ancora, fai lo sforzo extra per digitare qualche altra lettera e chiamarla DefaultValue.


3
Sono d'accordo. "Predefinito" non offre indicazioni sul valore. Considerare enum ErrorHandlingLevel { Default = 0, ... }vs enum ErrorHandlingLevel { None = 0, ... }. Nel secondo esempio, il fatto che Noneè l'impostazione predefinita può essere reso noto impostando il valore enum su 0, usando xmldoc o esplicitamente nel codice. Ottieni il vantaggio aggiuntivo di sapere cosa significa quando un oggetto è ErrorHandlingLevelimpostato su None. Confrontalo con l'ispezione di un oggetto con l' ErrorHandlingLevelimpostazione predefinita.
Harrison Paine,

9

Consiglio vivamente di NON cambiare la convenzione di denominazione localmente (o aggiungere caratteri insignificanti) a scopo di chiarimento delle ambiguità (come è stato suggerito in altri post). Crea confusione se l'intento non è ovvio e può sollevare dubbi sul perché è stato chiamato in questo modo. Può essere risolto senza di essa.

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

Ad esempio, supponiamo che tu abbia un enum Modeche dovrebbe esporre un valore predefinito come nel tuo caso. La denominazione default_modepotrebbe non sembrare la migliore a causa della ripetizione, ma evita ambiguità mentre trasmette il significato desiderato.


Hai un punto valido, ma non sono ancora sicuro di cosa crei più confusione: avere un frammento costantemente aggiunto o usare parole diverse per ogni situazione. Naturalmente, la prima opzione è che le situazioni in cui sarebbe stata utilizzata in primo luogo sono (si spera) così rare che la coerenza non può essere dedotta dal codice esistente.
Protector un

3

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

  • 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 consiglio è di usare un prefisso o suffisso e caratteri di sottolineatura / trattini, ad es

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

local_defaultha il vantaggio che tutti i locali sono allineati e quindi si distinguono rapidamente, ma lo svantaggio che devi sempre leggere nella seconda parte per ottenere il nome univoco. default_localha il vantaggio opposto di vedere rapidamente il nome della variabile univoca, ma i locali non sono sempre così facilmente raggruppati visivamente.

Un paio di esempi per l'approccio domain_specific che ho visto sono: al vehicle_modelposto del modelquale era una parola riservata; room_tableper una tabella SQL come tableè una parola riservata.

Le altre due opzioni che ho visto usare le lingue o gli script sono:

  • virgolette o punte di punte per circondare i nomi delle variabili e quindi consentire l'uso di parole riservate. Simile a questo, potrei immaginare che alcune lingue potrebbero consentire a un carattere speciale come un backspace di sfuggire a un nome.
  • spazi nei nomi delle variabili.

Come nota a margine forse interessante: ho visto fare words_with_underscores-or-dashesriferimento a due nomi: snake_casequando si usa il trattino basso e kebab-casequando si usa il trattino. Ho trovato quest'ultimo divertente.
VLAZ,

2

Ovviamente, fai quello che puoi per evitare quella situazione. Scrivo software dalla fine degli anni '70 e le volte in cui ho dovuto davvero sfogliare una parola riservata sono ben meno di dieci, probabilmente più vicine alle cinque.

Ci sono molte cose che puoi fare, come raddoppiare la prima o l'ultima lettera ( reservedd) o aggiungere un trattino basso iniziale o finale ( reserved_). Ciò che è appropriato dipenderà molto dalle convenzioni utilizzate nella lingua che stai scrivendo, in particolare per quanto riguarda i trattini bassi iniziali o finali. Cerca anche di non fare cose con il caso che potrebbero essere male interpretate dagli umani (ad esempio, usando Reservedquando differisce da reserved).

Una volta che hai scelto qualcosa, inseriscilo nelle linee guida per la codifica, assicurati che le persone lo sappiano e che sia usato in modo coerente. Vado persino al punto di aggiungere un commento di promemoria in modo che i lettori non pensino che sia un errore di battitura e sanno che lo vedranno di nuovo:

int ccase;  // Name dodges a reserved word

10
Non il downvoter, ma il suggerimento di "raddoppiare la prima o l'ultima lettera" mi ha fatto
venire i

@WillemvanRumpt Neanche a me piace farlo, ma di tanto in tanto si tratta di scegliere tra fare ginnastica per evitare una parola riservata che richiede molto grattarsi la testa o un identificatore dall'aspetto strano che richiede solo un po ' .
Blrfl

6
Nessun giudizio previsto, solo ... brividi .... quelli freddi ...;)
Willem van Rumpt,

1
Postpendere un carattere di sottolineatura è meglio di un'ultima lettera raddoppiata. (Qualche voto per classs?)
nigel222,

1
Linee guida per la codifica! Sarebbe bello avere! Buon punto.
Protector un

2

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

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

3
mi chiedo chi voterebbe questa "risposta" che semplicemente ripete il punto già espresso (e presentato molto meglio) in una risposta votata il giorno prima
moscerino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.