Le funzioni "matematiche" dovrebbero seguire la notazione matematica?


11

Suppongo che questa domanda verrà immediatamente contrassegnata come soggettiva, ma quale pensi sia meglio:

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

In altre parole, le funzioni che implementano alcune equazioni dovrebbero seguire la notazione di quella equazione o dovrebbero usare nomi più dettagliati?


3
A volte passi anche più tempo a pensare a come nominare una variabile che a spendere per la codifica stessa? ;-)
Tomas,

1
Penso che la seconda alternativa sia OK. Spiegherei le variabili in un commento però.
Giorgio,

Sembra che qualcuno abbia ritenuto opportuno passare in rassegna e sottovalutare le risposte di tutti. A questa persona piacerebbe condividere le sue ragioni per farlo? Le risposte mi sembravano perfettamente ragionevoli.

Tecnicamente, questo non ha nulla a che fare con la notazione "matematica" e tutto a che fare con ciò che un fisico penserebbe. Non c'è nient'altro che l'aritmetica in corso qui.
Duffymo,

2
Riesco a vedere tutti gli americani che passano la temperatura in Fahrenheit. Non userei sicuramente il doppio come tipo per la temperatura. Lo stesso vale probabilmente per la pressione. Penso che sarei più interessato a rendere sicuri i tipi rispetto ai nomi.
Martin York,

Risposte:


14

Dipende da chi lo sta leggendo. Se puoi garantirlo per tutta l'eternità, il prossimo programmatore che legge il tuo codice ha anche familiarità con la termodinamica, quindi sì, scegli la versione troncata.

Il mio stile personale è quello di utilizzare tali variabili (le cui abbreviazioni sono comunemente note nel campo), ma includere la loro descrizione nei commenti.

/* 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 e il punto? Chi non conosce la termodinamica non ha alcuna possibilità di mantenere con successo il codice indipendentemente dai nomi delle variabili.
dsimcha,

Questo è sicuramente meglio che non includere le informazioni, ma a questo punto, sembra che sarebbe più semplice usare solo quei nomi nella funzione. Non vedo molta utilità nell'usare le lettere ...
Patrick87

@dsmicha: Sì, PV = nRT è un esempio molto semplice. Nel mondo reale, esistono funzioni più complicate che non sono comunemente conosciute e tendono ad essere lunghe e contorte. Quindi, anche se la persona è addestrata sul campo, ci sono buone probabilità che incontrerà una funzione totalmente aliena.

4
@ Patrick87: preferisco le lettere perché posso verificare rapidamente la veridicità dell'espressione guardando il foglio da cui proviene (o dalla memoria) poiché è molto più vicino alla forma originale.

2
+1. Questo è il modo migliore per farlo. Anche equazioni di fisica abbastanza elementari possono usare lettere greche, radici, derivate parziali, operatori (Laplace, Hamilton), vettori, tensori, ecc. In modo che generalmente non sia possibile rappresentare legalmente l'equazione nei commenti. Attenersi a nomi / abbreviazioni delle variabili il più possibile standard (ad es. NonGAS_CONSTANT è un nome di variabile standard; ogni libro di testo che conosco lo utilizza ) e spiegarli brevemente nei commenti è la cosa migliore che si possa fare. R
Joonas Pulakka,

7

Basta lanciarlo là fuori, hai un'altra opzione:

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

Questo è in qualche modo simile a quello che fa F # con le unità di misura e ha il vantaggio di evitare problemi come la sostituzione involontaria di una pressione con una temperatura. È difficile capire quali argomenti dovrebbero andare quando la firma è simile (doppia, doppia, doppia)


Giusto per chiarire, ci sono lingue là fuori che possono fare quel tipo di analisi dimensionale? Vale a dire che, ad esempio, che il prodotto tra una pressione e un volume può essere assegnato a un'unità di energia?
Lindelof

Sì, F # fa questo, con le unità di misura. msdn.microsoft.com/en-us/library/dd233243.aspx
Mathias

Anche senza il supporto per la conversione automatica tra unità, può essere utile definire tipi dedicati per determinate unità, come una classe Money. Limita gli errori involontari di assegnazione e conversione delle variabili e aiuta il refactoring.
Mathias,

Questo può essere fatto in modo molto efficace con i modelli C ++.
Kevin Cline,

@lindelof: puoi ottenere alcune di queste funzionalità con C ++typedef
Jacob

7

Preferisco questo:

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

In altre parole, spiega il significato del codice nel commento in inglese (e in matematica; sono i commenti, puoi espanderlo quanto basta), ma usa nomi di variabili descrittivi in ​​modo che chiunque legga l'unico codice sia ancora in grado di comprendere facilmente - specialmente con funzioni più grandi. Un altro motivo per cui userei parole reali come nomi di variabili è che l'interfaccia è molto più chiara se è necessario copiare la dichiarazione di funzione in un file di intestazione.


2
Inoltre, sarebbe bello nel commento includere un link da qualche parte su Internet che parla della formula (ad esempio: en.wikipedia.org/wiki/Ideal_gas_law ).
Chris Shaffer,

Questo è un approccio molto carino, ma un po 'disordinato. Potrei preferire solo vedere un link ad esempio Wikipedia che descrive (in questo caso) la legge del gas ideale.
Patrick87,

3

IMHO è sempre meglio usare la notazione stabilita del dominio problematico in cui stai lavorando se la funzione è molto specifica del dominio. Qualcuno che non capisce il dominio problematico non ha alcuna possibilità di mantenere con successo il tuo codice in ogni caso, e per qualcuno che abbia familiarità con il dominio, i nomi lunghi saranno solo rumorosi, così come più digitazioni per te.

OTHO, dirò che vorrei che la notazione matematica convenzionale fosse a volte più dettagliata e descrittiva, ma indipendentemente dal fatto che penso che il codice matematico dovrebbe attenersi alla convenzione matematica.

Modifica: questa risposta si applica solo se esiste una convenzione molto forte sulla notazione quando si scrive la formula matematicamente. Se non ce n'è uno, e dovresti spiegare cosa rappresentano le variabili in un commento anche supponendo che il lettore abbia familiarità con il dominio, allora è meglio sbagliare sul lato di una convenzione più descrittiva.


2

Opinione pura, ma usa sempre le parole sopra i simboli di una sola lettera. Se usi le parole, tutti capiranno; se usi simboli, solo gli esperti in materia sono tenuti a seguirlo. Anche allora, alcune persone usano simboli diversi per le stesse quantità fisiche. Non hai nulla da perdere usando i nomi più lunghi.


2

La vostra preoccupazione dovrebbe essere la chiarezza e poi la correttezza (il codice errato ma chiaro può essere facilmente corretto), pertanto la vostra funzione dovrebbe essere scritta per la manutenibilità da un programmatore generico per quanto possibile. I commenti dell'intestazione della funzione dovrebbero spiegare la formula e il suo utilizzo e descrivere i parametri in / out. Successivamente, il modo in cui è strutturato il corpo della funzione non dovrebbe importare troppo, purché sia ​​coerente con i commenti dell'intestazione.

(So ​​che questa non è una discussione ma - la mia preferenza personale sarebbe quella di dare nomi espliciti ai variegati anche se in questo caso un one-liner potrebbe essere sufficiente in quanto è una funzione 'pura'; una chiamata con gli stessi parametri produrrebbe lo stesso risultato sempre quindi non ci dovrebbero essere complessità legate allo stato che richiedono spiegazioni)

  • Per quanto riguarda gli altri linguaggi che supportano l'analisi dimensionale, questo può essere implementato ad esempio in C ++ con modelli, credo che la libreria Boost Units utilizzi questo approccio.

1

Dipende da quanto "lontano" dal livello aziendale è il codice ... Più lo stack nel codice è il codice, più è mirato verso la funzione matematica astratta è implementata, più tenterei di emulare il generalmente accettato convenzioni di notazione e denominazione matematiche. Più vicino al front-end o al livello aziendale, più mi adeguerei alle convenzioni stabilite nel dominio del problema.


1

Mi piace pensarlo in questo modo - i matematici hanno sbagliato con variabili brevi e i fisici hanno seguito l'esempio. Perché ripetere il loro errore? Ora sappiamo che i nomi più lunghi sono più descrittivi e producono meno confusione, quindi attenersi al miglioramento. Su una nota più leggera, a volte cerco di intrufolarmi variabili più lunghe nei miei calcoli, a cui tutti sono sconvolti.


Ti piacerà questo ...

0

Il formato corretto per un'equazione di programmazione è quello che capisci ancora dopo non averlo visto per sei mesi.

Se torni a:

n*R*T/P;

E riconosci cosa sta succedendo, quindi probabilmente va bene. In genere per le formule avanzate non ricordo quale fosse ciascuna parte a meno che non la stia usando attivamente. Per me:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

è un formato di equazione molto migliore, in particolare perché posso facilmente capire ogni parte, anche se non so necessariamente perché l'equazione sia scritta così com'è.


Pensi che energy_in_joules = mass_in_kilograms * pow (speed_of_light_in_vacumm_in_metres-per_second, 2) sia più facile di E = mc ^ 2
Martin Beckett

@Martin Beckett, hai letto davvero quello che ho pubblicato? "In genere per i formlas avanzati non ricordo cosa fosse ogni parte a meno che non la stia usando attivamente." Non ho detto che avrei dimenticato le equazioni che sono riuscite a farsi conoscere dal pubblico. In casi come E=m*(c^2)mi farò capire che in sei mesi.
zzzzBov,

per ben note equazioni classiche è meglio usare la notazione normale in modo che le persone possano individuarla. Anche nella misura in cui si chiamano le variabili theta o phi se viene utilizzato nel dominio
Martin Beckett,

-1

Lancia la moneta.

A volte passi anche più tempo a pensare a come nominare una variabile che a spendere per la codifica stessa?


6
Sì, in genere dedico più tempo a progettare il mio codice che a codificarlo, e inizia con la comprensione del problema e la denominazione corretta delle cose.
Mathias,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.