Цитата Роберта К. Мартіна виймана з контексту. Ось цитата з трохи більше контексту:
Ніщо не може бути настільки корисним, як добре розміщений коментар. Ніщо не може захаращувати модуль більше ніж легковажні догматичні коментарі. Ніщо не може бути настільки шкідливим, як старий нахабний коментар, який поширює брехню та дезінформацію.
Коментарі не схожі на Список Шиндлера. Вони не є "чистим добром". Дійсно, коментарі - у кращому випадку, необхідне зло. Якби наші мови програмування були досить виразними або якщо ми мали талант тонко володіти цими мовами, щоб висловити свій намір, нам не дуже потрібні коментарі - можливо, зовсім не так.
Правильне використання коментарів - це компенсувати наше неспроможність висловити себе в коді. Зауважте, що я використав слово "провал". Я мав це на увазі. Коментарі завжди невдачі. Ми повинні їх мати, тому що ми не завжди можемо зрозуміти, як висловити себе без них, але їх використання не є причиною для святкування.
Тож, опинившись у такому положенні, коли вам потрібно написати коментар, продумайте його та подивіться, чи не існує способу перевернути таблиці та висловити себе в коді. Кожен раз, коли ви виражаєте себе в коді, вам слід погладити себе по спині. Кожен раз, коли ви пишете коментар, ви повинні гримасити і відчувати невдачу своєї здатності до вираження.
(Скопійовано звідси , але оригінальна цитата - з чистого коду: Довідник Agile Craftmanship Software )
Як ця цитата зводиться до "Коментарі - це завжди невдачі" - хороший приклад того, як деякі люди виймають розумну цитату з контексту і перетворюють її на дурну догму.
Документація API (на зразок javadoc) повинна документувати API, щоб користувач міг її використовувати без зчитування вихідного коду . Тож у цьому випадку документація повинна пояснювати, що робить метод. Тепер ви можете стверджувати, що "Вилучення продукту за його ідентифікатором" є зайвим, оскільки це вже вказано назвою методу, але інформацію, яка null
може бути повернута, безумовно, важливо документувати, оскільки це жодним чином не очевидно.
Якщо ви хочете уникнути необхідності коментаря, вам слід усунути основну проблему (яка використовується null
як дійсне значення повернення), зробивши API більш явним. Наприклад, ви можете повернути якийсь Option<Product>
тип, тому сам підпис типу чітко повідомляє, що буде повернуто, якщо продукт не буде знайдено.
Але в будь-якому випадку не реально повністю документувати API лише через назви методів та підписи типів. Використовуйте doc-коментарі для будь-якої додаткової неочевидної інформації, яку повинен знати користувач. Скажімо, документація API з DateTime.AddMonths()
BCL:
Метод AddMonths обчислює отриманий місяць та рік, враховуючи високосні роки та кількість днів у місяці, а потім коригує денну частину результуючого об'єкта DateTime. Якщо отриманий день не є дійсним днем у отриманому місяці, використовується останній дійсний день місяця, що виходить. Наприклад, 31 березня + 1 місяць = 30 квітня. Часова частина доби результату об'єкта DateTime залишається такою ж, як і цей екземпляр.
Ви не можете висловити це за допомогою лише імені методу та підпису! Звичайно, ваша документація про клас може не вимагати такого рівня деталізації, це лише приклад.
Вбудовані коментарі теж непогані.
Погані коментарі - погані. Наприклад, коментарі, які пояснюють лише те, що можна побачити з коду, класичний приклад:
// increment x by one
x++;
Коментарі, які пояснюють те, що можна було б зрозуміти, перейменувавши змінну чи метод або іншим чином переструктурувавши код, - це запах коду:
// data1 is the collection of tasks which failed during execution
var data1 = getData1();
Це такі зауваження, проти яких Мартін реверує. Коментар є симптомом невдачі написати чіткий код - у цьому випадку використовувати назви змінних та методів, що роз'яснюються. Сам коментар, звичайно, не проблема, проблема полягає в тому, що нам потрібен коментар, щоб зрозуміти код.
Але коментарі слід використовувати для пояснення всього, що не очевидно з коду, наприклад, чому код написаний певним не очевидним способом:
// need to reset foo before calling bar due to a bug in the foo component.
foo.reset()
foo.bar();
Коментарі, які пояснюють, що надмірно заплутаний фрагмент коду - це також запах, але виправлення не в тому, щоб коментувати поза законом, виправлення - це виправити код! У реальному слові, зведений код трапляється (сподіваємось лише тимчасово, поки рефактор), але жоден звичайний розробник не пише ідеального чистого коду вперше. Коли відбувається заплутаний код, набагато краще написати коментар з поясненням того, що він робить, ніж не писати коментар. Цей коментар також спростить рефакторинг пізніше.
Іноді код неминуче складний. Це може бути складний алгоритм, або це може бути жертвою ясності з точки зору продуктивності. Знову ж необхідні коментарі.