¿Deberían las funciones 'matemáticas' seguir la notación matemática?

11

Supongo que esta pregunta se marcará de inmediato como subjetiva, pero ¿cuál crees que es mejor?

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

o

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

En otras palabras, ¿deberían las funciones que implementan alguna ecuación seguir la notación de esa ecuación, o deberían usar nombres más detallados?

lindelof
fuente
3
¿A veces también pasa más tiempo pensando en cómo nombrar una variable de lo que gasta en la codificación en sí? ;-)
Tomás
1
Creo que la segunda alternativa está bien. Sin embargo, explicaría las variables en un comentario.
Giorgio
Parece que a alguien le pareció adecuado revisar y votar negativamente las respuestas de todos. ¿Le importaría a esta persona compartir su razón para hacerlo? Las respuestas me parecieron perfectamente razonables.
Técnicamente, esto no tiene nada que ver con la notación 'matemática' y todo lo que tiene que ver con lo que pensaría un físico. No hay nada más que aritmética pasando aquí.
duffymo
2
Puedo ver a todos los estadounidenses pasando la temperatura en Fahrenheit. Definitivamente no usaría el doble como tipo de temperatura. Lo mismo probablemente se aplica a la presión. Creo que estaría más interesado en obtener los tipos seguros que los nombres.
Martin York

Respuestas:

14

Depende de quién lo lea. Si puede garantizar que por toda la eternidad, el próximo programador que lea su código también esté familiarizado con la termodinámica, entonces sí, elija la versión truncada.

Mi estilo personal es usar tales variables (cuyas abreviaturas se conocen comúnmente en el campo), pero incluir su descripción en los comentarios.

/* 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;
}
Jacob
fuente
55
¿Cuál es el punto de? Alguien que no entienda la termodinámica no tiene posibilidades de mantener con éxito el código sin importar cuáles sean los nombres de las variables.
dsimcha
Esto es ciertamente mejor que no incluir la información, pero en este punto, parece que sería más fácil usar esos nombres en la función. No veo mucha utilidad en el uso de las letras ...
Patrick87
@dsmicha: Sí, PV = nRT es un ejemplo muy básico. En el mundo real, existen funciones más complicadas que no se conocen comúnmente y tienden a ser largas y complicadas. Entonces, incluso si la persona está entrenada en el campo, hay una buena posibilidad de que se encuentre con una función que sea totalmente ajena.
44
@ Patrick87: Prefiero las letras porque puedo comprobar rápidamente la veracidad de la expresión mirando el papel del que proviene (o de la memoria) ya que está mucho más cerca de la forma original.
2
+1. Esta es la mejor manera de hacerlo. Incluso las ecuaciones de física bastante elementales pueden usar letras griegas, raíces, derivadas parciales, operadores (Laplace, Hamilton), vectores, tensores, etc., por lo que generalmente no es posible representar la ecuación de manera legible en los comentarios. Cumplir con nombres / abreviaturas de variables tan estándar como sea posible (por ejemplo, noGAS_CONSTANT es un nombre de variable estándar; cada libro de texto que conozco tiene usos para eso) y explicarlos brevemente en los comentarios es lo mejor que se puede hacer. R
Joonas Pulakka
7

Solo arrojándolo, tienes otra opción:

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

Esto es algo similar a lo que F # hace con unidades de medida, y tiene el beneficio de evitar problemas como reemplazar inadvertidamente una presión por una temperatura. Es difícil observar qué argumentos deberían ir cuando la firma es como (doble, doble, doble)

Mathias
fuente
Solo para aclarar, ¿existen idiomas que puedan hacer ese tipo de análisis dimensional? Es decir, ¿sabe que, por ejemplo, que el producto entre una Presión y un Volumen puede asignarse a una unidad de Energía?
lindelof
Sí, F # hace esto, con unidades de medida. msdn.microsoft.com/en-us/library/dd233243.aspx
Mathias
Incluso sin soporte para la conversión automática entre unidades, puede ser beneficioso definir tipos dedicados para ciertas unidades, como una clase Money. Limita errores involuntarios de asignación y conversión de variables, y ayuda con la refactorización.
Mathias
Esto se puede hacer de manera muy robusta con las plantillas de C ++.
Kevin Cline
@lindelof: Puede lograr algo de esta funcionalidad con C ++typedef
Jacob
7

Prefiero esto:

/* 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;
}

En otras palabras, explique el significado del código en el comentario en inglés (y matemáticas; son comentarios, puede ampliarlo tanto como sea necesario), pero use nombres de variables descriptivas para que cualquiera que lea el único código aún pueda comprender es fácil, especialmente con funciones más grandes. Otra razón por la que usaría palabras reales como nombres de variables es que la interfaz es mucho más clara si necesita copiar la declaración de función en un archivo de encabezado.


fuente
2
Además, sería bueno en el comentario incluir un enlace a algún lugar en Internet que habla sobre la fórmula (por ejemplo: en.wikipedia.org/wiki/Ideal_gas_law ).
Chris Shaffer
Este es un enfoque muy agradable, pero un poco desordenado. Podría preferir solo ver un enlace a, por ejemplo, Wikipedia que describe (en este caso) la ley de los gases ideales.
Patrick87
3

En mi humilde opinión, siempre es mejor usar la notación establecida del dominio del problema en el que estás trabajando si la función es muy específica del dominio. Alguien que no entienda el dominio del problema no tiene ninguna posibilidad de mantener con éxito su código de todos modos, y para alguien que esté familiarizado con el dominio, los nombres largos serán solo ruido, además de escribir más para usted.

OTHO, diré que desearía que la notación matemática convencional fuera más detallada y descriptiva a veces, pero independientemente creo que el código matemático debería apegarse a la convención matemática.

Editar: esta respuesta se aplica solo si hay una convención muy fuerte sobre notación al escribir la fórmula matemáticamente. Si no hay ninguno, y tendría que explicar qué representan las variables en un comentario incluso suponiendo que el lector esté familiarizado con el dominio, entonces es mejor errar al lado de una convención más descriptiva.

dsimcha
fuente
2

Opinión pura, pero siempre use las palabras sobre los símbolos de una letra. Si usa palabras, todos lo entenderán; Si utiliza símbolos, solo los expertos en la materia tienen la garantía de seguirlo. Incluso entonces, algunas personas usan símbolos diferentes para las mismas cantidades físicas. No tiene nada que perder usando los nombres más largos.

Patrick87
fuente
2

Su preocupación debe ser la claridad y la corrección (el código incorrecto pero claro se corrige fácilmente), por lo tanto, su función debe ser escrita para que un codificador genérico la pueda mantener en la medida de lo posible. Los comentarios del encabezado de la función deben explicar la fórmula y su uso y describir los parámetros de entrada / salida. A partir de entonces, la disposición del cuerpo de la función no debería importar demasiado, siempre que sea coherente con los comentarios del encabezado.

(Sé que esto no es una discusión, pero mi preferencia personal sería dar nombres explícitos a los objetos valiosos, aunque en este caso podría bastar una frase ya que es una función 'pura'; una llamada con los mismos parámetros produciría el mismo resultado siempre, por lo que no debería haber complejidad relacionada con el estado que requiera explicación)

  • En otros lenguajes que admiten análisis dimensionales, esto se puede implementar, por ejemplo, en C ++ con plantillas, la biblioteca Boost Units utiliza este enfoque, creo.

fuente
1

Depende de cuán "lejos" de la capa empresarial esté el código ... Cuanto más atrás esté en la pila el código, cuanto más dirigido esté hacia la función matemática abstracta se implementa, más trataría de emular lo generalmente aceptado Notación matemática y convenciones de nomenclatura. Cuanto más cerca del front-end o de la capa empresarial, más me conformaría con las convenciones establecidas en el dominio del problema.

Charles Bretana
fuente
1

Me gusta pensar de esta manera: los matemáticos se equivocaron con variables cortas y los físicos hicieron lo mismo. ¿Por qué repetir su error? Ahora sabemos que los nombres más largos son más descriptivos y producen menos confusión, por lo que debemos seguir mejorando. En una nota más ligera, a veces trato de introducir variables más largas en mis matemáticas, con lo cual todos están horrorizados.

Gleno
fuente
Te va a encantar esto ...
0

El formato correcto para una ecuación de programación es uno que todavía entiendes después de no haberlo visto durante seis meses.

Si vuelves a:

n*R*T/P;

Y reconoces lo que está sucediendo, entonces probablemente esté bien. Por lo general, para fórmulas avanzadas, no recordaré qué era cada parte a menos que la esté usando activamente. Para mi:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

es un formato de ecuación mucho mejor específicamente porque puedo entender fácilmente cada parte, incluso si no necesariamente sé por qué la ecuación está escrita tal como está.

zzzzBov
fuente
Cree que energy_in_joules = mass_in_kilograms * pow (speed_of_light_in_vacumm_in_metres-per_second, 2) es más fácil que E = mc ^ 2
Martin Beckett
@ Martin Beckett, ¿realmente leíste lo que publiqué? "Por lo general, para los formularios avanzados no recordaré qué era cada parte a menos que la esté usando activamente". No dije que olvidaría las ecuaciones que han logrado introducirse en el conocimiento público. En casos como E=m*(c^2)me voy a entenderlo en seis meses.
zzzzBov
para ecuaciones clásicas bien conocidas es mejor usar la notación normal para que las personas puedan detectarla. Incluso en la medida de nombrar variables theta o phi si eso es lo que se usa en el dominio
Martin Beckett
-1

Lanza la moneda.

¿A veces también pasa más tiempo pensando en cómo nombrar una variable de lo que gasta en la codificación en sí?

Tomás
fuente
66
Sí, normalmente paso más tiempo diseñando mi código que codificándolo, y comienza por comprender el problema y nombrar las cosas correctamente.
Mathias