As funções 'matemáticas' devem seguir a notação matemática?


11

Suponho que essa pergunta será imediatamente sinalizada como subjetiva, mas qual você acha que é melhor:

double volume(double pressure, double n_moles, double temperature) {
  return n_moles * BOLTZMANN_CONSTANT * temperature / pressure;
}

ou

double volume(double P, double n, double T) {
  return n*R*T/P;
}

Em outras palavras, as funções que implementam alguma equação seguem a notação dessa equação ou devem usar nomes mais detalhados?


3
Às vezes, você também gasta mais tempo pensando em como nomear uma variável do que na própria codificação? ;-)
Tomas

1
Eu acho que a segunda alternativa é boa. Eu explicaria as variáveis ​​em um comentário.
Giorgio

Parece que alguém achou oportuno analisar e votar de maneira negativa as respostas de todos. Essa pessoa gostaria de compartilhar sua razão para fazer isso? As respostas pareciam perfeitamente razoáveis ​​para mim.

Tecnicamente, isso não tem nada a ver com notação "matemática" e tudo a ver com o que um físico pensaria. Não há nada além de aritmética acontecendo aqui.
Duffymo

2
Eu posso ver todos os americanos passando a temperatura em Fahrenheit. Definitivamente, eu não usaria o dobro do tipo para temperatura. O mesmo provavelmente vale para a pressão. Eu acho que estaria mais interessado em obter os tipos seguros do que os nomes.
Martin York

Respostas:


14

Depende de quem está lendo. Se você pode garantir que, por toda a eternidade, o próximo programador que lê seu código também esteja familiarizado com a termodinâmica, então sim, vá para a versão truncada.

Meu estilo pessoal é usar essas variáveis ​​(cujas abreviações são comumente conhecidas no campo), mas incluir sua descrição nos comentários.

/* P : Pressure
   V : Volume
   n : Number of moles
   R : Boltzmann constant
   T : Temperature (in K)
*/
double compute_V(double P, double n, double T) {
  return n*R*T/P;
}

5
Qual é o objetivo? Alguém que não entende a termodinâmica não tem chance de manter o código com sucesso, independentemente dos nomes das variáveis.
dsimcha

Isso certamente é melhor do que não incluir as informações, mas, neste momento, parece que seria mais fácil usar esses nomes na função. Eu não estou vendo um monte de utilidade em usar as letras ...
Patrick87

@dsmicha: Sim, PV = nRT é um exemplo muito básico. No mundo real, existem funções mais complicadas que não são comumente conhecidas e tendem a ser longas e complicadas. Portanto, mesmo que a pessoa seja treinada em campo, há uma boa chance de encontrar uma função totalmente alienígena.

4
@ Patrick87: Prefiro as letras, porque posso verificar rapidamente a veracidade da expressão olhando para o papel de origem (ou de memória), pois está muito mais próximo da forma original.

2
+1. Essa é a melhor maneira de fazer isso. Mesmo equações físicas bastante elementares podem usar letras gregas, raízes, derivadas parciais, operadores (Laplace, Hamilton), vetores, tensores, etc., de modo que geralmente não é possível representar a equação de forma legível nos comentários. Aderir aos nomes / abreviações de variáveis ​​o mais padrão possível (por exemplo, nãoGAS_CONSTANT é um nome de variável padrão; todos os livros que conheço usa para isso) e explicá-los brevemente nos comentários é a melhor coisa que pode ser feita. R
Joonas Pulakka

7

Apenas jogando lá fora, você tem outra opção:

Volume ComputeVolume(Pressure p, Moles m, Temperature t) { ... }

Isso é um pouco semelhante ao que o F # faz com as unidades de medida e tem o benefício de evitar problemas como substituir inadvertidamente uma pressão por uma temperatura. É difícil observar como devem ser os argumentos quando a assinatura é (duplo, duplo, duplo)


Só para deixar claro, existem linguagens por aí que podem fazer esse tipo de análise dimensional? Ou seja, que sabem, por exemplo, que o produto entre uma pressão e um volume pode ser atribuído a uma unidade de energia?
Lindelof

Sim, o F # faz isso, com unidades de medida. msdn.microsoft.com/pt-BR/library/dd233243.aspx
Mathias

Mesmo sem suporte para conversão automática entre unidades, pode ser benéfico definir tipos dedicados para determinadas unidades, como uma classe Money. Ele limita erros inadvertidos de atribuição e conversão de variáveis ​​e ajuda na refatoração.
Mathias

Isso pode ser feito de maneira muito robusta com modelos C ++.
kevin Cline

@lindelof: Pode conseguir alguma desta funcionalidade com C ++typedef
Jacob

7

Eu prefiro isso:

/* This function calculates volume using the following formula:
 *
 *     n * R * T
 * v = ---------
 *         P
 */
double volume(double pressure, double n_moles, double temperature) {
    return n_moles * BOLTZMANN_CONSTANT * temperature / pressure;
}

Em outras palavras, explique o significado do código no comentário em inglês (e matemática; são comentários, você pode expandi-lo o quanto for necessário), mas use nomes de variáveis ​​descritivos para que qualquer pessoa que esteja lendo o único código ainda possa compreender facilmente - especialmente com funções maiores. Outra razão pela qual eu usaria palavras reais como nomes de variáveis ​​é que a interface é muito mais clara se você precisar copiar a declaração da função em um arquivo de cabeçalho.


2
Além disso, seria bom no comentário incluir um link para algum lugar na Internet que fale sobre a fórmula (por exemplo: en.wikipedia.org/wiki/Ideal_gas_law ).
Chris Shaffer

Esta é uma abordagem muito agradável, mas um pouco confusa. Talvez eu prefira apenas ver um link para, por exemplo, a Wikipedia descrevendo (neste caso) a lei dos gases ideais.
Patrick87

3

IMHO é sempre melhor usar a notação estabelecida do domínio do problema em que você está trabalhando, se a função for muito específica do domínio. Alguém que não entende o domínio do problema não tem chance de manter seu código com êxito e, para alguém que esteja familiarizado com o domínio, os nomes longos serão apenas ruído e mais digitação para você.

OTHO, direi que gostaria que a notação matemática convencional fosse mais detalhada e descritiva às vezes, mas, independentemente disso, acho que o código matemático deve seguir a convenção matemática.

Editar: Esta resposta se aplica somente se houver uma convenção muito forte sobre notação ao escrever a fórmula matematicamente. Se não houver, e você teria que explicar o que as variáveis ​​representam em um comentário, mesmo assumindo que o leitor esteja familiarizado com o domínio, é melhor errar ao lado de uma convenção mais descritiva.


2

Opinião pura, mas sempre use as palavras sobre os símbolos de uma letra. Se você usar palavras, todos entenderão; se você usar símbolos, apenas os especialistas no assunto são garantidos. Mesmo assim, algumas pessoas usam símbolos diferentes para as mesmas quantidades físicas. Você não tem nada a perder usando os nomes mais longos.


2

Sua preocupação deve ser a clareza e a correção (o código incorreto, mas claro, é facilmente corrigido); portanto, sua função deve ser escrita para manutenção por um codificador genérico, na medida do possível. Os comentários do cabeçalho da função devem explicar a fórmula e seu uso e descrever parâmetros de entrada / saída. Posteriormente, como o corpo da função é disposto não deve importar muito, desde que seja consistente com os comentários do cabeçalho.

(Eu sei que isso não é uma discussão, mas - minha preferência pessoal seria atribuir nomes explícitos às variáveis, embora, neste caso, uma linha única seja suficiente, pois é uma função 'pura'; uma chamada com os mesmos parâmetros produziria o mesmo sempre para que não exista complexidade relacionada ao estado que exija explicação)

  • Em outras linguagens que suportam análise dimensional, isso pode ser implementado, por exemplo, em C ++ com modelos, a biblioteca Boost Units usa essa abordagem, acredito.

1

Depende de quão "distante" da camada de negócios o código está ... Quanto mais o código estiver na pilha, mais ele será direcionado para a função matemática abstrata que implementa, mais eu tentaria emular o código geralmente aceito. notação matematica e convenções de nomenclatura. Quanto mais próximo do front end ou da camada de negócios, mais eu me conformaria às convenções estabelecidas no domínio do problema.


1

Eu gosto de pensar dessa maneira - os matemáticos erraram com variáveis ​​curtas e os físicos seguiram o exemplo. Por que repetir o erro deles? Agora sabemos que nomes mais longos são mais descritivos e produzem menos confusão, então fique com a melhoria. Em uma nota mais leve, às vezes tento colocar variáveis ​​mais longas em minhas contas, nas quais todos ficam horrorizados.


Você vai adorar isso ...

0

O formato correto para uma equação de programação é aquele que você ainda entende depois de não vê-lo há seis meses.

Se você voltar para:

n*R*T/P;

E você reconhece o que está acontecendo, então provavelmente está bem. Normalmente, para fórmulas avançadas, não me lembrarei do que era cada parte, a menos que eu a esteja usando ativamente. Para mim:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

é um formato de equação muito melhor especificamente, porque eu posso entender facilmente cada parte, mesmo que eu não saiba necessariamente por que a equação está escrita como está.


Você acha energy_in_joules = mass_in_kilograms * pow (speed_of_light_in_vacumm_in_metres-per_second, 2) é mais fácil do que E = mc ^ 2
Martin Beckett

@ Martin Beckett, você realmente leu o que eu postei? "Normalmente, para formulários avançados, não me lembrarei do que cada parte era, a menos que eu a esteja usando ativamente." Não disse que esqueceria as equações que conseguiram se levar ao conhecimento público. Em casos como E=m*(c^2)eu vou entender isso em seis meses.
precisa saber é o seguinte

para equações clássicas conhecidas, é melhor usar a notação normal para que as pessoas possam identificá-la. Mesmo ao ponto de nomear variáveis theta ou phi se isso é o que é usado no domínio
Martin Beckett

-1

Atire a moeda.

Às vezes, você também gasta mais tempo pensando em como nomear uma variável do que na própria codificação?


6
Sim, normalmente passo mais tempo projetando meu código do que codificando-o e começa com a compreensão do problema e a nomeação correta das coisas.
Mathias
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.