Чи варто коментувати по-різному у функціональних мовах? [зачинено]


25

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

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

Який правильний спосіб коментувати функціональну програму? Чи слід використовувати той самий підхід, що і в ітеративному програмуванні?


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

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

8
не всі функціональні мови є чистими, деякі з них мають побічні ефекти.
Танос Папатанасіу

1
Але прокоментуйте, що ви хочете коментувати ... Це переосмислення
gd1

1
Чи ризикує ваш проект мати інших членів, які не знайомі з функціональними мовами? Можливо, їм потрібна додаткова допомога.
JeffO

Відповіді:


84

Назва функції повинна говорити, що ви робите.

Реалізація розповість, як ви це робите.

Використовуйте коментарі, щоб пояснити, чому ви це робите.


1
Чудова відповідь, мене вбиває бачити код, залитий коментарями, які пояснюють, що і як (що видно з самого коду), але залишають мене здогадуватися, чому.
Ерік Вілсон

32
і це вірно незалежно від парадигми
jk.

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

3
Хоча ця відповідь дуже проста і простота має велике значення, вона не зовсім правда. Ім'я функції часто не може і не може описати "що" досить детально, тому документація часто необхідна (наприклад, для опису крайових випадків). Документація часто вставляється в коментарі.
luiscubal

2
Імовірно, ім'я функції також повинно пояснювати, чому це робиться - коли це можливо.
Ям Маркович

14

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

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

// map 'toUpperCase' over 'container' yielding 'result'
Container result = new Container();
for (int i=0; i < container.size(); i++) { 
             result.addToTail(container.atElement(i).toUpperCase());
}

Але це явно нонсенс у функціональній мові:

-- map 'toUpperCase' over 'list'
let result = map toUpperCase list

Краще:

-- we need the FooBars in all uppercase for the Frobnitz-Interface
let result = map toUpperCase list

8
дідусь завжди каже мені документувати, чому замість чого. Тож я б використав останню версію і для імперативного коду.
Саймон Бергот

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

11

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


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

3

Функції слід коментувати, якщо лише ім'я функції та параметрів не достатньо для визначення договору .

// returns a list of Employees    <-- not necessary
def GetEmployeeList: ...

// returns a list of Employees sorted by last name    <-- necessary
def GetEmployeeList: ...

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


2

Сам коментар не повинен містити альтернативного опису того, що робить код (що насправді виражається самим кодом), а скоріше пояснення причин, чому код написаний таким, яким він є.

Однак, я не бачу жодної причини, за якою коментар сам по собі повинен бути різним у функціональній мові.


1

Я використовую той самий підхід до документування всього свого коду:

  • Використовуйте описові назви,
  • Додавайте коментарі перед будь-якою досить складною логікою, якщо складної логіки не уникнути,
  • Напишіть огляд всієї системи,

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


0

У віці 25 років ви, як правило, пам’ятаєте речі набагато краще. Коли ви дорослішаєте, і ви співпрацюєте з декількома системами зі спадковим кодом (так, код, який ви пишете сьогодні, буде застарілим кодом через 10-15 років), це може бути дуже корисно, якщо є коментарі.

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