Sollten 'mathematische' Funktionen der mathematischen Notation folgen?

11

Ich nehme an, diese Frage wird sofort als subjektiv gekennzeichnet, aber was ist Ihrer Meinung nach besser:

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

oder

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

Mit anderen Worten, sollten Funktionen, die eine Gleichung implementieren, der Notation dieser Gleichung folgen, oder sollten sie ausführlichere Namen verwenden?

Lindelof
quelle
3
Verbringen Sie manchmal auch mehr Zeit damit, über das Benennen einer Variablen nachzudenken, als Sie für die Codierung selbst aufwenden? ;-)
Tomas
1
Ich denke, die zweite Alternative ist in Ordnung. Ich würde die Variablen jedoch in einem Kommentar erklären.
Giorgio
Es sieht so aus, als hätte jemand es für angebracht gehalten, die Antworten aller durchzugehen und abzustimmen. Würde diese Person gerne ihren Grund dafür mitteilen? Die Antworten schienen mir völlig vernünftig.
Technisch hat dies nichts mit 'mathematischer' Notation zu tun und alles damit, was ein Physiker denken würde. Hier geht es nur um Rechnen.
Duffymo
2
Ich kann alle Amerikaner sehen, die die Temperatur in Fahrenheit überschreiten. Ich würde definitiv nicht doppelt als Typ für die Temperatur verwenden. Gleiches gilt wahrscheinlich für Druck. Ich denke, ich wäre mehr daran interessiert, die Typen sicherer zu machen als die Namen.
Martin York

Antworten:

14

Kommt darauf an, wer es liest. Wenn Sie garantieren können, dass der nächste Programmierer, der Ihren Code liest, für alle Ewigkeit auch mit der Thermodynamik vertraut ist, dann entscheiden Sie sich für die abgeschnittene Version.

Mein persönlicher Stil ist es, solche Variablen zu verwenden (deren Abkürzungen im Feld allgemein bekannt sind), ihre Beschreibung jedoch in Kommentare aufzunehmen.

/* 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;
}
Jakob
quelle
5
Was ist der Sinn? Jemand, der die Thermodynamik nicht beherrscht, hat keine Chance, den Code erfolgreich zu pflegen, unabhängig von den Variablennamen.
Dsimcha
Dies ist sicherlich besser, als die Informationen nicht einzuschließen, aber an diesem Punkt scheint es einfacher zu sein, nur diese Namen in der Funktion zu verwenden. Ich sehe nicht viel Nützlichkeit in der Verwendung der Buchstaben ...
Patrick87
@dsmicha: Ja, PV = nRT ist ein sehr einfaches Beispiel. In der realen Welt existieren kompliziertere Funktionen, die nicht allgemein bekannt sind und dazu neigen, lang und verworren zu sein. Selbst wenn die Person auf dem Gebiet ausgebildet ist, besteht eine gute Chance, dass sie auf eine völlig fremde Funktion stößt.
4
@ Patrick87: Ich bevorzuge die Buchstaben, weil ich die Richtigkeit des Ausdrucks schnell überprüfen kann, indem ich mir das Papier ansehe, aus dem es stammt (oder aus dem Gedächtnis), da es der ursprünglichen Form viel näher kommt.
2
+1. Dies ist der beste Weg, dies zu tun. Selbst ziemlich elementare physikalische Gleichungen können griechische Buchstaben, Wurzeln, partielle Ableitungen, Operatoren (Laplace, Hamilton), Vektoren, Tensoren usw. verwenden, so dass es im Allgemeinen nicht möglich ist, die Gleichung in Kommentaren leserlich darzustellen. Das Festhalten an als-Standard-als-möglich Variablennamen / Abkürzungen (zB GAS_CONSTANTist nicht ein Standard - Variablennamen, jedes Lehrbuch Ich weiß von Anwendungen Rfür diese) und erklären , sie kurz in den Kommentaren ist das Beste , was getan werden kann.
Joonas Pulakka
7

Wenn Sie es einfach rauswerfen, haben Sie eine andere Möglichkeit:

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

Dies ähnelt in etwa dem, was F # mit Maßeinheiten macht, und hat den Vorteil, dass Probleme wie das versehentliche Ersetzen eines Drucks durch eine Temperatur vermieden werden. Es ist schwierig zu überlegen, welche Argumente wohin gehen sollen, wenn die Signatur so ist (doppelt, doppelt, doppelt).

Mathias
quelle
Gibt es Sprachen, die diese Art der Dimensionsanalyse durchführen können? Das heißt, dass zum Beispiel, dass das Produkt zwischen einem Druck und einem Volumen einer Energieeinheit zugeordnet werden kann?
Lindelof
Ja, F # macht das mit Maßeinheiten. msdn.microsoft.com/en-us/library/dd233243.aspx
Mathias
Auch ohne Unterstützung für die automatische Konvertierung zwischen Einheiten kann es hilfreich sein, dedizierte Typen für bestimmte Einheiten zu definieren, z. B. eine Money-Klasse. Es begrenzt versehentliche Zuweisungs- und Konvertierungsfehler von Variablen und hilft beim Refactoring.
Mathias
Dies kann mit C ++ - Vorlagen sehr robust durchgeführt werden.
Kevin Cline
@ Lindelof: Sie können einige dieser Funktionen mit C ++typedef
Jacob
7

Ich bevorzuge das:

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

Mit anderen Worten, erklären Sie die Bedeutung des Codes im Kommentar auf Englisch (und Mathematik; es sind Kommentare, Sie können ihn so weit wie nötig erweitern), aber verwenden Sie beschreibende Variablennamen, damit jeder, der den einzigen Code liest, ihn noch verstehen kann es leicht - vor allem bei größeren Funktionen. Ein weiterer Grund, warum ich echte Wörter als Variablennamen verwenden würde, ist, dass die Schnittstelle viel klarer ist, wenn Sie die Funktionsdeklaration in eine Header-Datei kopieren müssen.


quelle
2
Außerdem wäre es schön, wenn der Kommentar einen Link zu einer Stelle im Internet enthält, die über die Formel spricht (z . B. en.wikipedia.org/wiki/Ideal_gas_law ).
Chris Shaffer
Dies ist ein sehr schöner Ansatz, aber ein wenig chaotisch. Ich würde es vielleicht vorziehen, nur einen Link zu Wikipedia zu sehen, der (in diesem Fall) das ideale Gasgesetz beschreibt.
Patrick87
3

IMHO ist es immer besser, die etablierte Notation der Problemdomäne zu verwenden, in der Sie arbeiten, wenn die Funktion sehr domänenspezifisch ist. Jemand, der die Problemdomäne nicht versteht, hat ohnehin keine Chance, Ihren Code erfolgreich zu verwalten, und für jemanden, der mit der Domäne vertraut ist, sind die langen Namen nur Rauschen und mehr Eingabe für Sie.

OTHO, ich werde sagen, dass ich wünschte, die konventionelle mathematische Notation wäre manchmal ausführlicher und beschreibender, aber unabhängig davon denke ich, dass mathematischer Code sich an mathematische Konventionen halten sollte.

Bearbeiten: Diese Antwort gilt nur, wenn beim mathematischen Schreiben der Formel eine sehr starke Konvention zur Notation besteht. Wenn es keine gibt und Sie erklären müssen, was die Variablen in einem Kommentar darstellen, selbst wenn der Leser mit der Domäne vertraut ist, ist es am besten, sich auf die Seite einer aussagekräftigeren Konvention zu stellen.

Dsimcha
quelle
2

Reine Meinung, aber immer die Wörter über den Einbuchstaben verwenden. Wenn Sie Wörter verwenden, wird jeder verstehen; Wenn Sie Symbole verwenden, werden garantiert nur Fachexperten folgen. Selbst dann verwenden manche Menschen unterschiedliche Symbole für die gleichen physikalischen Größen. Sie haben nichts zu verlieren, wenn Sie die längeren Namen verwenden.

Patrick87
quelle
2

Ihr Anliegen sollte Klarheit und dann Korrektheit sein (falscher, aber klarer Code lässt sich leicht korrigieren). Daher sollte Ihre Funktion so geschrieben werden, dass sie von einem generischen Codierer so weit wie möglich gewartet werden kann. Die Funktionsheaderkommentare sollten die Formel und ihre Verwendung erläutern und In / Out-Parameter beschreiben. Danach sollte es nicht allzu wichtig sein, wie der Funktionskörper angeordnet ist, solange er mit den Header-Kommentaren übereinstimmt.

(Ich weiß, dass dies keine Diskussion ist, aber - meine persönliche Präferenz wäre es, den Variablen explizite Namen zu geben, obwohl in diesem Fall ein Einzeiler ausreichen könnte, da es sich um eine 'reine' Funktion handelt; ein Aufruf mit denselben Parametern würde dasselbe ergeben Ergebnis immer, damit es keine zustandsbezogene Komplexität gibt, die einer Erklärung bedarf)

  • Für andere Sprachen, die die Dimensionsanalyse unterstützen, kann dies beispielsweise in C ++ mit Vorlagen implementiert werden. Die Boost Units-Bibliothek verwendet diesen Ansatz, glaube ich.

quelle
1

Hängt davon ab, wie "weit entfernt" der Code von der Geschäftsschicht entfernt ist ... Je weiter der Code im Stapel zurückliegt, desto gezielter ist er auf die abstrakte mathematische Funktion, die implementiert wird, desto mehr würde ich versuchen, die allgemein akzeptierte zu emulieren Konventionen für matehmatische Notation und Benennung. Je näher am Frontend oder an der Business-Schicht, desto mehr würde ich mich an die im Problembereich festgelegten Konventionen halten.

Charles Bretana
quelle
1

Ich sehe das gerne so - Mathematiker haben es mit kurzen Variablen falsch verstanden und Physiker folgten diesem Beispiel. Warum ihren Fehler wiederholen? Wir wissen jetzt, dass längere Namen aussagekräftiger sind und weniger Verwirrung stiften. Bleiben Sie also bei der Verbesserung. In einem leichteren Ton versuche ich manchmal, längere Variablen in meine Mathematik einzuschleusen, worüber alle entsetzt sind.

Gleno
quelle
Sie gehen zur Liebe dieses ...
0

Das richtige Format für eine Programmiergleichung ist eines, das Sie immer noch verstehen, nachdem Sie es sechs Monate lang nicht gesehen haben.

Wenn Sie zurückkommen zu:

n*R*T/P;

Und Sie erkennen, was los ist, dann ist es wahrscheinlich in Ordnung. Normalerweise erinnere ich mich bei fortgeschrittenen Formeln nicht daran, was jedes Teil war, es sei denn, ich verwende es aktiv. Für mich:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

ist ein viel besseres Gleichungsformat, insbesondere weil ich jeden Teil leicht verstehen kann, auch wenn ich nicht unbedingt weiß, warum die Gleichung so geschrieben ist, wie sie ist.

zzzzBov
quelle
Sie denken, energy_in_joules = mass_in_kilograms * pow (speed_of_light_in_vacumm_in_metres-per_second, 2) ist einfacher als E = mc ^ 2
Martin Beckett
@ Martin Beckett, hast du tatsächlich gelesen, was ich gepostet habe? "Normalerweise erinnere ich mich bei fortgeschrittenen Formeln nicht daran, was jedes Teil war, es sei denn, ich benutze es aktiv." Ich habe nicht gesagt, dass ich die Gleichungen vergessen würde, die es geschafft haben, sich öffentlich bekannt zu machen. In Fällen wie E=m*(c^2)ich werde es in sechs Monaten verstehen.
zzzzBov
Für bekannte klassische Gleichungen ist es besser, die normale Notation zu verwenden, damit die Leute sie erkennen können. Sogar in dem Maße, in dem Variablen Theta oder Phi benannt werden, wenn dies in der Domäne verwendet wird
Martin Beckett
-1

Wirf die Münze.

Verbringen Sie manchmal auch mehr Zeit damit, über das Benennen einer Variablen nachzudenken, als Sie für die Codierung selbst aufwenden?

Tomas
quelle
6
Ja, ich verbringe normalerweise mehr Zeit damit, meinen Code zu entwerfen als ihn zu codieren, und es beginnt damit, das Problem zu verstehen und die Dinge richtig zu benennen.
Mathias