Чи повинні "математичні" функції слідувати математичним позначенням?


11

Я припускаю, що це питання буде негайно позначено як суб'єктивне, але, на вашу думку, краще:

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

або

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

Іншими словами, чи повинні функції, що реалізують якесь рівняння, слідувати позначенню рівняння, або вони повинні використовувати більше багатослівних імен?


3
Ви також інколи витрачаєте більше часу на роздуми над тим, як назвати змінну, ніж витрачаєте на саме кодування? ;-)
Томаш

1
Я думаю, що друга альтернатива - це нормально. Я б пояснив змінні в коментарі, хоча.
Джорджіо

Схоже, хтось вважав за потрібне переглядати відповіді всіх членів та голосувати. Чи хотіла б ця людина поділитися своєю причиною цього? Відповіді здалися мені цілком розумними.

Технічно це не має нічого спільного з "математичними" позначеннями і з усім, що думає фізик. Тут не відбувається нічого більше, ніж арифметика.
duffymo

2
Я бачу всіх американців, що переносять температуру у Фаренгейті. Я б точно не використовував подвійний як тип для температури. Те саме, мабуть, стосується тиску. Думаю, мені було б більше цікаво захистити типи, ніж імена.
Мартін Йорк

Відповіді:


14

Залежить від того, хто її читає. Якщо ви можете гарантувати, що на всю вічність наступний програміст, який читає ваш код, також знайомий з термодинамікою, тоді так, перейдіть до усіченої версії.

Мій особистий стиль - використовувати такі змінні (скорочення яких загальновідомі в цій галузі), але включати їх опис у коментарях.

/* 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
В чому справа? Хтось, хто не виконує термодинаміку, не має шансів успішно підтримувати код незалежно від того, які саме назви змінних.
dimimcha

Це, звичайно, краще, ніж не включати інформацію, але в цей момент, здається, було б простіше просто використовувати ці імена у функції. Я не бачу багато корисності у використанні букв ...
Patrick87

@dsmicha: Так, PV = nRT - дуже базовий приклад. У реальному світі існують складніші функції, які не є загальновідомими і мають тенденцію бути тривалими і складними. Тож навіть якщо людина проходить навчання на місцях, є хороший шанс, що він натрапить на функцію, яка абсолютно чужа.

4
@ Patrick87: Я вважаю за краще букви, тому що я можу швидко перевірити правдивість виразу, переглянувши папір, з якої вона є (або з пам'яті), оскільки вона набагато ближче до початкової форми.

2
+1. Це найкращий спосіб зробити це. Навіть досить елементарні фізичні рівняння можуть використовувати грецькі літери, корені, часткові похідні, оператори (Лаплас, Гамільтон), вектори, тензори тощо, так що, як правило, неможливо зобразити рівняння розбірливо в коментарях. Дотримуватися найменш стандартних імен змінних / скорочень (наприклад, GAS_CONSTANTце не стандартна назва змінної; кожен підручник, який я знаю, використовує Rдля цього), і коротко пояснити їх у коментарях - це найкраще, що можна зробити.
Joonas Pulakka

7

Просто викинувши його, у вас є ще один варіант:

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

Це дещо схоже на те, що F # робить з одиницями вимірювання, і має перевагу уникнути таких проблем, як заміна ненавмисного тиску температурою. Важко окуляру, які аргументи повинні бути, куди, коли підпис (подвійний, подвійний, подвійний)


Для того, щоб зрозуміти, чи є там мови, які можуть робити такий аналіз розмірів? Тобто, хто знає, що, наприклад, що продукт між тиском і об'ємом може бути віднесений до одиниці енергії?
lindelof

Так, F # робить це за допомогою Одиниць вимірювання. msdn.microsoft.com/en-us/library/dd233243.aspx
Mathias

Навіть без підтримки автоматичного перетворення між одиницями може бути вигідним визначити виділені типи для певних одиниць, наприклад, грошовий клас. Це обмежує помилкові помилки присвоєння та перетворення змінних та допомагає при рефакторингу.
Матіас

Це можна зробити дуже надійно за допомогою шаблонів C ++.
кевін клайн

@lindelof: Деякі функції можна досягти за допомогою C ++typedef
Jacob

7

Я вважаю за краще це:

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

Іншими словами, поясніть значення коду в коментарі англійською мовою (і математика; це коментарі, ви можете розширити його наскільки це необхідно), але використовуйте описові назви змінних, щоб кожен, хто читає єдиний код, все-таки міг зрозуміти це легко - особливо з більшими функціями. Ще одна причина, чому я використовую реальні слова як імена змінних, - це те, що інтерфейс набагато зрозуміліший, якщо вам потрібно скопіювати декларацію функції у файл заголовка.


2
Крім того, непогано було б у коментарі включити посилання на інше місце в Інтернеті, яке розповідає про формулу (наприклад: en.wikipedia.org/wiki/Ideal_gas_law ).
Кріс Шаффер

Це дуже приємний підхід, але трохи безладно. Я б хотів просто побачити посилання, наприклад, на Вікіпедію, що описує (в даному випадку) закон про ідеальний газ.
Patrick87

3

IMHO завжди краще використовувати встановлене позначення проблемного домену, в якому ви працюєте, якщо функція дуже доменна. Хтось, хто не розуміє проблемний домен, не має шансів успішно зберегти ваш код, а для тих, хто знайомий з доменом, довгі імена будуть просто шумом, а також більше набиратимуть вас.

ДРУГО, я скажу, що я хотів би, щоб звичайні математичні позначення були часом більш багатослівними та описовими, але незалежно від того, я думаю, математичний код повинен дотримуватися математичної конвенції.

Редагувати: Ця відповідь застосовується лише в тому випадку, якщо математична написання формули є дуже сильною умовою щодо нотації. Якщо такого немає, і вам доведеться пояснити, що представляють змінні в коментарі, навіть припускаючи, що читач знайомий з доменом, тоді краще помилитися на стороні більш описової конвенції.


2

Чиста думка, але завжди використовуйте слова над однолітерними символами. Якщо ви вживаєте слова, всі зрозуміють; якщо ви використовуєте символи, гарантовано дотримуватимуться лише експерти з предметів. Вже тоді деякі люди використовують різні символи для однакових фізичних величин. Вам немає чого втрачати, використовуючи довші імена.


2

Ваша турбота повинна бути чіткістю, а потім правильністю (неправильний, але чіткий код легко виправляється), тому ваша функція повинна бути написана для ремонтопридатності загальним кодером, наскільки це можливо. Зауваження до заголовка функції повинні пояснювати формулу та її використання та описувати параметри введення / виводу. Згодом спосіб розміщення функції функції не повинен мати великого значення, якщо він відповідає коментарям заголовка.

(Я знаю, що це не дискусія, але - моє особисте перевагу було б давати чіткі імена змінним, хоча в цьому випадку однолінійного може бути достатньо, оскільки це "чиста" функція; дзвінок з тими ж параметрами дав би те саме результат завжди, тому не повинно бути пов'язаних з державою складностей, які потребують пояснення)

  • Що стосується інших мов, що підтримують розмірний аналіз, це може бути реалізовано, наприклад, у C ++ за допомогою шаблонів, я вважаю, що бібліотека Boost Units використовує такий підхід.

1

Залежить від того, наскільки "далеко" від бізнес-шару знаходиться код ... Чим надалі в стеку є код, тим більше націлений він на реалізацію абстрактної математичної функції, тим більше я б намагався наслідувати загальноприйнятого математичні позначення та називання конвенцій. Чим ближче до переднього кінця чи до бізнес-шару, тим більше я відповідав би умовам, встановленим у проблемній області.


1

Мені подобається думати про це так - математики помилялися з короткими змінними, а фізики йшли за цим. Навіщо повторювати їх помилку? Зараз ми знаємо, що довші назви є більш описовими та створюють менше плутанини, тому дотримуйтесь вдосконалення. Що стосується легшої ноти, я іноді намагаюся прокрасти її довші змінні у мою математику, на яку всі здивовані.


Вам сподобається це ...

0

Правильний формат рівняння програмування - це той, який ви все ще розумієте, не бачивши його протягом півроку.

Якщо ви повернетесь до:

n*R*T/P;

І ви визнаєте, що відбувається, то, мабуть, це добре. Зазвичай для розширених формул я не пам’ятаю, що було кожною частиною, якщо я активно не використовую її. Для мене:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

є набагато кращим форматом рівнянь, тому що я легко розумію кожну частину, навіть якщо я не обов'язково знаю, чому рівняння написано таким, яким воно є.


Ви думаєте, що energy_in_joules = mass_in_kilograms * pow (speed_of_light_in_vacumm_in_metres-per_second, 2) легше, ніж E = mc ^ 2
Мартін Бекетт

@Martin Beckett, ти насправді читав те, що я розмістив? "Як правило, для розширених формул я не пам'ятаю, що було кожною частиною, якщо я активно не використовую її." Я не сказав, що забуду рівняння, які зуміли підштовхнути громадські знання. У тих випадках , як E=m*(c^2)я буде зрозуміти це в протягом шести місяців.
zzzzBov

для добре відомих класичних рівнянь краще використовувати звичайні позначення, щоб люди могли його помітити. Навіть в міру іменування змінних theta або phi, якщо це те, що використовується в домені
Martin Beckett

-1

Киньте монету.

Ви також інколи витрачаєте більше часу на роздуми над тим, як назвати змінну, ніж витрачаєте на саме кодування?


6
Так, я зазвичай витрачаю більше часу на розробку свого коду, ніж на його кодування, і це починається з розуміння проблеми та іменування речей належним чином.
Матіас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.