"Коментарі - це кодовий запах" [закрито]


100

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


44
Я збираюся схвалити будь-яку відповідь, яка говорить "ні".
Ніколь

2
@ Renesis Це запах божественності.
ixtmixilix

107
Ваш колега зробив широке узагальнення, що автоматично означає, що він помиляється. :)
Алекс Фейнман

5
@Mongus, я не згоден. Коментарі у вашому прикладі погані не тому, що це коментарі, а тому, що вони ТОО близькі до коду, який потім змінюється. Вони повинні сказати ЧОМУ, а не ЩО .

5
@ Алекс, хіба це невміле узагальнення, яке тому неправильно (внаслідок чого він все одно не помиляється)?

Відповіді:


167

Тільки якщо коментар описує, що робить код.

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

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

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

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


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

1
У будь-якому випадку, іноді вам також доводиться коментувати ЯК, якщо це складно (особливо якщо це оптимізовано чи будь-який інший вид нетривіальних операцій). Якщо мені доведеться витратити більше 5 хвилин на читання одного блоку коду, щоб зрозуміти, що це робить, це може бути дуже засмучує ...
Khelben

3
"Тільки якщо коментар описує, що робить код." Або якщо коментар описує, що раніше робив код; код змінився, але коментар ні.
Брюс Олдермен

1
Як ви перевірите, чи ваш коментар правильний? Чому б не написати свій коментар як тест? Будь-який майбутній супровідник може використовувати тест як перевірочну документацію для коду. Якщо коментар має щось спільне з виконанням коду, то щось / повинно / має бути впевненим. Якщо коментар не має нічого спільного з виконанням коду, то що він робить у коді, куди будуть дивитись лише програмісти?
flamingpenguin

2
@ back2dos, якщо ви часто блюваєте, читаючи код інших людей, я радий, що ми не

110

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

Очевидно, ваш колега недостатньо досвідчений.


16
Мені цікаво дивитись на "добре названий, дуже чистий, коментований код", який важко дотримуватися. Будь-який код, який я б класифікував як такий, дуже легко прослідкував. Я, звичайно, не пішов би так, як "Очевидно, що ваш колега недостатньо досвідчений".
Liggy

8
@Liggy: Я б. Це алгоритм дослідження, а не додаток для бізнесу.
Пол Натан

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

29
Математика, математика, математика. Не у всіх кодах реалізовано тривіальний клей IoC та «ціна * кількість». Складну математику не можна зробити магічним для самостійного пояснення.
bmargulies

4
@Liggy, впровадження коду складних структур даних може бути абсолютно незрозумілим без обширної документації.

75

Коментарі повинні пояснювати, чому, а не як.

Howкоментарі типу зазвичай краще вирішувати за допомогою рефакторингу. Особисто я зазвичай уникаю коментарів на користь рефакторингу.

Перед:

# convert to cents
a = x * 100

# avg cents per customer 
avg = a / n

# add to list
avgs < avg
t += 1

після:

total_cents = total * 100
average_per_customer = total_cents / customer_count

track_average(average_per_customer)

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

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

3
@Stuart ім'я функції повинно говорити, що вона робить.
Альб

3
@GSto, я більше не могла погодитися. Якщо код складний, його слід розбити на більш дрібні методи / функції з відповідними іменами, що описують дію.
CaffGeek

1
Ви припускаєте, що маєте повний контроль над базою коду.
LennyProgrammers

32

Я оголошую вашого колегу єретиком! Де мої єретичні спалювальні черевики?

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

Деякі фактичні коментарі до коду, над яким я працюю:


    // If this happens, somebody's been screwing around with the database definitions and
    // has removed the restriction that a given alarm may have only one entry in the 
    // notifications table.  Bad maintenance programmer!  Bad!  No biscuit!



    // If an alert is active on our side but inactive on theirs, that might mean
    // they closed the alert.  (Or that we just haven't told them about it yet.)  The
    // logic comes later; for now, we'll just compile it in a list.



    // If we know for a fact that an alarm isn't getting through, we're going to whine pretty
    // aggressively about it until it gets fixed.


7
+1 за приємні коментарі. Жодна кількість коду не може сказати: "Якщо це станеться, хтось перекручується з визначеннями бази даних".
DistantEcho

9
@Niphra, ну, ми могли б кинути SomebodyScrewedAroundWithDatabaseException...

@ Thorbjørn +1, Якщо код знає, що не так, чорт, добре повідомте про це. Клієнти, які підтримують технічну підтримку, ймовірно, можуть перезавантажити БД і уникнути дзвінка з обслуговування.
Тім Вілліскрофт

@Tim, оскільки клієнти можуть бачити це, може бути доречним більш нейтральне називання.

3
Звичайно, пам’ятайте: ніколи не вживайте дурних імен. Замовник завжди їх побачить.
Тім Вілліскрофт

29

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

Чого слід абсолютно уникати, це "надмірність коду коментування" (коментарі, які нічого не додають до коду):

i++; // Increment i by 1

Тоді, якщо є хороший (і підтримується / вирівняний) дизайн коду та документація, коментування стає ще менш корисним.

Але в деяких обставинах коментарі можуть стати гарною підмогою у читанні коду:

while( foo )
{
     if( dummy )
     {
     }
     else // !dummy
     {
     }
} // end while( foo )

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


2
Хороша умовність імен та добре структурований код допоможуть вам зменшити потребу в коментарях. Не забувайте, що кожен доданий вами коментар - це новий рядок для підтримки !!
Габріель Монджен

81
Я ненавиджу, коли люди використовують ваш другий приклад у вашому запитанні. } //end whileпросто означає початок циклу в той час, як далеко, ви навіть не можете його побачити, і немає жодних підказок, що код, який ви дивитесь, знаходиться в циклі. Важкі рефакторинг слід серйозно віддавати перевагу коментарям про структурування коду.
Карсон Майєрс

4
@Carson: хоча тримати блоки короткими є добре відомим правилом, це не означає, що ми завжди можемо застосовувати його.
Wizard79

4
@Carson: Один із проектів, над якими я працюю, не має достатнього перегляду коду, що призводить до колекції програмних програм із цикломатичною складністю "OMFG ПЕРЕКЛЮЄ ВАМ". Відновлення кривавих речей являє собою трудові дні, які потрібно провести в іншому місці. Ці } // end whileкоментарі можуть бути рятівниками.
BlairHippo

11
@BlairHippo: "Запах [A] - це будь-який симптом у вихідному коді програми, який, можливо, вказує на глибшу проблему". Звичайно, коментар - це збереження життя, але цикл OMGWTF - це згадана вище "глибша проблема", і необхідність
врятувати

26

Категорично визначати метод або процес як "кодовий запах" - це "запах завзятості". Термін стає новим "вважається шкідливим".

Будь ласка, пам’ятайте, що всі подібні речі повинні бути настановами.

Багато інших відповідей дають хороші поради щодо того, коли коментарі є виправданими.

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

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

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


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

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

4
+1 для "Рефакторинг всього, поки дитячий садок не зрозуміє, що, швидше за все, це не буде ефективно використовувати ваш час, і, ймовірно, не буде працювати так добре, як більш стислий варіант".
Граф

23

У деяких випадках жодна кількість хороших імен, рефакторингу тощо не може замінити коментар. Подивіться на цей приклад у реальному світі (мова - Groovy):

  response.contentType="text/html"
  render '{"success":true}'

Дивно виглядає, чи не так? Можливо, помилка копіювання-вставки? Крики про помилку?

Тепер те саме з коментарями:

  // DO NOT TOUCH THE FOLLOWING TWO LINES; the ExtJS UploadForm requires it exactly like that!!!
  response.contentType="text/html"  // must be text/html so the browser renders the response within the invisible iframe, where ExtJS can access it
  render '{"success":true}'         // ExtJS expects that, otherwise it will call the failure handler instead of the succss handler

функція prime_extjs_uploadform () {response.contentType = 'текст / html'; render '{"успіх": true}'; } prime_extjs_uploadform ();
DrPizza

23

Основне питання тут - значення терміна "кодовий запах".

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

Це не значення терміна!

Метафора кодового запаху походить від Wards Wiki , і вони підкреслюють:

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

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

Саме це означає, що коментарі мають запах коду.

EDIT: Я просто натрапив на ці дві статті, що пояснює це краще за мене:


2
Мені приголомшено, що на отримання відповіді знадобилося 2 місяці. Це демонструє, наскільки поширене непорозуміння цього терміна.
Пол Різник

Загальне твердження справи все ще неправильне. Ви не кажете: "Я бачу коментований код. Це поганий знак".
Стюарт П. Бентлі

1
@Stuart: Ви дивитесь на два фрагменти коду, обидва з відповідними рівнями коментарів. (У цьому питанні не йдеться про відповідну кількість коментарів, це про те, як ви судите код на основі кількості коментарів.) Один не має коментарів, інший - тонн. На кого ви пильніше придивляєтесь? - Коментарі - це ознака того, що код складний і тонкий і, отже, швидше за все виникнуть проблеми.
Девід Шварц

Це правильна відповідь.
vidstige

21

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


8
+1 Для будь-якого розробника , який не працював на одному проекті досить довго , щоб випробувати це, повірте мені , це буде відбуватися. Щоразу, коли я навчусь цьому важко, і мені доведеться перевчити власний код, я не дозволяю собі двічі робити одну і ту ж помилку і коментувати її, перш ніж перейти до чогось іншого.
Ніколь

Ні, ви повинні уявити собі психопата, який знає, де ви живете: чи будуть вони раді зберегти ваш код?
Річард

4
Я регулярно стаю психопатом, коли бачу нечитаний код.
LennyProgrammers

3
5 років? Більше, як 5 хвилин. ;)
Алекс Фейнман

11

Хороша ідея мати правильні коментарі - почати з написання коментарів.

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myFunction(parameters)
{
    // It will do some things to get started.

    // It will do more with the stuff.

    // It will end doing things with the stuff.
}

Це дозволяє легко витягувати методи, щоб навіть позбутися від коментарів,
просто нехай код розповість про це ! Подивіться, як це дуже красиво переписати (вирізати / вставити):

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myfunction(parameters)
{
  var someThing = initializedWithSomething;

  doSomethingWith(someThing);

  doMoreWith(someThing);

  endDoingThingsWith(someThing);

  return someThing;
}

// This function will do some things to get started,
// the parameters should be good according to some rules.
doSomethingWith(parameters)
{
  parameters.manipulateInSomeWay();
  ... etc ...
}

... etc ...

Для речей, які не можна розділити, просто не вилучайте методи та вводите код під коментарями.

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

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


1
Це я і роблю. Якщо ви думаєте, що вам потрібні коментарі, я від душі рекомендую спробувати це як заміну.
bzlm

10

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


10
// Dear me in the future. Please, resolve this problem.

або

// You think this code was written by somebody else. 
// No, it wasn't. You ([some name]) did it.

Ах, щирі благання до майбутнього "я".
Ентоні Пеграм

8

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

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

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

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

Самс навчить себе візуальним C # 2010 за 24 години , стор 348-349.


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

@ Lenny222: Так, коментарі можуть стати несвіжими ... що зазвичай свідчить про лінивих програмістів. Якщо коментар описує, чому було прийнято рішення, чому код використовує певний алгоритм для обчислення або описує, як функціонує код, то немає ніяких причин коментар стати черствим, окрім того, що хтось змінить реалізацію і не оновить коментар відповідно - що рівнозначно лінивому.
Скотт Дорман

2
Я згоден. Моя думка, є ризик стати його несвіжим, так. Але коли у мене є функція doBar (), і через 3 роки вона не "робить бар", але вона "робить бар і foo, окрім середи", то значення функцій теж може бути несвіжим. І назви змінних. Але я сподіваюся, що ніхто не сприймає це з причини, щоб не давати значенню імен функцій та змінних.
LennyProgrammers

6

Якщо код був написаний певним чином, щоб уникнути проблеми, наявної в бібліотеці (як сторонніх, так і бібліотеки, що постачаються разом із компілятором), то є сенс прокоментувати це.
Також має сенс коментувати код, який потрібно змінити в майбутніх версіях або при використанні нової версії бібліотеки або, наприклад, при переході від PHP4 до PHP5.


6

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


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

4

Серед почесних згадок є анти-шаблон:

Моє враження, що іноді преамплекс ліцензій FLOSS часто використовується замість файлової документації. GPL / BSDL створює приємний текст для заповнення, після чого ви рідко бачите будь-який інший блок коментарів.


4

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

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

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


1
Експериментальні тести дуже допомагають визначити, чи є результати неправильними. Якщо ви читаєте якийсь код і думаєте, що це робить X, коли насправді це робить Y, то можливо код не написаний достатньо для читання. Я не впевнений, що ви маєте на увазі щодо неправильного використання результатів. Коментар не захистить вас від того, щоб хтось споживав ваш код незвичайними способами.
Адам Лір

"Якщо ви читаєте якийсь код і думаєте, що це робить X, коли насправді це робить Y" Це не те, що я сказав. Я говорю про розуміння того, що робить код , але не про те, що він повинен робити. Скажімо, ви підозрюєте помилку за одним. Звідки ви знаєте, що помилка "один за одним" замість цього не в споживчому коді чи в цьому коді? Коментарі пояснюють наміри коду, який дуже допомагає відстежувати помилки.
Danny Tuppeny

З іншого боку, коментарі можуть говорити лише про те, що повинен був робити код на момент написання коментарів. Сам код може говорити вам про те, що зараз потрібно робити . Коментарі не збираються. Ви не можете перевірити коментарі. Вони можуть бути, а можуть і не бути правильними.
Ентоні Пеграм

3

Коментарі, які висловлюються через те, що хтось вважає, що нормально мати 700 рядків в одному методі - це запах.

Коментарі, які є, тому що ви знаєте, якщо ви не залишите коментар, хтось знову зробить ту саму помилку - це запах.

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

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


3

Я відповім власним питанням. Чи можете ви знайти помилку в коментованому коді нижче?

tl; dr: Наступна особа, яка підтримує ваш код, може бути не такою богоподібною, як ви.

 [org 0x7c00]

 main:
  mov ah, 0x0e
  mov bx, string
  call strreverse
  call print

 stop:
  jmp $

 strreverse:
  pusha
  mov dx, bx
  mov cx, 0

 strreverse_push:
  mov al, [bx]
  cmp al, 0
  je strreverse_pop
  push ax
  add bx, 1
  add cx, 1
  jmp strreverse_push

 strreverse_pop:
  mov bx, dx

 strreverse_pop_loop:
  cmp cx, 0
  je strreverse_end
  pop ax
  mov [bx], al
  sub cx, 1
  add bx, 1
  jmp strreverse_pop_loop

 strreverse_end:
  popa
  ret

 print:
  pusha

 print_loop:
  mov al, [bx]
  cmp al, 1
  je print_end
  int 0x10
  add bx, 1
  jmp print_loop

 print_end:
  popa
  ret
 string:
  db 'Boot up', 0

 times 510 -( $ - $$ ) db 0
 dw 0xaa55

Але хіба в цей день і вік ви не використовуєте багаж високого рівня?
Ян

2
@Ian: Програма - завантажувач IBM-PC. Ви не можете записати його нічого, крім складання, тому що вам потрібен повний контроль того, де програма знаходиться в оперативній пам'яті, де з'являється останній короткий вигляд, а деякі апаратні переривання. Серйозно, отримайте собі копію NASM. Зберіть його, запишіть у завантажувальний сектор дискети або USB-накопичувача та завантажте його. Хоча ви, ймовірно, виявите, що це не працює, як очікувалося, через помилку. Зараз знайдіть помилку ... Незалежно від того, я впевнений, що через 20 років люди запитають те саме, що і без коментарів Java.
Мураш

Безумовно, код може бути записаний на C або C ++, а двійковий зібраний з коду об'єкта C та якогось зовнішнього інструменту.
Кевін Клайн

На жаль ні. Подивіться на цю сторінку в CodeProject: codeproject.com/KB/tips/boot-loader.aspx - "мови високого рівня не мають необхідних інструкцій". Мало того, але у вас є лише 512 байти, щоб грати в завантажувачі. Іноді просто потрібно потрапити безпосередньо до обладнання.
Мураха

1
Коли кодувати збірку, я б робив те, що роблять всі інші - коментувати кожен рядок із тим, що він робить. У рядку, про який йдеться, було б зауваження "перевірити, чи букву дорівнює 0", оскільки в коді використовуються рядки 0-завершеного стилю C. З цього коментаря на місці легко зрозуміти, що код робить cmp з 1, а це означає, що він або застряє в нескінченному циклі, або друкує сміття, поки не потрапить у випадкову 1 в оперативній пам'яті. Я також міг би додати коментар щодо того, що рядки були завершені 0, що не видно з коду. Чи існує таке поняття, як автоматичне тестування одиниць для складання кодування?
Мураха

2

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

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

Також коментарі дуже корисні, додаючи «застереження» на кшталт «Будьте обережні! Якщо формат вводу не ASCII, цей код доведеться змінити!»


Чи можете ви пояснити, що ви маєте на увазі під "коментарями, які поновлюють блок коду"?
Марк C

2

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

Справжні програмісти не пишуть коментарів - якщо важко було написати, важко було б прочитати

Досить старший запах придумує.


2

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

Але що тут говорити про такий тривіальний процес? Отже, ви закінчите писати класику

i++; // add one to the "i" counter.

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

Коментування коду - це НЕ ДОБРЕ. Це НЕОБХІДНЕ РЕЧІ, і Томас Оуенс у верхній відповіді дає чудове пояснення ситуацій, у яких це необхідно. Однак такі ситуації рідко виникають у домашніх завданнях.

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


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

1

Звичайно коментарі - запах коду ...

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

"Зробити це!" каже ваш керівник проекту.

Ви відповідаєте: "Це неможливо зробити".

Вони кажуть: "Тоді ми знайдемо когось іншого".

Ви кажете: "Добре, ну, може, це можна зробити".

А потім проведіть наступну кількість X днів .. тижнів .. місяців .. намагаючись це зрозуміти. Протягом усього процесу ви будете намагатися і провалюватися, і намагатися, і не вдаватись. Ми всі це робимо. Справжня відповідь - це два типи програмістів, ті, що коментують, і ті, які цього не роблять.

1) Ті, хто це робить, або полегшують власну роботу, документуючи для подальшої довідки, коментуючи невдалі підпрограми, які не працювали (запах не видаляє їх після знаходження тієї, що працює.), Або розбиває код з коментарем форматування, сподіваємось, полегшити читання чи розуміння. Серйозно, я не можу їх звинуватити. Зрештою, вони хапаються, і тоді ви маєте це: // dammit this code sucks! swear! curse! i hate it! i am going to write something here to vent my anger!!!!

2) Ті, хто не претендує на супергероя, або живе в печері . Вони просто безрозсудно нехтують іншими людьми і можуть менше піклуватися про код або про те, що він може мати згодом.

Не зрозумійте мене неправильно .. самодокументірованно змінні і функції можуть уникнути цього повністю .. і повірте мені , ви ніколи не можете зробити досить кодові очисток. Але проста правда полягає в тому, що доки ви створюєте резервні копії, ВИНАГО можете видаляти коментарі.


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

1

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

  1. Вам потрібно щось робити в кожному конкретному випадку, і для цього немає хорошої логіки.
  2. Код, швидше за все, зміниться через рік-два, коли закони будуть змінені, і ви хочете знайти його знову швидко.
  3. Хтось редагував код раніше, оскільки не розумів, що робить код.

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


1

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

Тому писати коментарі - це так само важко, як і будь-яке письмове спілкування людини! Письменник повинен мати чітке уявлення про те, хто така аудиторія, і який текст їм знадобиться. Як ви можете дізнатися, хто буде читати ваші коментарі через десять, двадцять років? Що робити, якщо людина походить із зовсім іншої культури? І т.д. Я сподіваюся, що всі це розуміють.

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


0

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

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

Ці коментарі зазвичай мають форму на кшталт:

//xxx what the heck is this doing??

або

// removed in version 2.0, but back for 2.1, now I'm taking out again

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

Дуже правильно. Є причини, чому хороший код може бути не очевидним. Більшу частину часу, хоча здивований код викликає здивування, оскільки він написаний заплутаним чином.
Кен

Схоже, ви не написали код для вбудованих процесорів, у яких у вас є лише 32 кб для відтворення, і те, що робить вашу ставку незрозумілою. Коментарі - рятувальники життя.
швидко_значення

0

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


Набагато краще вбудовувати одиниці в імена змінних, тому поганий програміст не повинен їх запам'ятовувати. Замість "подвійної довжини // в метрах" скажіть "подвійна довжина_м". Найкраще використовувати більш потужну мову, так що ви можете просто сказати Length l; Сила f; Крутний момент t = l * f; друк (t.in (Torque.newtonMeter));
Кевін Клайн

0

Ось моє правило:

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


0

Ні, коментарі не є кодовим запахом, вони просто інструмент, яким можна зловживати.

Приклади хороших коментарів:

// Я думаю, що це в см. Потрібне подальше розслідування!

// Це розумний спосіб робити X

// Список гарантовано не порожній


Третій - поганий коментар ІМО. Чому ні Assert(list.IsEmpty)?
CodesInChaos

@CodeInChaos IMO Assert(!list.isEmpty())- це не зовсім контракт, як у третьому коментарі, а просто поведінка (тобто "киньте IllegalArgumentException, якщо аргумент порожній"), який повинен бути перевірений одиницею, як і будь-яка інша логіка програми. Зверніть увагу на тонку різницю в коментарі, в якому йдеться про те, коли метод може бути використаний, але не вказано поведінки, якщо попередня умова не виконується. Навіть краще, ніж коментар, було б примусово виконувати контракти на збір. Але це виходить за рамки моєї відповіді;)
Андрес Ф.

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

@CodeInChaos я відкликаю свою думку. Ось що говорить Сюнак про твердження . Здається, ви мали рацію. Ну, ви щодня дізнаєтесь щось!
Андрес Ф.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.