Cosa fai quando la tua convenzione sui nomi si scontra con la tua lingua?


14

Ok, questa è una di quelle piccole cose che mi hanno sempre infastidito. In genere non abbrevia gli identificativi e l'unica volta che utilizzo un identificatore breve (ad es. i) È per un ciclo stretto. Quindi mi irrita quando sto lavorando in C ++ e ho una variabile che deve essere nominata operatoro classe devo aggirarla o usare un'abbreviazione, perché finisce per sporgere. Avvertenza: questo può succedere a me in modo sproporzionato spesso perché lavoro molto nella progettazione del linguaggio di programmazione, in cui gli oggetti di dominio possono rispecchiare concetti nel linguaggio host e causare inavvertitamente scontri.

Come lo faresti? Abbreviare? ( op) Errore ortografico? ( klass) Qualcos'altro? ( operator_)


7
A parte lo spazio dei nomi, forse dovremmo considerare di cambiare le nostre convenzioni di denominazione? Scusa per l'ovvio.
Chris

1
@ Chris: Non puoi mai fidarti di un programmatore per realizzare l'ovvio! (Anche se in questo caso l'ho fatto.)
Jon Purdy

7
Se c'è qualche motivo per apprezzare la $varsintassi di PHP , è così.
Joey Adams,

3
@Joey Adams: ho sorriso brevemente quando ho visto questa domanda e mi sono ricordato di tutte le domande di basamento di PHP che fluttuavano intorno a SE.
Chris

3
Ovviamente, modifica il codice sorgente della lingua per consentire le mie convenzioni di denominazione. Questo ha anche il vantaggio di "proteggere" il mio codice poiché verrà eseguito / compilato solo sul mio interprete / compilatore.
dietbuddha,

Risposte:


21
  1. Accetta che potresti dover apportare lievi modifiche alla convenzione di denominazione, come l'aggiunta di lettere maiuscole. È meglio accettarlo al più presto in modo che tutto il codice successivo sia coerente.

  2. Valuta di essere più specifico. Parole tendono ad essere abbastanza ampio, in modo da restringere classverso il basso per demonstrationClassnon solo funziona in tutto i problemi, ma aumenta anche la leggibilità.


10

Non è qualcosa che ho riscontrato, ma se mi trovassi in una situazione del genere, proverei a risolverlo con le seguenti opzioni, in ordine.

  1. Prova a trovare un sinonimo.
  2. (specialmente per le variabili) prova a trovare un prefisso o postfisso
  3. (specialmente per le classi) cambia la prima lettera in maiuscolo e dimentica la regola di codifica secondo cui i nomi non dovrebbero differire solo nel caso. Questa opzione, probabilmente userei solo se il conflitto è con una parola chiave.
  4. Usa un'abbreviazione.

1
Non vedo cosa c'è che non va nei nomi che differiscono solo nel caso, specialmente negli elenchi di argomenti in cui il parametro di tipo const Foo&non ha un nome completo ragionevole diverso da foo. Certo, potrebbe essere meglio dare al tuo Foonome un nome più descrittivo che foose vivesse in un corpo di funzione e avesse uno scopo meno specializzato.
Jon Purdy,

@Jon - Sono d'accordo, anche se personalmente tendo verso i prefissi "p_", "l_" e "m_" piuttosto che variare in base al caso. Ho adottato quella convenzione a causa del problema con lo stesso nome ovvio. Quale convenzione usi per affrontarlo è in gran parte irrilevante fintanto che lo usi in modo coerente in qualsiasi contesto particolare, ovviamente - l'approccio che varia tra maiuscole e minuscole è certamente abbastanza ampiamente usato da essere riconosciuto dalla maggior parte degli sviluppatori.
Steve314

@Jon - quel commento dice che applicherei selettivamente la convenzione solo quando ho lo stesso problema, che non è quello che intendevo. Il problema di contesto riguarda la lingua, il progetto, ecc. Le convenzioni sono progettate in modo tale che il problema sia un non-problema ogni volta che si verifica (o piuttosto non lo fa), per non essere applicato selettivamente secondo necessità.
Steve314,

@ Steve314: ho ottenuto il tuo significato dal primo commento. Non lo so, affissi come quello mi sono sempre sentito un po 'troppo vicino a Systems Hungarian per il mio conforto.
Jon Purdy

@Jon: Non è una regola che applico religiosamente, ma trovo che sia più facile commettere errori se due identificatori differiscono solo nel caso. Alcuni di questi errori saranno individuati dal compilatore, altri sono molto più difficili da trovare (specialmente se i due identificatori nominano lo stesso tipo di cose). Preferisco avere una regola generale, con eccezioni caso per caso, che un intero libro di regole che coprono tutti i casi possibili.
Bart van Ingen Schenau,

6

La lingua vince; non puoi superare in astuzia il compilatore (ignorando le abominazioni come PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END, ma poi PL / 1 non ti farebbe in primo luogo porre la domanda). Fondamentalmente, devi seguire le regole della lingua e devi trovare un'alternativa alle parole chiave della lingua per il tuo uso personale o trovare una lingua alternativa.

Quindi, tranne in circostanze molto insolite, ti adatti alla lingua, non viceversa.


5

Invece di abbreviare che ne dici di allungare? Se stai implementando un costrutto di classe in un linguaggio Foo, che ne dici di usare FooClass e foo_class? (Modulo qualunque siano le tue preferenze di involucro).


Faresti il ​​prefisso "java" su ogni identificatore che usi nel codice Java? E non parliamo nemmeno dei problemi con il prefisso "C ++" su ogni identificatore ...
Steve314

@ Steve314, non useresti il ​​prefisso java nel codice java, useresti il ​​prefisso java nel codice c ++ che implementa un compilatore java. Inoltre, lo useresti solo se il resto dell'identificatore fosse una parola chiave.
Winston Ewert,

OK - intendi l'allungamento in termini generali, come nell'essere più specifico ciò a cui fa riferimento anche l'identificatore. Per diverse applicazioni, "class" potrebbe essere rinominato in "class_taught" o "class_of_animal" o "classiness_value" o altro. Sono d'accordo - ho appena trovato confuso l'esempio orientato ai compilatori.
Steve314,

5

Alcune delle abbreviazioni che ho usato class, in ordine di frequenza:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Se so quale classe Classrappresenta l' istanza, potrei includerla nel nome della variabile:

  • stringClass = Class.forName("java.lang.String");

Mai visto "cls" per quello prima. Uso principalmente aClass.
Konstantin Petrukhnov,

4

In C e C ++, le parole chiave sono tutte minuscole e la lingua fa distinzione tra maiuscole e minuscole, quindi di tanto in tanto premere il tasto Maiusc e molti problemi scompaiono.

In Modula 2, le parole chiave sono tutto in maiuscolo - ma fino a quando i dati identificativi sono alcune lettere minuscole la differenza è evidente e scontri impossibile.

Inoltre, le convenzioni di denominazione assolutamente in una certa misura devono riflettere le convenzioni normali del linguaggio che stai usando, quindi scrivo sicuramente "myClass" in Java dove probabilmente scrivo "My_Class" in C ++.

Fondamentalmente, non stai solo scrivendo per il compilatore, ma ciò che la gente trova leggibile dipende in una certa misura dal contesto e dalle aspettative correlate.


3
Anche per le lingue con distinzione tra maiuscole e minuscole, ritengo che si siano mescolate classe Classdanneggerebbe la leggibilità del codice.
Karmastan,

@Karmastan - forse dipende da quanto tempo hai trascorso lavorando con linguaggi e convenzioni sensibili al maiuscolo / minuscolo. Personalmente, la "C" maiuscola contro minuscola è visivamente molto evidente: vedo i modelli di utilizzo del caso per identificatori lunghi più velocemente di quanto riesca a leggerli.
Steve314

3

Non mi capita spesso di imbattermi in questo, ma quando lo faccio tende ad essere un problema perché utilizzo Delphi e ti consente di aggirare questo problema anteponendo un & all'identificatore. Quindi "class" non è un identificatore valido, ma "& class" lo è.


Interessante. Ho un'utilità di generazione di codice che consente letterali di stringa ovunque sia possibile utilizzare un identificatore. In origine, la maggior parte degli identificatori per il codice generato erano scritti come valori letterali di stringa per evitare il rischio di conflitti di parole chiave con un DSL crescente (e ricco di parole chiave). Ora, gli identificatori vengono utilizzati per la maggior parte dei nomi (è sorprendente quanto sia più leggibile la fonte in quel modo), ma i letterali di stringa sono sempre disponibili come fallback. Ho pensato che fosse buono per la generazione del codice, ma soluzioni alternative per lo scontro di parole chiave sarebbero una cattiva idea in un linguaggio di uso generale - ma forse mi sbaglio.
Steve314,

2

Vorrei aggiungere una sorta di namespace al nome della variabile. Ad esempio, supponiamo che tu abbia un modulo chiamato user, quindi modificherei l'operatore nome variabile in qualcosa di simile a user_operator o userOperator.


2
semplicemente non usare "smooth", "no" o "my" come prefisso
Steven A. Lowe,

2
Assolutamente. Io voto "Jon_Purdys_Carefully_Chosen_Identifier_Prefix_".
Steve314,

1
@Steven: Peggio ancora, vedo a, ane theusato con frequenza inquietante dagli studenti CS principianti.
Jon Purdy,

1
@Jon Purdy, non è colpa nostra! Colpa del professore che ha deciso di nominare la sua istanza di classe People () aPerson.
Ben L

@Jon: La convenzione di denominazione in cui lavoro specifica che le variabili locali dovrebbero iniziare a aparte le variabili a ciclo stretto: /
Matthieu M.

2

modifica o modifica la mia convenzione di denominazione

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.