Документування математичної логіки в коді


19

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

Я шукаю більш ефективний і простий для розуміння спосіб пояснення логіки деяких складних кодів, бажано в самому коді. Я розглядав TeX - писати документацію та генерувати її окремо від коду. Але тоді мені доведеться вивчити TeX, і документація не буде в самому коді. Ще я подумав - сфотографувати математичні позначення, рівняння та діаграми, написані на папері / дошці, і включити їх у javadoc.

Чи є простіший і зрозуміліший спосіб?



PS Надання описових імен ( timeOfFirstEventзамість t1) змінних насправді робить код більш багатослівним і ще складніше занадто читаним.


5
Вивчити TeX насправді не так складно. Якщо у вас є код в Інтернеті де завгодно, MathJax досить роздрукує його за півтори години. Будь ласка, пам’ятайте, що існують такі мови, як HAL / S, де ваші занепокоєння перегукуються давно.
Мисливець на оленів

4
Я не зачепив власний ріг, але ось один приклад: meta.stackexchange.com/a/49787/141513 Ідея полягає в тому, щоб написати його так, щоб той, хто дивиться на нього, міг зрозуміти, що він робить, навіть якщо вони не розуміють математика за нею. Для цього зазвичай достатньо гарних імен функцій / змінних та простого коментаря чи двох.
BlueRaja - Danny Pflughoeft

Відповіді:


32

Правильно робити за таких обставин - це реалізувати алгоритм, формулу чи будь-що з точно такими ж іменами змінних, що і в первинному джерелі реального світу (наскільки це дозволяє мова програмування), і мати стислий коментар над ним: щось на кшталт "Обчислення відстані Левенштейна, як описано в [Knuth1968]", де цитування посилається на легкодоступний опис математики.

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


4
@JustinC ні, я думаю, що він має на увазі однакові назви змінних, тобто, якщо його говорить, y = m*x + cви використовуєте m, x і c як змінні
jk.

5
@JustinC Я мав на увазі: використовуйте лише ті змінні та постійні імена, які є у публікації - зазвичай це однобуквені імена, такі як n, f, q чи, можливо, n_i. Я погоджуюсь з ОП, який EulerLinearMomentumнасправді є менш читабельним m. Справа в тому, що вихідний код не є кращим носієм для вираження формул, тому акцент повинен бути зроблений на спрощенні переконання, що код робить те саме, що і друкована формула, а не те, що код відповідає програмним вимогам.
Кіліан Фот

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

2
+1. Якщо посилання на недавню публікацію, дайте гіперпосилання DOI на папір. Приклад dx.doi.org/10.1000/182 . Саме для цього був розроблений DOI - коротка, стандартна URL-адреса публікації, яка гарантовано ніколи не зміниться.
MarkJ

2
@KeithS повністю залежить від невеликого рівняння, де кожна змінна має нормальне фізичне значення, але що робити, якщо ви реалізуєте скажімо алгоритм FFT, де буде кілька часткових результатів без фізичного значення. У цих ситуаціях ви абсолютно необхідні відповідність математичної літератури , тому що це мова домену
Ю. К. ..

8

Коли мені довелося реалізувати такі алгоритми, я роблю пару речей.

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

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

  3. Надайте зведення алгоритму в технічному / математичному плані та включіть будь-які зовнішні посилання, про які я знаю. Знову ж таки, я це роблю із самим методом, щоб мати більше шансів залишатися актуальними. Звичайний текст у цьому випадку не є великим, тому я навожу математичний термін якнайкраще можу та уточнюю у думці, що поруч із ним. Наприклад, x^y (x raised to the power y)

  4. Документуйте, як я розбиваю алгоритм на компоненти, і вкажіть, що кожна змінна репрезентує в алгоритмі. напр.t1 is time of first event

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

  6. Запишіть кілька одиничних тестів, які підтвердять роботу алгоритму.

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

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


6

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

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

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

  3. Спроба кодування рівняння в одній частині. Це набагато легше розпізнати таким чином. НЕ публікуйте Tex-Code повного рівняння в код - або рівняння дуже коротке, і розміщення tex безладно і зайве, або рівняння величезне, а текс-код марний, якщо ви не складете його (Використовуйте a посилання замість цього). Розбирання рівняння на невеликі шматочки робить насправді важко зрозуміти, що відбувається (якщо ти принаймні хороший у математиці).

ІМХО, найважливіше усвідомлення того, що формули часто залежать від контексту. Кожен математичний папір, який я знаю, потребує свого часу, щоб створити середовище моделі; Ви повинні зробити те саме.


1
Детально пояснити контекст - це чудова ідея, зосередившись на тому, чому «чому», перш ніж «як» може бути корисним.
jmruc

3

текст не має виразної сили математики

Ти правий. Оскільки ви вже шукаєте спосіб зробити це за межами коду, а Tex - це надмірність, крім того, що має круту криву навчання, моя рекомендація полягає в наступному:

Використовуйте OpenOffice.org/LibreOffice Math Equation Editor.

Це безкоштовно. Це відкрито.

Ви можете використовувати його або візуально, або ви можете написати рівняння спеціальною мовою.

Вам не доведеться вивчати мову одразу, тому що, коли ви користуєтесь графічним інтерфейсом, на панелі для вас бачитиметься "код".

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

введіть тут опис зображення


Тоді що? Включіть звичайний текстовий код для математичної позначення в оригінальний код в якості коментарів або зробіть скріншот і використовуйте Javadoc, як ОП сказав, що він може робити з TeX?
dodgethesteamroller

@dodgethesteamroller Так, у моїй відповіді сказано: «Оскільки ви вже шукаєте спосіб зробити це за межами коду, а Tex - це надмірність».
Tulains Córdova,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.