Оновлення
Моя відповідь у цитатах наголоси:
На мою переконання, відповідь, яка заявляє, що коментарі не повинні розглядатися в стандартах кодування, а потім перераховує набір оборонних питань для боротьби з нею, є єдиною правильною відповіддю.
Проблема тут полягає в тому, що стандарт кодування - це саме те, що є стандартом . Надзвичайно суб'єктивні ідеї не повинні містити стандарт кодування . Це може бути посібник із кращих практик, але цей посібник не може бути використаний проти розробника під час перегляду коду. На мою особисту думку, стандарт кодування повинен бути максимально наближений до автоматизованого. У Code Reviews витрачено стільки часу, що сперечається щодо імен, пробілів, вкладок, дужок, коментарів тощо., Коли ВСЕ це можна автоматизувати. Навіть відповідь про tables
і chairs
може бути автоматизована. LINT'ers дозволяють виконувати словники, перевірки великої літери на поняття (змінна, функція, метод, клас тощо).
Навіть перевірка JavaDoc може бути реалізована роботом LINT'er до прийняття запиту на витяг. Дуже багато проектів з відкритим кодом роблять це точно. Ви подаєте свій Запит на виклик, код складається з файлу Travis-CI, включаючи статичний аналіз, і він повинен пройти всі стандарти кодування, які можна об'єктивно виразити. Ніяких людей не звучить "неправильно робити це" або "не надавати значення коментарям", або неправильний спосіб називати змінні тощо. Ці дискусії не надають ніякої цінності і найкраще залишити стороннім роботом, який може взяти на себе основну частину емоційного кодування.
Щоб відповісти на запитання, нам слід було б вирішити, як написати стандарт, який відповідає, як відповісти на таке запитання: Чи дав цей коментар значення? Стандарт кодування не може диктувати "значення" коментаря. Для цього людині стає необхідним пройти цей контрольний список. Просте згадування коментарів у стандарті кодування створює контрольний список, якого хоче уникати Оригінальний плакат.
Ось чому коментарі зазвичай не обробляються компілятором і викреслюються. Їх значення не можна визначити. Чи є ціннісний коментар цінним; так або ні?. Відповісти на це запитання важко. Лише люди мають шанс правильно відповісти на нього, і навіть тоді на нього може відповісти лише той час, коли його читають, людина, яка її читає; де на значення цього коментаря впливає погода, його домашнє життя, остання зустріч, на якій вони щойно були присутні, і не закінчилася добре, час доби, кількість кави, яку вони випили. Я вірю, що картина стає більш чіткою.
Яким чином це може бути виражено належним чином у будь-якому Стандарті? Стандарт не корисний, якщо його не можна застосовувати послідовно та справедливо, коли справедливість стосується об'єктивності, а не емоційності.
Я заперечую, що стандарт кодування повинен залишатися максимально об'єктивним. Те, як змінні називаються об'єктивними IS. Їх можна легко перевірити в словнику щодо правильності написання, граматичної структури та обстановки. Все, що виходить за рамки цього, - це "підступний матч", який виграє людина з найбільшою силою або "б'ючи брови". Щось я особисто борюся з НЕ роблю.
Коли я коментую, я завжди коментую розмову зі своїм майбутнім самоврядом у третій особі. Якщо я повернусь до цього коду через 5 років, що мені потрібно знати? Що було б корисно, що було б заплутано і що застаріло з кодом? Існує відмінність між кодом документування для створення загальнодоступного API, який можна шукати, та коментування коду, який надає значення невідомій сторонній стороні, навіть якщо цією стороною є ви самі.
Ось хороший лакмусовий тест. Якби ви були ТІЛЬКИ в проекті. Ви знали, що будете єдиним у проекті. Що було б у вашому стандарті кодування? Ви хочете, щоб ваш код у майбутньому був чистим, зрозумілим і зрозумілим для себе. Чи могли б ви ознайомитись із кодом щодо того, чому ви не коментували кожен рядок? Ви б переглянули кожен створений вами коментар до 100 файлів, які ви зареєстрували? Якщо ні, то навіщо змушувати інших?
Щось, на мій погляд, пропущено в цих дискусіях, це те, що Future You також є розробником цього проекту. Запитуючи про цінність, завтра ти також є людиною, яка може отримати значення з коментаря. Тож розмір команди, на мою думку, не має значення. Командний досвід не має значення, він змінюється занадто часто.
Жодна кількість коду коментування, яка б переглядала цю функцію, зупиняє ритм-медіатора від удару та вбивства пацієнта. Як тільки ви говорите про коментар, який впливає на код, тепер ви говорите про код, а не про коментар. Якщо все, що потрібно, - це відсутність коментаря, щоб когось вбити, у процесі є щось інше, що пахне.
Рішення цього типу жорсткого способу кодування вже було запропоновано як методологія написання самого програмного забезпечення. І це не має нічого спільного з коментарями. Проблема з коментарями полягає в тому, що вони НЕ впливають на спосіб роботи продукту в кінцевому рахунку. Найкращі коментарі в світі не можуть унеможливити збій програмного забезпечення, вбудованого в програму створення темпу. Або при вимірюванні електричних сигналів за допомогою портативного ЕКГ.
У нас є два типи коментарів:
Машиночитані коментарі
Стилі коментарів, такі як Javadoc, JSDoc, Doxygen тощо, - це всі способи коментування публічного інтерфейсу, який надає набір коду. Цей інтерфейс може використовуватися лише одним іншим розробником (власний код для команди двох осіб), невідомою кількістю розробників (наприклад, JMS) або для цілого відділу. Цей код може бути прочитаний автоматизованим процесом, який потім створює інший спосіб читання цих коментарів, ala HTML, PDF тощо.
Цей тип коментарів легко створити стандарт для. Це стає об'єктивним процесом забезпечення кожного методу, функції, класу, який публічно може викликати, містить необхідні коментарі. Заголовки, параметри, опис та ін. ел. Це потрібно для того, щоб інша команда легко знаходила і використовувала код.
Я роблю щось, що виглядає божевільним, але насправді це не так
Ці коментарі є тут, щоб допомогти іншим побачити ЧОМУ цей код був написаний певним чином. Можливо, в процесорах є чисельна помилка, на якій працює код, і він завжди округляється, але розробники зазвичай мають справу з кодом, який складається. Отже, ми коментуємо, щоб розробник, який торкався коду, розумів, чому поточний контекст щось робить, як правило, здається нерозумним, але насправді це було написано спеціально.
Цей тип коду викликає стільки проблем. Зазвичай він залишається без коментарів і пізніше виявляється новим розробником та "виправляється". Таким чином ламаючи все. Вже тоді коментарі є лише там, щоб пояснити, ЧОМУ насправді не завадити нічого зламати.
Не можна покладатися на коментарі
Коментарі в кінцевому рахунку марні і не можна довіряти їм. Коментарі зазвичай не змінюють спосіб роботи програм. І якщо вони це роблять, то ваш процес спричиняє більше проблем, ніж повинен. Коментарі - це думки і ніколи не можуть бути нічого, окрім. Код - це все, що має значення, і це все, що обробляється комп'ютером.
Це може здатися асиніном, але потерпіть мене. Який із цих двох рядків насправді має значення?
// We don't divide by 0 in order to stop crashes.
return 1 / n;
У цьому прикладі важливо лише те, що ми поняття не маємо, що таке «n», не існує жодної перевірки на те, що n є 0 І навіть якщо вона була, ніщо не заважає розробнику поставити n = 0
ПІСЛЯ чек на 0. Таким чином, коментар це марно і нічого автоматизованого ніколи цього не може наздогнати. Жоден стандарт не може цього наздогнати. Коментар, хоча досить (на деякі) не має жодного стосунку до результату продукту.
Тестова розробка
Який результат має товар? Слід ретельно перевіряти галузі, в яких написаний код може буквально врятувати або вбити когось. Це робиться за допомогою оглядів коду, оглядів коду, тестування, тестування, оглядів кодів, тестів одиниць, інтеграційних тестів, випробувань, постановок, місяців тестування, оглядів коду та одиночних випробувань, постановки, огляду коду, тестування, а потім, можливо, нарешті переходить у виробництво. Коментарі не мають нічого спільного з цим.
Я б скоріше кодував, що не мав коментарів, мав специфікацію, мав одиничні тести, які перевіряли специфікацію, дослідження результатів запуску коду на виробничому пристрої, потім добре задокументований код, який ніколи не був протестований, і не мав нічого для порівняння код проти.
Документація приємна, коли ти намагаєшся зрозуміти, ЧОМУ хтось щось робив певним чином, однак я роками виявив, що документація зазвичай використовується для пояснення того, чому було зроблено щось «розумне», коли воно справді не потребувало писати саме так.
Висновок
Якщо ви працюєте в компанії, яка вимагає коментувати кожен рядок, я гарантую, щонайменше двоє програмних інженерів проекту вже написали програму автоматичного документування в Perl, Lisp або Python, яка визначає загальне уявлення про те, що ця лінія працює , потім додає коментар над цим рядком. Оскільки це можливо зробити, це означає, що коментарі марні. Знайдіть інженерів, які написали ці сценарії, щоб автоматично документувати код, і використовуйте їх як доказ того, чому "коментар до кожного рядка" витрачає час, не даючи ніякої цінності, і потенційно шкодить.
Убік я допомагав близькому другу із завданням програмування. Його вчитель поставив вимогу, щоб кожен рядок був задокументований. Тож я можу бачити, звідки взявся б цей мислительний процес. Просто запитайте себе, що ви намагаєтеся зробити, і чи це правильно? Тоді запитайте себе; Чи є спосіб «грати» систему за допомогою цього процесу? Якщо є, то чи дійсно додає якусь цінність? Не можна автоматично писати одиничні тести, тести яких цей код відповідають певній специфікації, і якщо вони, можливо, це не буде поганою справою.
Якщо пристрій повинен працювати за певних умов, оскільки він буде знаходитись всередині людини, єдиний спосіб переконатись, що їх не збирається вбивати - це роки тестування, експертного огляду, випробувань, а потім НІКОЛИ ніколи не змінюючи код знову. Ось чому NASA / все ще використовує таке старе обладнання та програмне забезпечення. Якщо мова йде про життя чи смерть, ви не просто "зробите трохи зміни та перевірте це".
Коментарі не мають нічого спільного з порятунком життя. Коментарі для людей, люди роблять помилки, навіть коли пишуть коментарі. Не довіряйте людям. Ерго, не довіряй коментарям. Коментарі - це не ваше рішення.