Errori ortografici intenzionali per evitare parole riservate


45

Vedo spesso un codice che include errori ortografici intenzionali di parole comuni che nel bene e nel male sono diventate parole riservate:

  • klasso clazzper classe :Class clazz = ThisClass.class
  • kountper il conteggio in SQL:count(*) AS kount

Personalmente trovo che ciò riduca la leggibilità. Nella mia pratica non ho trovato troppi casi in cui un nome migliore non avrebbe potuto essere usato - itemClasso recordTotal.

Un esempio di JavaDocs per Class lo mostra nei parametri:

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

Questo mostra un caso d'uso ragionevole?


9
Per la cronaca: In Python, clsè un nome comune (in effetti, quello idiomatico) per variabili / argomenti che contano le classi effettive (quelle che dichiari con la classparola chiave e di cui tutto è un'istanza).

14
Non ti piace typedef char ínt?
Jeff,

14
@muntoo Hai ragione. Ottengo anche errori del compilatore per iñt. Ecco il mio piano per il dominio del mondo.
Jeff

1
Ho infranto questa regola ... e ora provo vergogna.
jmq

3
Non farlo Posso onestamente dire che non l'ho mai visto prima e, se lo facessi, lo rinominerei immediatamente. Proprio abbreviare se si dispone di utilizzare un nome di variabile non descrittivo ( Class c).
Cody Gray,

Risposte:


63

IMHO, questa è una pessima idea. Le parole riservate sono riservate per un motivo e ciò riduce la leggibilità.

Sono anche pienamente d'accordo con il tuo secondo punto. Denominare una variabile class, anche se tu potessi farlo, sarebbe altrettanto male che nominarla tmpo a. Che tipo di classe? Una classe di cosa? I nomi dovrebbero essere descrittivi.


15
"Le parole riservate sono riservate per un motivo" <- Questo. (Che, ironia della sorte, è riservata.)
TryCatch

16
+1 perché hai ragione. Ma se stavi scrivendo un software di pianificazione della classe o qualcosa del genere, la classe potrebbe essere una variabile legittima o un nome di classe ...
CaffGeek

8
Meh. "Le parole riservate sono riservate per un motivo ", ovvero i progettisti linguistici sono pigri. Esistono alcune lingue sofisticate in cui le parole sono riservate solo nei luoghi specifici in cui vengono utilizzate. Ma Ritchie ha iniziato questa tendenza quando aveva bisogno di un compilatore leggero per C, e la maggior parte dei progettisti di lingue l'ha imparato da lì.
Ross Patterson,

14
no Ross, è perché i programmatori (e i lettori in generale) hanno un'aspettativa che le cose abbiano un significato ragionevolmente inequivocabile (motivo per cui l'apprendimento delle lingue straniere è spesso così difficile, tutte le cose con doppio significato o significato diverso dalla lingua in cui sei stato cresciuto fin dall'infanzia dove non noti mai queste ambiguità perché fanno parte del tuo patrimonio culturale).
jwenting

3
@AlexanderMorou No, e nemmeno la maggior parte dei progettisti di lingue, hanno appena iniziato con il design di qualcun altro. Ma guarda Algol, Fortran, PL / I, Rexx e altre lingue non basate su C, e vedrai che le grammatiche senza parole riservate sono certamente possibili, solo più difficili. Ritchie aveva una buona ragione: la gente di Unix sentiva che ogni sequenza di tasti contava, e su un PDP-11, ogni ciclo di CPU contava. Oggi? Non così tanto.
Ross Patterson,

21

La Guida allo stile di Python evidenzia questo problema in modo specifico e suggerisce:

Se il nome del tuo attributo pubblico si scontra con una parola chiave riservata, aggiungi un singolo trattino finale al nome del tuo attributo. È preferibile un'abbreviazione o un'ortografia corrotta.

Questa sembra una regola generale piuttosto buona, supponendo che non sia in conflitto con la semantica di un particolare linguaggio.


7
Penso che questo sia un consiglio davvero scarso da una guida di stile. Se il nome del tuo attributo è così vicino a una parola chiave, dovresti trovare un nome migliore. Semplicemente attaccare un trattino basso alla fine non aggiunge alcun significato e fa probabilmente confondere il prossimo che legge il codice.
Wayne Johnston,

18
@Wayne: Come hai intenzione di nominare l'operazione sindacale in una struttura di ricerca sindacale quando unionè una parola chiave (come in C)? Lo chiamerai foosolo perché non dovrebbe apparire union?
Fred Foo,

OTOH, clsè il nome argomento standard per il metodo di classe. Ad esempio, anche negli oggetti Django sono presenti degli .idattributi, che ovviamente sono in conflitto con la idfunzione integrata.
Vartec,

1
@GoloRoden Non ho mai sentito nessuno dire che stavano "unendo" due set durante il calcolo del sindacato. Non fa parte del gergo. "Unire" sarebbe meglio, ma un mergemetodo avrebbe ancora bisogno di documentazione che dichiari esplicitamente che implementa l'unione e che sia stato rinominato per motivi puramente tecnici.
Fred Foo,

2
@GoloRoden Secondo Merriam-Webster non è un verbo, ma vedi questa risposta .
maaartinus,

18

Odore di codice.

string stringVariable = "";

Il codice sopra non mi dice nulla sull'uso previsto delle variabili.

class Klass

Stesso problema

string UserNameString = "bmackey"

Il codice sopra riportato non dovrebbe richiedere la stringa di parole chiave aggiunta al nome della variabile. Se ti trovi a dover identificare i tipi in base al nome della variabile, il tuo codice è troppo lungo. Condensare-refactoring.


Non ti dice nulla perché non è "codice", è una dichiarazione di variabile isolata. Una "classe" o "klass" potrebbe benissimo dirti tutto ciò che devi sapere. Ad esempio, un metodo generico può ricevere un Class<T>parametro e questo può avere senso. Quindi non sono d'accordo sul fatto che sia un odore di codice.
Andres F.

5

Personalmente, penso che sia un'opzione perfettamente valida per il tuo stile di codice.

Sono parole riservate, quindi il compilatore non deve decidere se intendevi il meccanico del linguaggio o la tua variabile. Con questo in mente, implica che si aspettano che le persone abbiano bisogno di una variabile come una parola riservata.

Scorrendo la fonte in bundle con JDK 1.6 R21, trovo 917 occorrenze di "clazz". Apparentemente, hanno pensato che fosse uno stile accettabile.

Come si sente la tua squadra al riguardo? Se pensi che sia cattivo, ma gli altri 9 ragazzi della tua squadra pensano che sia buono, allora devi mordere il proiettile e accettarlo. Finché c'è comunicazione su ciò che va bene e cosa non lo è, e stai sollevando problemi che vedi come li vedi, dovrebbe andare bene.

Le opinioni del tuo team sullo stile del codice sono più importanti della mia opinione o di chiunque altro in questo post . Questo vale per questa e tutte le altre decisioni sullo stile di codice che potresti avere.


1
Giusto, ma alla fine la tua squadra cambierà. Per molti anni lungo la strada ci sarà un poveraccio che guarda il tuo codice pieno di occhiali e chiacchiere e dice "WTF!".
MrFox,

4
Se stai usando entrambi klasse clazzquesta è una cosa negativa. Devi essere coerente, quindi devono impararlo solo una volta. E idealmente questo è spiegato anche nelle linee guida sullo stile delle squadre, quindi non è una sorpresa.
corsiKa

Il codice è scritto non solo per le persone della tua squadra, ma per il resto del mondo da leggere. Quando la tua squadra è su un autobus che supera una scogliera, qualcun altro inizia a leggere il codice. Usa nomi che descrivano in modo completo e conciso quale sia la variabile, non come sia rappresentata.
Rob K,

1
No, semplicemente no. Il tuo team è molto, molto più propenso a ruotare i membri lentamente nel tempo. Puoi pianificare che una persona venga colpita da un autobus, ma non puoi pianificare che l'intera squadra venga colpita da un autobus. La maggior parte del codice è stato scritto per forse una dozzina di persone che hanno mai avuto bisogno di leggerlo, la metà durante la revisione del codice.
corsiKa

4

Errori ortografici intenzionali per evitare parole riservate è una cattiva idea.

  • Gli errori di ortografia sono difficili da distinguere dall'ortografia corretta, pertanto rendono il codice più difficile da leggere.

  • Gli errori di ortografia sono difficili da ricordare, quindi è probabile che diversi errori di ortografia siano in concorrenza all'interno del codice, il che rende il codice più difficile da scrivere e più difficile da leggere.

  • Le parole riservate si riferiscono al linguaggio utilizzato per risolvere il problema, non al problema stesso. Un nome di variabile dovrebbe indicare un concetto correlato al problema.

È quindi meglio scegliere un nome descrittivo alternativo o, se non esiste un'alternativa soddisfacente, qualificare la parola riservata come in:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}

3

Class clazzodora di "Non mi sono preoccupato di cercare di trovare un buon nome". Una variabile rappresenta sempre qualcosa e un buon nome lo descrive. Mi rifiuto di immaginare che clazzad esempio in ogni caso sia il miglior nome possibile. È un riferimento a una classe -> class_reference, is è una copia di un oggetto di classe -> class_copy, ecc. Eventualmente anche rilasciare "class" e usa semplicemente la parola descrittiva, ad es.

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

Qui clazz è la classe target su cui deve essere eseguito il controllo, quindi

checkMemberAccess(Class<?> target, int which)

descriverebbe meglio a cosa serve il parametro di quanto mai clazz.


IMHO non è meglio, potresti chiamarlo 'classToBeAccessed` o altro, ma qualsiasi nome più descrittivo mostra solo l'ovvio. Mi piacciono i nomi lunghi solo se forniscono informazioni utili.
Maaartinus,

1
classToBeAccessedè davvero un buon nome ( classToBeCheckedforse sarebbe anche meglio).
hlovdal

1

Se usano un nome riservato per una variabile, è una variabile mal nominata. Anche se è un nome legittimo, ad esempio Class per il software di classe.

Le variabili mal nominate sono un segno di codice mal concepito o casuale - attenzione agli altri aspetti del software che si sta mantenendo.


0

Penso che errori ortografici o abbreviazioni intenzionali siano una buona idea se usati con cura e coerenza .

Considerare in Java:

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

Il posto dove usare gli errori ortografici è dove la parola riservata è chiaramente la parola migliore per il lavoro. Ci sono due posti in cui non puoi usare l'ortografia in cui potresti essere tentato.

  1. Non hai voglia di pensare a un buon nome
  2. Vuoi solo una variabile fittizia e non ha bisogno di un nome descrittivo

Nel primo caso, è abbastanza ovvio che la pigrizia è raramente una buona politica per la creazione di un codice di qualità. Nel secondo caso, scegli una variabile molto breve. Questo è ciò che i matematici fanno sempre e i programmatori fanno per gli indici. Non c'è motivo di limitarsi a farlo per gli indici se è davvero solo una variabile fittizia:

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

Non perdi nulla con nomi di variabili brevi quando il metodo o la struttura del codice ti dice cosa deve essere lì.


2
Mi dispiace, non posso essere d'accordo. Come funziona esattamente nextMeeting? La logica è oscura. Mi stai costringendo a cercare la definizione di Klass ogni volta che leggo il tuo codice perché il nome non ha senso. Se invece avessi avuto nextMeeting (MeetingRoom meetingRoom), avrei una definizione di classe in meno (klass? Clazz?) Da leggere e quindi sarei più produttivo. Il codice viene letto molto più di quanto scritto.
MrFox,

@suslik - nextMeeting(MeetingRoom r)è abbondante. Cosa meetingRoomti sta portando lì? Se ti nextMeeting(int meetingRoom)avessi capito, ma il mio punto è usare nomi di variabili brevi quando le informazioni sono già disponibili da altre fonti .
Rex Kerr,

Il mio post riguardava più l'esistenza di Klass nella base di codice. Sono d'accordo con nomi di variabili brevi a volte, ma se i tuoi metodi si allungano e devi continuare a registrarmi per assicurarmi che "r" sia una MeetingRoom, allora non è eccezionale. Sono curioso di sapere qual è il lato negativo di meetingRoom? Spazio orizzontale? Troppo a lungo per scrivere?
MrFox,

@suslik - Sì, perdi il contesto orizzontale con nomi di variabili lunghe. Perdi il contesto verticale con metodi lunghi, quindi è meglio cercare di evitarli (ma concordo comunque se lo fai, probabilmente vorrai che i nomi delle tue variabili siano promemoria migliori). Klassera un'alternativa quando c'era una parola riservata . Non consiglio di usare un errore di ortografia quando è disponibile l'ortografia originale!
Rex Kerr,

0

Ho visto usi legittimi Class klassquando si fa riflessione in cui si lavora effettivamente con un'istanza della Classclasse.


2
La domanda non è se c'è un caso in cui hai un'istanza, ma se dovresti usare quell'ortografia o un nome più descrittivo come userClasso qualche altra opzione.
Nicole,

2
In tal caso preferisco classInstancesopra klass.
Konrad Morawski,

2
@KonradMorawski: Ma tutti gli oggetti con cui lavori sono istanze, quindi classInstanceè piuttosto ridondante. Inoltre, potrei immaginare qualcosa del genere class klass; Object classInstance = klass.newInstance;.
Maaartinus,

0

Vedo spesso un codice che include errori ortografici intenzionali di parole comuni che nel bene e nel male sono diventate parole riservate:

klass o clazz per la classe: Class clazz = ThisClass.class

kount per conteggio in SQL: count (*) AS kount

Personalmente trovo che ciò riduca la leggibilità. Nella mia pratica non ho trovato troppi casi in cui un nome migliore non avrebbe potuto essere usato - itemClass o recordTotal.

Tuttavia, è così comune che non posso fare a meno di chiedermi se sono l'unico? Qualcuno ha qualche consiglio o ancora meglio, citati consigli di programmatori di tutto rispetto su questa pratica?

Per variabili locali e argomenti formali, non importa.

Qualsiasi nome va bene purché non sia intenzionalmente fuorviante o fastidiosamente fastidioso. Nel tuo esempio:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

non importa se la singola variabile locale è "clazz" o "klass" o "cls" o semplicemente "c". Probabilmente aggiungerei semplicemente l'espressione:

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

La lunghezza di un nome di variabile deve essere correlata all'ambito della variabile. Per le variabili locali in metodi brevi (e dovrebbero essere tutte brevi), i nomi molto brevi vanno bene.


la tua inline sembra errata ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()- persa ClassUtils.loadClasslungo la strada
moscerino

0

Penso che gli errori ortografici siano sempre una cattiva idea. Non è carino per i tuoi lettori. Io, per esempio, mi chiederei se mi mancasse qualcosa quando vedo la parola klass. (Intendevano classo intendevano il pirata?) Almeno per me, tutti gli errori di ortografia che riconosco sono irritanti.

Per i pochissimi casi, in cui la parola riservata è davvero l'unica cosa significativa conosciuta sulla variabile, utilizzerei le seguenti alternative:

  • Se si tratta di un argomento di funzione, utilizzare aClassinvece di class.

  • Se si tratta di una variabile locale o membro, utilizzare myClassinvece di class.

  • Se si tratta di un accessorio, utilizzare getClass()invece di class().

Ovviamente, il prefisso aggiunto è piuttosto inutile e, di conseguenza, dovrebbe essere usato solo come ultima risorsa. Ma almeno non interferisce con il parser mentale del tuo lettore ed è un modo sicuro per evitare parole riservate.


0

Uno dei vantaggi dell'ortografia creativa è la migliore capacità di ricerca. Penso che sia molto più facile fare una ricerca completa del codice per cose uniche, piuttosto che per parole comuni, dove troppo spesso troverai tutte le cose sbagliate e 1000 di esse. Ad esempio, possedevo kzpg.com. Google che ora e vedrai solo alcuni hit. È unico e quindi molto rintracciabile.

Ma in una certa misura penso che questa domanda sia di opinione più che di sostanza. Sono cresciuto personalmente su Forth, dove si trattava solo di parole e molte di esse. Uno ha imparato a diventare molto creativo per salvare le dita. Alla fine avevo circa 640.000 caratteri, più o meno nella mia base di origine. Quindi mantenere le parole brevi era importante per portare a termine il lavoro.


Quel collegamento ora è rotto.
Peter Mortensen,
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.