È sbagliato usare caratteri Unicode nei nomi delle variabili? [chiuso]

80

Recentemente ho provato ad implementare un algoritmo di ranking, AllegSkill, in Python 3.

Ecco come si presenta la matematica:

alt text

No, really.

Questo è ciò che ho scritto:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

In realtà pensavo che sfortunatamente Python 3 non accettasse o ² come nomi di variabili.

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

Sono fuori di testa? Dovrei ricorrere a una versione solo ASCII? Perché? Non sarebbe più difficile una versione solo ASCII di quanto sopra per validare l'equivalenza con le formule?

Intendiamoci, ho capito che alcuni glifi Unicode sembrano molto simili tra loro e alcuni come (o è quello ▗▖) o ╦ non possono avere alcun senso nel codice scritto. Tuttavia, questo non è il caso per la matematica o glifi freccia.

Per richiesta, la versione solo ASCII sarebbe qualcosa sulla falsariga di:

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

... per ogni passo dell'algoritmo.

    
posta badp 01.11.2010 - 11:51
fonte

15 risposte

52

Sento strongmente che sostituire solo σ con s o sigma sarebbe stupido, confinante con il cervello morto.

Qual è il guadagno potenziale? Bene, vediamo ...

  • Migliora la leggibilità? No, non nel minimo. Se fosse così, la formula originale avrebbe indubbiamente usato anche lettere latine.

  • Migliora la scrittura? A prima vista, sì. Ma il secondo, no. Perché questa formula non cambierà mai (beh, "mai"). Non ci sarà normalmente bisogno di cambiare il codice, né di estenderlo usando queste variabili. Quindi la scrittura è - solo questa volta - non un problema.

Personalmente ritengo che i linguaggi di programmazione abbiano un vantaggio rispetto alle formule matematiche: è possibile utilizzare identificatori espressivi ed espressivi. In matematica, questo non è normalmente il caso, quindi ricorriamo a variabili di una sola lettera, che a volte le rendono greche.

Ma il greco non è il problema. Gli identificatori non descrittivi di una sola lettera sono.

Quindi tenga la notazione originale ... dopotutto, se il linguaggio di programmazione fa supporta Unicode negli identificatori, quindi non c'è barriera tecnica. O utilizzare identificatori significativi. Non sostituire semplicemente glifi greci con glifi latini. O quelli arabi, o hindi.

    
risposta data 01.11.2010 - 17:53
fonte
34

Personalmente, odio vedere il codice dove devo richiamare la mappa dei caratteri per scriverlo di nuovo. Anche se l'unicode corrisponde esattamente a quello che c'è nell'algoritmo, sta davvero danneggiando la leggibilità e l'abilità di modificare. Alcuni editor potrebbero non avere nemmeno un font che supporti quel personaggio.

Che ne dici di un'alternativa e hai solo //µ = u in alto e scrivi tutto in ASCII?

    
risposta data 01.11.2010 - 12:21
fonte
31

Questo argomento presume che tu non abbia problemi con la digitazione di unicodi o la lettura di lettere greche

Ecco l'argomento: ti piacerebbe pi o circular_ratio?

In questo caso, preferirei pi a circular_ratio perché ho imparato qualcosa di pi da quando ero alle elementari e posso aspettarmi che la definizione di pi sia ben radicata per ogni programmatore che ne valga la pena. Quindi non mi dispiacerebbe digitare π per dire circular_ratio.

Tuttavia, che dire di

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

o

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

Per me, entrambe le versioni sono ugualmente opache, proprio come pi o π è, tranne non ho imparato questa formula nella scuola elementare. winner_sigma e Wwin non significano nulla per me, o per chiunque altro legga il codice, e l'utilizzo di nessuno σw non lo rende migliore.

Quindi, usando nomi descrittivi, ad es. total_score , winning_ratio , ecc aumenterebbe la leggibilità molto meglio che usare i nomi ascii che si limitano a pronunciare le lettere greche . Il problema non è che non riesco a leggere le lettere greche, ma non posso associare i caratteri (greci o meno) con un "significato" della variabile.

Hai sicuramente compreso il problema da solo quando hai commentato: You should have seen the paper. It's just eight pages... . Il problema è che se si basa la denominazione delle variabili su un foglio, che sceglie i nomi di una sola lettera per concisione anziché leggibilità (indipendentemente dal fatto che siano greci), allora le persone dovrebbero leggere il documento per poter associare le lettere a un "senso"; questo significa che stai mettendo una barriera artificiale affinché le persone siano in grado di capire il tuo codice, e questa è sempre una brutta cosa.

Anche quando vivi in un mondo solo ASCII, sia a * b / 2 che alpha * beta / 2 sono un rendering ugualmente opaco di height * base / 2 , la formula dell'area triangolare. L'illeggibilità dell'utilizzo di variabili a singola lettera aumenta esponenzialmente man mano che la formula cresce in complessità e la formula di AllegSkill non è certamente una formula banale.

La variabile a lettere singole è accettabile solo come semplice contatore di loop, che si tratti di lettere singole greche o di lettere singole ascii, non mi interessa; nessuna altra variabile dovrebbe essere composta esclusivamente da una singola lettera. Non mi interessa se usi le lettere greche per i tuoi nomi, ma quando li usi, assicurati di poter associare quei nomi con un "significato" senza dover leggere un foglio arbitrario da qualche altra parte.

Quando nella scuola elementare, non mi dispiacerebbe affatto vedere espressioni matematiche usando simboli come: +, -, ×, ÷, per l'aritmetica di base e √ () sarebbe una funzione radice quadrata. Dopo essermi diplomato, non mi dispiacerebbe aggiungere simboli nuovi e brillanti: ∫ per l'integrazione. Nota la tendenza, questi sono tutti gli operatori. Gli operatori sono molto più usati dei nomi delle variabili, ma vengono meno spesso riutilizzati per un significato completamente diverso (nel caso in cui i matematici riutilizzino gli operatori, il nuovo significato spesso mantiene alcune proprietà fondamentali del vecchio significato: non è questo il caso per quando riutilizzi i nomi delle variabili).

In conclusione, no, non è male usare caratteri Unicode per nomi di variabili; tuttavia, è sempre brutto usare nomi di lettere singole per nomi di variabili, e l'autorizzazione a utilizzare i nomi Unicode non è una licenza per usare nomi di variabili a lettera singola.

    
risposta data 01.11.2010 - 15:50
fonte
14

Hai capito il codice? Qualcun altro che ha bisogno di leggerlo? Se è così, non ci sono problemi.

Personalmente sarei lieto di vedere il retro del codice sorgente ASCII.

    
risposta data 01.11.2010 - 12:19
fonte
9

Sì, sei fuori di testa. Vorrei fare personalmente riferimento alla carta e al numero di formula in un commento e scrivere tutto in ASCII dritto. Quindi, chiunque sia interessato sarebbe in grado di correlare il codice e la formula.

    
risposta data 01.11.2010 - 13:16
fonte
5

Direi che usare nomi di variabili Unicode è una cattiva idea per due motivi:

  1. Sono un PITA da digitare.

  2. Spesso hanno lo stesso aspetto delle lettere inglesi. Questa è la stessa ragione per cui odio vedere le lettere greche con la notazione matematica. Prova a distinguere rho da p. Non è facile.

risposta data 01.11.2010 - 14:55
fonte
4

In questo caso, una formula matematica complessa, direi di provarci.

Posso dire che in 20 anni non ho mai dovuto codificare qualcosa di questo complesso e le lettere greche lo tengono vicino alla matematica originale. Se non riesci a capirlo, non dovresti mantenerlo.

Dicendo che, se dovessi mantenere μ e σ nel codice standard di bog che mi hai lasciato, io scoprirò dove vivi ...

    
risposta data 01.11.2010 - 18:58
fonte
3
  • Pro: sembra carino
  • Con: i caratteri unicode e quindi l'intero significato potrebbe perdersi nella catena degli strumenti (editor, formattatore del codice, controllo della versione, compilatore più vecchio)

Quanto è grande il rischio per te? Il guadagno supera il rischio?

    
risposta data 01.11.2010 - 12:34
fonte
2

A volte in un futuro non troppo lontano, utilizzeremo tutti gli editor di testo / IDE / browser web che semplificano la scrittura di testi di modifica, inclusi caratteri greci classici, ecc. (o forse avremmo tutti imparato a usare questa funzionalità "nascosta" negli strumenti che usiamo attualmente ...)

Ma finché ciò non accade, i caratteri non ASCII nel codice sorgente del programma sarebbero difficili da gestire per molti programmatori e sono quindi una cattiva idea se stai scrivendo applicazioni che potrebbero dover essere mantenute da qualcun altro.

(Incidentalmente il motivo per cui è possibile avere caratteri greci ma non i segni di radice quadrata negli identificatori di Python è semplice: i caratteri greci sono classificati come lettere Unicode, ma il segno radice quadrata è una non lettera; vedi link )

    
risposta data 01.11.2010 - 13:02
fonte
2

Non hai detto quale lingua / compilatore stai utilizzando, ma in genere la regola per i nomi delle variabili è che devono iniziare con un carattere alfabetico o underscore e contenere solo caratteri alfanumerici e caratteri di sottolineatura. Un Unicode √ non sarebbe considerato alfanumerico, poiché è un simbolo matematico invece di una lettera. Tuttavia σ potrebbe essere (dato che si trova nell'alfabeto greco) e probabilmente sarebbe considerato alfanumerico.

    
risposta data 01.11.2010 - 15:32
fonte
1

Ho postato lo stesso tipo di domanda su StackOverflow

Sicuramente penso che valga la pena di usare l'unicode in pesanti problemi relativi alla matematica, perché rende possibile leggere direttamente la formula, il che è impossibile con ASCII semplice.

Immagina una sessione di debug: ovviamente puoi sempre scrivere a mano la formula che il codice dovrebbe calcolare per vedere se è corretta. Ma il novanta per cento delle volte non ti preoccuperai e il bug può rimanere nascosto per un lungo periodo di tempo. E nessuno è mai disposto a guardare questa astrusa formula ASCII a 7 righe. Ovviamente, l'uso di unicode non è buono come una formula resa tex, ma è molto meglio.

L'alternativa all'utilizzo di nomi descrittivi lunghi non è praticabile perché in matematica, se l'identificatore non è breve, la formula apparirà ancora più complicata (perché pensi che le persone, intorno al XVIII secolo, iniziarono a sostituire "plus" di "+" e "meno" di "-"?).

Persino, utilizzerei anche alcuni pedici e superscript (li copio-incollali solo da questa pagina ). Ad esempio: (Python ha permesso √ come identificatore)

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

Dove ho usato gli apici perché non esiste un pedice equivalente in unicode. (Sfortunatamente, il set di caratteri di unicode subscript è molto limitato. Spero che un giorno l'subscripting in unicode sarà considerato come diacritico, cioè una combinazione di un carattere per il pedice e un altro per la lettera dell'abbonato)

Un'ultima cosa, penso che questa conversazione sull'uso di caratteri non ASCII sia principalmente di parte, perché molti programmatori non si occupano mai di "notazioni matematiche ad alta intensità di formule". Quindi pensano che questa domanda non sia così importante, perché non hanno mai sperimentato una porzione significativa di codice che richiederebbe l'uso di identificatori non ASCII. Se sei uno di loro (e lo ero fino a poco tempo fa), considera questo: supponi che la lettera "a" non faccia parte di ASCII. Allora avrai una buona idea del problema di non avere lettere greche, pedici, apici quando computi formule matematiche non banali.

    
risposta data 14.09.2014 - 06:16
fonte
0

Questo codice è solo per il tuo progetto personale? Se è così, impazzisci, usa quello che vuoi.

Questo codice è destinato ad altri utenti? vale a dire, e l'app open source di qualche tipo? Se è così, probabilmente ti stai solo chiedendo dei problemi perché programmatori diversi usano editor diversi, e non puoi essere certo che tutti gli editor supportino l'unicode correttamente. Inoltre, non tutte le shell dei comandi lo mostreranno correttamente quando il file del codice sorgente è digitato 'd / cat'd, e potresti incorrere in problemi se devi visualizzarlo all'interno di html.

    
risposta data 01.11.2010 - 19:05
fonte
0

Personalmente sono motivato a considerare i linguaggi di programmazione come uno strumento per i matematici in questo contesto, poiché in realtà non uso la matematica che assomiglia a qualcosa di simile nella mia vita. : D E certo, perché non usare ɛ o σ o qualsiasi altra cosa - in quel contesto, in realtà è più leggibile.

(Anche se, devo dire, la mia preferenza sarebbe quella di supportare i numeri in apice come chiamate al metodo diretto, non i nomi delle variabili. es. 2² = 2 ** 2 = 4, ecc.)

    
risposta data 01.05.2011 - 13:59
fonte
-2

Che diavolo è σ , cos'è W , cos'è ε , c e cos'è γ ?
Devi dare un nome alle tue variabili in un modo che spieghi qual è il loro scopo.
Personalmente avrei battuto chiunque avesse lasciato la versione Unicode o ASCII da mantenere, anche se la versione ASCII è migliore.

Qual è il male chiama le variabili σ o s o sigma o value o var1 , perché questo non trasmette alcuna informazione.

Supponendo che tu scriva il tuo codice in inglese (come credo dovresti dovunque tu sia), ASCII dovrebbe essere sufficiente per dare alle tue variabili nomi significativi, quindi non c'è bisogno di Unicode.

    
risposta data 01.11.2010 - 14:18
fonte
-2

Per nomi variabili con origini matematiche ben conosciute questo è assolutamente accettabile, anche preferito. Ma se ti aspetti di distribuire il codice, dovresti inserire questi valori in un modulo, classe, ecc. In modo che il completamento automatico IDE possa gestire "digitando" gli strani caratteri.

Usare √ o ² in un identificatore - non tanto.

    
risposta data 15.06.2014 - 05:35
fonte

Leggi altre domande sui tag