É ruim usar caracteres Unicode em nomes de variáveis? [fechadas]

80

Recentemente, tentei implementar um algoritmo de classificação, o AllegSkill, no Python 3.

Veja como é a matemática:

alt text

No, really.

Isto é o que eu escrevi:

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

Na verdade, acho que é uma pena que o Python 3 não aceite ou ² como nomes de variáveis.

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

Será que eu estou louco? Devo ter recorrido a uma versão somente ASCII? Por quê? Não seria mais difícil validar uma versão somente ASCII do acima para a equivalência com as fórmulas?

Veja bem, eu entendo que alguns glifos Unicode se parecem muito uns com os outros e outros como (ou é isso ▗▖) ou ╦ simplesmente não fazem sentido em código escrito. No entanto, esse não é o caso de Maths ou glifos de setas.

Por solicitação, a versão somente em ASCII seria algo como:

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

... por cada passo do algoritmo.

    
por badp 01.11.2010 / 11:51
fonte

15 respostas

52

Eu sinto strongmente que apenas substituir σ por s ou sigma seria estúpido, beirando a morte cerebral.

Qual é o ganho potencial? Bem, vamos ver…

  • Melhora a legibilidade? Não, nem um pouco. Se assim fosse, a fórmula original teria usado, sem dúvida, letras latinas também.

  • Isso melhora a capacidade de escrita? À primeira vista, sim. Mas no segundo, não. Porque essa fórmula nunca vai mudar (bem, "nunca"). Normalmente não haverá necessidade de alterar o código nem de ampliá-lo usando essas variáveis. Então, a escritura é - apenas desta vez - não é um problema.

Pessoalmente, acho que as linguagens de programação têm uma vantagem sobre as fórmulas matemáticas: você pode usar identificadores significativos e expressivos. Na matemática, esse normalmente não é o caso, então recorremos a variáveis de uma letra, ocasionalmente tornando-as gregas.

Mas o grego não é o problema. Os identificadores não descritivos de uma letra são.

Portanto, mantenha a notação original ... afinal, se a linguagem de programação oferecer suporte a Unicode em identificadores, não haverá barreira técnica. Ou use identificadores significativos. Não substitua apenas glifos gregos por glifos latinos. Ou os árabes, ou os hindus.

    
por 01.11.2010 / 17:53
fonte
34

Pessoalmente, eu odiaria ver o código em que tenho que abrir o mapa de caracteres para digitá-lo novamente. Mesmo que o unicode corresponda de perto ao que está no algoritmo, está realmente prejudicando a legibilidade e a capacidade de edição. Alguns editores podem até não ter uma fonte que suporte esse caractere.

Que tal uma alternativa e ter apenas o topo //µ = u e escrever tudo no ascii?

    
por 01.11.2010 / 12:21
fonte
31

Este argumento assume que você não tem problemas em digitar unicodes nem ler letras em grego

Aqui está o argumento: você gostaria de pi ou circular_ratio?

Neste caso, eu preferiria pi à circular_ratio porque eu aprendi sobre pi desde que eu estava na escola e eu posso esperar que a definição de pi esteja bem enraizada para todos os programadores que merecem o seu sal. Portanto, eu não me importaria de digitar π para significar circular_ratio.

No entanto, e sobre

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

ou

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

Para mim, ambas as versões são igualmente opacas, assim como pi ou π , exceto eu não aprendi essa fórmula na escola. winner_sigma e Wwin não significam nada para mim ou para qualquer outra pessoa lendo o código, e não usar nem σw não o torna melhor.

Então, usando nomes descritivos, por exemplo total_score , winning_ratio , etc aumentariam a legibilidade muito melhor do que usando nomes ascii que apenas pronunciam letras gregas . O problema não é que eu não possa ler letras gregas, mas não posso associar os caracteres (grego ou não) com um "significado" da variável.

Você certamente entendeu o problema quando comentou: You should have seen the paper. It's just eight pages... . O problema é se você basear sua nomenclatura de variáveis em um papel, que escolhe nomes de uma letra para concisão ao invés de legibilidade (independente de serem gregos), então as pessoas teriam que ler o artigo para poder associar as letras com um "significado"; Isso significa que você está colocando uma barreira artificial para as pessoas entenderem seu código, e isso é sempre uma coisa ruim.

Mesmo quando você mora em um mundo somente ASCII, a * b / 2 e alpha * beta / 2 são uma renderização igualmente opaca de height * base / 2 , a fórmula da área do triângulo. A impossibilidade de usar variáveis de uma letra cresce exponencialmente à medida que a fórmula cresce em complexidade, e a fórmula de AllegSkill certamente não é uma fórmula trivial.

Variável de letras simples só é aceitável como um contador de loop simples, sejam elas letras únicas gregas ou letras simples ascii, eu não ligo; nenhuma outra variável deve consistir apenas em uma única letra. Eu não me importo se você usa letras gregas para seus nomes, mas quando você usá-los, certifique-se de que eu possa associar esses nomes a um "significado" sem precisar ler um papel arbitrário em outro lugar.

Quando estou na escola, eu definitivamente não me importo de ver expressões matemáticas usando símbolos como: +, -, ×, ÷, para aritmética básica e √ () seria uma função de raiz quadrada. Depois que me formei no ensino fundamental, não me importaria de acrescentar novos símbolos brilhantes: ∫ para integração. Observe a tendência, estes são todos os operadores. Os operadores são muito mais usados do que nomes de variáveis, mas são menos frequentemente reutilizados para um significado completamente diferente (no caso em que matemáticos reutilizam operadores, o novo significado muitas vezes ainda contém algumas propriedades básicas do antigo significado; não é esse o caso ao reutilizar nomes de variáveis).

Em conclusão, não, não é ruim usar caracteres Unicode para nomes de variáveis; no entanto, é sempre ruim usar nomes de letras únicas para nomes de variáveis e ter permissão para usar nomes Unicode não é uma licença para usar nomes de variáveis de letras únicas.

    
por 01.11.2010 / 15:50
fonte
14

Você entende o código? Todos os outros que precisam lê-lo? Se assim for, não há problema.

Pessoalmente, ficaria feliz em ver o verso do código-fonte ASCII.

    
por 01.11.2010 / 12:19
fonte
9

Sim, você está fora de si. Eu pessoalmente faria referência ao papel e ao número da fórmula em um comentário, e escrevesse tudo em ASCII direto. Então, qualquer pessoa interessada seria capaz de correlacionar o código e a fórmula.

    
por 01.11.2010 / 13:16
fonte
5

Eu diria que usar nomes de variáveis Unicode é uma má ideia por dois motivos:

  1. Eles são um PITA para digitar.

  2. Eles geralmente parecem quase o mesmo que letras inglesas. Esta é a mesma razão pela qual eu odeio ver letras gregas em notação matemática. Tente separar rho p. Não é fácil.

por 01.11.2010 / 14:55
fonte
4

Neste caso, uma fórmula matemática complexa, eu diria que vá em frente.

Eu posso dizer que em 20 anos eu nunca tive que codificar algo que essas letras complexas e gregas mantêm perto das matemáticas originais. Se você não consegue entender, você não deveria mantê-lo.

Dizendo que, se eu tiver que manter µ e σ no código padrão do bog que você me legou, eu vou descobrir onde você mora ...

    
por 01.11.2010 / 18:58
fonte
3
  • Pro: parece legal
  • Con: os caracteres unicode e, portanto, todo o significado pode se perder na cadeia de ferramentas (editor, formatador de código, controle de versão, compilador antigo)

Qual é o tamanho do risco para você? O ganho supera o risco?

    
por 01.11.2010 / 12:34
fonte
2

Em algum momento no futuro não muito distante, todos usaremos editores de texto / IDEs / navegadores que facilitam a edição de texto, incluindo caracteres do grego clássico, etc. (Ou talvez todos nós tenhamos aprendido a usar essa funcionalidade "oculta" nas ferramentas que usamos atualmente ...)

Mas, até que isso aconteça, caracteres não ASCII no código-fonte do programa seriam difíceis de manipular por muitos programadores e, portanto, é uma má ideia se você estiver criando aplicativos que precisem ser mantidos por outra pessoa.

(Por acaso, o motivo pelo qual você pode ter caracteres gregos, mas não sinais de raiz quadrada em identificadores Python, é simples. Os caracteres gregos são classificados como Unicode Letters, mas o sinal de raiz quadrada é não-letra; consulte link )

    
por 01.11.2010 / 13:02
fonte
2

Você não disse qual idioma / compilador está usando, mas geralmente a regra para nomes de variáveis é que eles devem começar com um caractere alfabético ou sublinhado e conter apenas alfanuméricos e sublinhados. Um Unicode √ não seria considerado alfanumérico, pois é um símbolo matemático em vez de uma letra. No entanto, σ pode ser (uma vez que é no alfabeto grego) e á provavelmente seria considerado alfanumérico.

    
por 01.11.2010 / 15:32
fonte
1

Eu postei o mesmo tipo de pergunta em StackOverflow

Eu definitivamente acho que vale a pena usar o unicode em problemas relacionados à matemática pesada, porque torna possível ler a fórmula diretamente, o que é impossível com ASCII simples.

Imagine uma sessão de depuração: é claro que você sempre pode escrever à mão a fórmula que o código deve computar para ver se está correta. Mas noventa por cento do tempo, você não vai se incomodar e o bug pode ficar escondido por muito tempo. E ninguém nunca está disposto a olhar para esta fórmula ASCII simples de 7 linhas. É claro que usar o unicode não é tão bom quanto uma fórmula de renderização de texto, mas é muito melhor.

A alternativa de usar nomes longos descritivos não é viável porque, em matemática, se o identificador não for curto, a fórmula parecerá ainda mais complicada (por que você acha que as pessoas, por volta do século XVIII, começaram a substituir "plus" por "+" e "menos" por "-"?).

Pessoalmente, eu também usaria alguns subscritos e sobrescritos (eu apenas os copiei e copiei de esta página ). Por exemplo: (tinha python permitido √ como um identificador)

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

Onde usei sobrescrito porque não há um subscrito equivalente no unicode. (Infelizmente, o conjunto de caracteres unicode subscrito é muito limitado. Espero que, um dia, subscrever em unicode seja considerado diacrítico, ou seja, uma combinação de um caractere para subscrito e outro caractere para a letra subscrita)

Uma última coisa, acho que essa conversa sobre o uso de caracteres não-ASCII é basicamente tendenciosa, porque muitos programadores nunca lidam com "notações matemáticas de fórmula intensiva". Então, eles acham que essa questão não é tão importante, porque eles nunca experimentaram uma parte significativa do código que exigiria o uso de identificadores não-ASCII. Se você é um deles (e eu fui até recentemente), considere isto: suponha que a letra "a" não faça parte do ASCII. Então você terá uma boa idéia do problema de não ter nenhuma letra grega, subscrito, sobrescrito ao calcular fórmulas matemáticas não-triviais.

    
por 14.09.2014 / 06:16
fonte
0

Este código é apenas para o seu projeto pessoal? Se sim, enlouqueça, use o que quiser.

Este código significa que outras pessoas podem usar? ou seja, e algum tipo de aplicativo de código aberto? Em caso afirmativo, você provavelmente está apenas solicitando problemas, pois programadores diferentes usam editores diferentes, e você não pode ter certeza de que todos os editores suportarão o unicode corretamente. Além disso, nem todos os shells de comando mostram corretamente quando o arquivo de código-fonte é type'd / cat'd, e você pode encontrar problemas se precisar exibi-lo em html.

    
por 01.11.2010 / 19:05
fonte
0
Pessoalmente, estou motivado a considerar as linguagens de programação como uma ferramenta para os matemáticos nesse contexto, já que não uso matemática que se pareça com isso na minha vida. : D E claro, por que não usar ɛ ou σ ou o que for - nesse contexto, na verdade é mais legível.

(Embora, eu tenha que dizer, minha preferência seria apoiar números sobrescritos como chamadas de método direto, não nomes de variáveis. por exemplo, 2² = 2 ** 2 = 4, etc.)

    
por 01.05.2011 / 13:59
fonte
-2

Que diabos é σ , o que é W , o que é ε , c e o que é γ ?
Você deve nomear suas variáveis de uma maneira que explique qual é o propósito delas.
Eu pessoalmente espancaria quem deixasse a versão Unicode ou ASCII para eu manter, embora a versão ASCII seja melhor.

O que é mal é chamar as variáveis σ ou s ou sigma ou value ou var1 , porque isso não transmite nenhuma informação.

Supondo que você escreva seu código em inglês (como eu acredito que você deveria de onde quer que você seja), ASCII deve ser suficiente para dar nomes variáveis para suas variáveis, então não há necessidade real de Unicode.

    
por 01.11.2010 / 14:18
fonte
-2

Para nomes de variáveis com origens matemáticas conhecidas, isso é absolutamente aceitável - até mesmo preferido. Mas se você espera distribuir o código, você deve colocar esses valores em um módulo, classe, etc. para que o preenchimento automático do IDE possa manipular "digitando" os caracteres estranhos.

Usando √ ou ² em um identificador - não muito.

    
por 15.06.2014 / 05:35
fonte