Les fonctions «mathématiques» devraient-elles suivre la notation mathématique?


11

Je suppose que cette question sera immédiatement signalée comme subjective, mais laquelle pensez-vous est la meilleure:

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

En d'autres termes, les fonctions qui implémentent une équation devraient-elles suivre la notation de cette équation, ou devraient-elles utiliser des noms plus verbeux?


3
Pensez-vous également parfois à consacrer plus de temps à la façon de nommer une variable qu'à consacrer au codage lui-même? ;-)
Tomas

1
Je pense que la deuxième alternative est OK. Je voudrais cependant expliquer les variables dans un commentaire.
Giorgio

Il semble que quelqu'un ait jugé bon d'examiner et de voter contre les réponses de chacun. Cette personne voudrait-elle partager sa raison de le faire? Les réponses m'ont paru parfaitement raisonnables.

Techniquement, cela n'a rien à voir avec la notation «mathématique» et tout à voir avec ce que penserait un physicien. Il n'y a rien de plus que de l'arithmétique ici.
duffymo

2
Je peux voir tous les Américains passer la température à Fahrenheit. Je n'utiliserais certainement pas le double comme type de température. Il en va probablement de même pour la pression. Je pense que je serais plus intéressé à sécuriser les types que les noms.
Martin York

Réponses:


14

Cela dépend de qui le lit. Si vous pouvez garantir que pour toute l'éternité, le prochain programmeur qui lit votre code est également familier avec la thermodynamique, alors oui, optez pour la version tronquée.

Mon style personnel est d'utiliser de telles variables (dont les abréviations sont communément connues dans le domaine), mais d'inclure leur description dans les commentaires.

/* 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
À quoi ça sert? Quelqu'un qui ne tient pas la thermodynamique n'a aucune chance de réussir à maintenir le code, quels que soient les noms des variables.
dsimcha

C'est certainement mieux que de ne pas inclure les informations, mais à ce stade, il semble qu'il serait plus facile d'utiliser simplement ces noms dans la fonction. Je ne vois pas beaucoup d'utilité dans l'utilisation des lettres ...
Patrick87

@dsmicha: Oui, PV = nRT est un exemple très basique. Dans le monde réel, il existe des fonctions plus complexes qui ne sont pas communément connues et ont tendance à être longues et compliquées. Donc, même si la personne est formée sur le terrain, il y a de fortes chances qu'elle rencontre une fonction totalement étrangère.

4
@ Patrick87: Je préfère les lettres car je peux rapidement vérifier la véracité de l'expression en regardant le papier dont il provient (ou de mémoire) car il est beaucoup plus proche de la forme originale.

2
+1. C'est la meilleure façon de procéder. Même les équations de physique assez élémentaires peuvent utiliser des lettres grecques, des racines, des dérivées partielles, des opérateurs (Laplace, Hamilton), des vecteurs, des tenseurs, etc. de sorte qu'il n'est généralement pas possible de représenter l'équation de manière lisible dans les commentaires. S'en tenir à des noms de variables / abréviations aussi standard que possible (par exemple, ce GAS_CONSTANTn'est pas un nom de variable standard; tous les manuels que je connais Rà ce sujet) et les expliquer brièvement dans les commentaires est la meilleure chose qui puisse être faite.
Joonas Pulakka

7

Juste en le jetant, vous avez une autre option:

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

Ceci est quelque peu similaire à ce que F # fait avec les unités de mesure et a l'avantage d'éviter des problèmes comme le remplacement par inadvertance d'une pression par une température. Il est difficile de voir quels arguments devraient aller là où la signature est (double, double, double)


Juste pour être clair, y a-t-il des langues qui peuvent faire ce genre d'analyse dimensionnelle? C'est-à-dire que l'on sait par exemple que le produit entre une pression et un volume peut être affecté à une unité d'énergie?
lindelof

Oui, F # le fait, avec des unités de mesure. msdn.microsoft.com/en-us/library/dd233243.aspx
Mathias

Même sans prise en charge de la conversion automatique entre les unités, il peut être avantageux de définir des types dédiés pour certaines unités, comme une classe Money. Il limite les erreurs d'affectation et de conversion de variables par inadvertance et aide à la refactorisation.
Mathias

Cela peut être fait de manière très robuste avec des modèles C ++.
kevin cline

@lindelof: Vous pouvez obtenir certaines de ces fonctionnalités avec C ++typedef
Jacob

7

Je préfère ça:

/* 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 d'autres termes, expliquez la signification du code dans le commentaire en anglais (et en mathématiques; ce sont des commentaires, vous pouvez les développer autant que nécessaire), mais utilisez des noms de variables descriptives pour que toute personne lisant le seul code puisse toujours comprendre facilement - en particulier avec des fonctions plus importantes. Une autre raison pour laquelle j'utiliserais de vrais mots comme noms de variable est que l'interface est beaucoup plus claire si vous devez copier la déclaration de fonction dans un fichier d'en-tête.


2
De plus, ce serait bien dans le commentaire d'inclure un lien vers quelque part sur Internet qui parle de la formule (par exemple: en.wikipedia.org/wiki/Ideal_gas_law ).
Chris Shaffer

C'est une très belle approche, mais un peu désordonnée. Je préférerais peut-être simplement voir un lien vers par exemple Wikipedia décrivant (dans ce cas) la loi du gaz idéal.
Patrick87

3

À mon humble avis, il est toujours préférable d'utiliser la notation établie du domaine problématique dans lequel vous travaillez si la fonction est très spécifique au domaine. Quelqu'un qui ne comprend pas le domaine problématique n'a aucune chance de réussir à maintenir votre code de toute façon, et pour quelqu'un qui connaît le domaine, les noms longs seront juste du bruit, ainsi que plus de frappe pour vous.

OTHO, je dirai que je souhaite que la notation mathématique conventionnelle soit parfois plus verbeuse et descriptive, mais je pense que le code mathématique devrait s'en tenir à la convention mathématique.

Edit: Cette réponse ne s'applique que s'il existe une convention très forte sur la notation lors de l'écriture mathématique de la formule. S'il n'y en a pas, et que vous devrez expliquer ce que les variables représentent dans un commentaire même en supposant que le lecteur est familier avec le domaine, alors il est préférable de pécher par excès de convention plus descriptive.


2

Opinion pure, mais utilisez toujours les mots sur les symboles d'une seule lettre. Si vous utilisez des mots, tout le monde comprendra; si vous utilisez des symboles, seuls les experts en la matière sont garantis de suivre. Même alors, certaines personnes utilisent des symboles différents pour les mêmes quantités physiques. Vous n'avez rien à perdre en utilisant des noms plus longs.


2

Votre souci doit être la clarté puis la justesse (un code incorrect mais clair est facilement corrigé) donc votre fonction doit être écrite pour être maintenable par un codeur générique autant que possible. Les commentaires d'en-tête de fonction doivent expliquer la formule et son utilisation et décrire les paramètres d'entrée / sortie. Par la suite, la disposition du corps de la fonction ne devrait pas trop d'importance tant qu'il est cohérent avec les commentaires d'en-tête.

(Je sais que ce n'est pas une discussion, mais - ma préférence personnelle serait de donner des noms explicites aux variables bien que dans ce cas, une ligne puisse suffire car c'est une fonction `` pure ''; un appel avec les mêmes paramètres donnerait le même toujours donc il ne devrait pas y avoir de complexité liée à l'état nécessitant une explication

  • Concernant d'autres langages supportant l'analyse dimensionnelle, cela peut être implémenté par exemple en C ++ avec des modèles, la bibliothèque Boost Units utilise cette approche je crois.

1

Cela dépend de la façon dont le code est "loin" de la couche métier ... Le furthur est de retour dans la pile du code, plus il est ciblé vers la fonction mathématique abstraite est implémenté, plus j'essaierais d'émuler le généralement accepté Notation mathmatique et conventions de dénomination. Plus le front-end ou la couche métier sont proches, plus je suis conforme aux conventions établies dans le domaine problématique.


1

J'aime y penser de cette façon - les mathématiciens se sont trompés avec des variables courtes et les physiciens ont emboîté le pas. Pourquoi répéter leur erreur? Nous savons maintenant que les noms plus longs sont plus descriptifs et produisent moins de confusion, alors restez avec l'amélioration. Sur une note plus légère, j'essaie parfois d'intégrer des variables plus longues dans mes calculs, ce qui consterne tout le monde.


Vous allez adorer ça ...

0

Le format correct pour une équation de programmation est celui que vous comprenez toujours après ne l'avoir pas vu pendant six mois.

Si vous revenez à:

n*R*T/P;

Et vous reconnaissez ce qui se passe, alors c'est très bien. Généralement, pour les formules avancées, je ne me souviens pas de ce qu'était chaque partie, sauf si je l'utilise activement. Pour moi:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

est un format d'équation bien meilleur spécifiquement parce que je peux facilement comprendre chaque partie, même si je ne sais pas nécessairement pourquoi l'équation est écrite telle quelle.


Vous pensez que energy_in_joules = mass_in_kilograms * pow (speed_of_light_in_vacumm_in_metres-per_second, 2) est plus facile que E = mc ^ 2
Martin Beckett

@Martin Beckett, avez-vous réellement lu ce que j'ai publié? "Généralement, pour les formulaires avancés, je ne me souviens pas de ce qu'était chaque pièce à moins que je ne l'utilise activement." Je n'ai pas dit que j'oublierais les équations qui ont réussi à se faire connaître du public. Dans des cas comme E=m*(c^2)je le comprendrai dans six mois.
zzzzBov

pour les équations classiques bien connues, il est préférable d'utiliser la notation normale afin que les gens puissent la repérer. Même dans la mesure où l'on nomme les variables thêta ou phi si c'est ce qui est utilisé dans le domaine
Martin Beckett

-1

Lancez la pièce.

Pensez-vous également parfois à consacrer plus de temps à la façon de nommer une variable qu'à consacrer au codage lui-même?


6
Oui, je passe généralement plus de temps à concevoir mon code qu'à le coder, et cela commence par comprendre le problème et nommer les choses correctement.
Mathias
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.