Чи є якась логічна причина для автоматичної генерації документації з кодом? [зачинено]


60

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

/// <summary>
/// Initializes a new instance of the <see cref="Person"/> class.
/// </summary>
public Person() ...

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

/// <summary>
/// Riches the text selection changed.
/// </summary>
/// <param name="richTextBox">The rich text box.</param>
private void RichTextSelection_Changed(System.Windows.Controls.RichTextBox richTextBox) ...

Здається, що ставлення до GhostDoc таке: "по суті краще мати якусь формальну XML-документацію", але коли ця документація на 100% зайва, чому? Чи не просто в кращому випадку витратити тонну місця?

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



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

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

2
іноді ви можете надати doc, але не код
Лев,

2
Коротка відповідь: Ні
Томас Едінг

Відповіді:


14

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

Ні. Документація, згенерована GhostDoc, - це котлованна плата (подібно до того, як створення нового класу OO в IDE створює панель керування для класу з конструктором чи іншим). Корисна частина документації - це те, що слідує після додавання котлової панелі.

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


-1. Просто робити вигляд? Це може бути чудово підходить для одного проекту, який більше ніколи не буде використаний. Деякий рівень документації / коментарів потрібен навіть для проекту з однією людиною, якщо його складність більша, ніж у "привіт світу", і якщо ви плануєте взяти проект за шість місяців. У проекті, в якому беруть участь десятки, а то й сотні людей, неподання документа / коментаря може вбити проект.
Девід Хаммен

14
@DavidHammen, я добре знаю, що проект може загинути через недостатню кількість документації. Також "справедливий прихильник" був не порадою до ОП, а критикою колег з ОП.
utnapistim

73

Статистично набраною мовою документація у стилі Javadoc не для авторів, а для споживачів. Автогенерація просто полегшує авторам ведення документації для споживання іншими людьми.

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

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


26

Чи є якась логічна причина для автоматичної генерації документації з кодом?

З чиєї точки зору?

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

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

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


1
За винятком того, що мій приклад показує, що GhostDoc не може генерувати гідну документацію, навіть якщо ім'я насправді не так вже й погано.
Jez

11
Так, деякий менеджер отримує заяву про те, що "ми документуємо весь наш код", а інший менеджер вважає, що в результаті все чудово. Неінформовані залишаються таким чином, але вони все ще щасливі.
JeffO

3
@jez - Звичайно, це просто запах. Іноді це правильно, іноді - ні.
Теластин

1
Відповідь на запитання. Ніцца;)
П'єр Арло

@Jez Ви сказали, що це ім'я не так вже й погано. Однак RichTextSelection_Changedметод може бути простішим у використанні, якщо він належав об’єкту вибору, і якщо він не був названий за типом його параметра. Хоча, як сказав Теластин, це лише запах, який може бути правильним або неправильним для вашого дизайну, і мої пропозиції, ймовірно, не покращать вихід GhostDoc.
декор

21

EDIT : Я неправильно зрозумів початкове запитання; хоча я думаю , генеруючи документацію (тобто не код документи ) може бути надзвичайно цінними (див оригінального відповіді щодо Doxygen нижче), авто-генерації коментарів (що - то , що на насправді робить GhostDoc) звучить з розумом мені. Я не можу зрозуміти, чому хтось очікував би, що програма зможе прочитати не коментований вихідний код та написати коментарі, які справді це прояснять.

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

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

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


Оригінальна відповідь: чому автоматичне вилучення та форматування документації є хорошою ідеєю

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

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

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

Щодо того, для чого нам потрібна документація без коду про поведінку нашого коду, є дві причини:

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

Зауважте, що другий пункт кулі схожий на пункт, який було зроблено ще декількома відповідями щодо менеджерів, які хочуть запевнити (/ похвалитись правами) знати, що певна документація (незалежно від якості) існує для кожного фрагмента вихідного коду; однак такий спосіб її оформлення ігнорує той факт, що документація, що надається зовні, насправді може мати деякі законні переваги.


Чи виводить Doxygen англійською мовою чи просто форматує рядки doc, які вже написані англійською мовою?
декор

3
@dcorking Останнє, хоча воно також намагається впорядкувати все відповідно до статичної структури коду та забезпечити автоматичні гіперпосилання скрізь, де це можливо (а це часто неправильно).
Кайл Странд

2
Власне, це і те, і інше. doxygen аналізує код і коментарі доксигену. Імена класів, імена батьківських класів, імена членів даних, імена функцій, типи аргументів та імена, тип повернення: всі вони походять з розбору коду. Що ці речі означають, випливає з коментарів доксигену. Doxygen скаржиться, якщо елемент, вказаний як \ param в коментарі doxygen, не є аргументом, і його можна зробити для скарги на недокументовані елементи. Крім цих мінімальних перевірок, проблема коментування проти коду все ще є можливою. Це сказав, що я люблю доксиген. Це набагато краще, ніж писати API вручну.
Девід Хаммен

@DavidHammen так Doxygen генерує речення, як-от "Збагачується вибір тексту". (Я не користувався ним уже багато років, і ті ранні версії не породжували англійську мову, яку я пам'ятаю.)
dcorking

@dcorking _ Я не маю найяснішої ідеї, що ти маєш на увазі під цим. Doxygen не може прочитати думку програміста. Хороший приклад того, що можна зробити доксигеном, дивіться на цій сторінці верхнього рівня для Eigen , досить популярного науково-обчислювального пакету C ++. Тикайте навколо! Ви можете побачити деяку документацію, яка, очевидно, написана людьми, іншу, що генерується виключно автоматично, а іншу, що є сумішшю, написаною людиною та створеною автоматично. Якщо йому сказано, doxygen автоматично генерує вентилятор (хто посилається на цю функцію) та вентилятор (що викликає ця функція).
Девід Хаммен

7

Безумовно, автоматизована документація особливо корисна, коли вона може відтворити проникливі, відповідні описи, написані авторами коду. В іншому випадку це просто прославлений автоматичний форматер.

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

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


4
Я не розумію ваш коментар щодо "проходження через вихідний код". Звичайно, в обох випадках ви б шукали щось на кшталт "frobnick mutator" або "frobnickmutator" ... як допомагає створена автоматично створена документація?
Jez

2
@Jez Не кожен, кому потрібно знати про frobnickмутатори, стане розробником програмного забезпечення; вони можуть не розуміти, як шукати вихідний код (що може знадобитися ознайомлення з grep/ cscope/ ack/ тощо), і навіть якщо вони дійсно знайдуть правильний файл, то вони можуть не знайти фактичний вихідний код легко для читання, навіть якщо це добре коментується з точки зору SW. Можливість перегляду індексу або введення в рядок пошуку, а потім перегляд тексту, схожого на частину веб-сторінки, може бути дуже цінною.
Кайл Странд

4
@Jez, Доступний для людини документ для непрограмістів або, принаймні, неекспертів, не є зайвим. Її потрібно. Щоб чітко висловити, що код призначений робити. Він повинен бути захоплений перед тим, як записати будь-який код. І оновлюється в міру зростання знань про проблеми та рішення. Наведені приклади не варто зберігати, але "все це у вихідному коді" - це викидання дитини водою. "Автогенерація" звучить погано, "ніяких документів, гірше читати джерело" - гірше. Це як коли ви запитуєте когось: "Що це робить?" і вони кажуть: "Гм, давайте запустити його та дізнатися!"
Білл IV

6

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

Але можна написати автоматизовані інструменти для документації, які також враховують тіло методу. Як доказ концепції, я написав кульгавий маленький плагін Eclipse, який додає список інших методів, закликаних із документованого методу до Javadoc. (Не кожен виклик, звичайно, можна визначити фільтри, наприклад, по пакету.)

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

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

Оновлення: Звичайно, додаткове запитання (яке слід задати перед написанням будь-якої документації) - це хто цільова аудиторія. Якщо ми документуємо загальнодоступний API для клієнтів цього API, додавання всіх цих деталей реалізації є великим ні-ні, оскільки все, що ви вводите в Javadoc, технічно є частиною API.

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


6

Я не знаю про інші середовища, але коли мова йде про великі (часто з відкритим кодом) PHP-проекти, про які писали інші люди, phpXRef - це абсолютна економія життя (особливо якщо документ розміщено в Інтернеті і Google може його індексувати).

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

Коли це добре прокоментовано, сторінки, що отримують результат, близькі до ідеальної Біблії для кодової бази (для мого використання в будь-якому випадку).

Крім того, мій кращий IDE автоматично генерує блок коментарів (якщо я набираю / **), що робить приблизно 75% роботи коментування для мене. Дивовижно, скільки дурних речей я не зупинив у вчиненні протягом свого кодерного життя лише тому, що мені довелося пояснювати іншим людям (і майбутнім мені), що я роблю. Коли мій коментар до генератора doc більше, ніж метод, зазвичай це означає, що мені не вистачало кави і, можливо, захочеться подумати трохи важче.

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

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

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

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

Автоматичні списки завдань - використання тегу @todo (поширеного для проектів, в яких я можу працювати) означає, що документація може відслідковувати речі, які потребують певної роботи (або функції, за якими визнано відсутні). Знову мій ІДЕ відслідковує це, і тільки воно є хорошим посібником щодо того, що в першу чергу потребує моєї уваги.

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

Отже, причини:

  • Заощаджуючи пізніших розробників масу часу,
  • Відстежуючи, де функції називаються (і визначаються),
  • Точкове кодування,
  • Виявлення (як інший зазначав), коли чогось очевидно не вистачає,
  • Спрощення рефакторингу (ніколи не дуже весело)
  • (У багатьох випадках) отримання уявлення про те, що розробник намагався зробити (припускаючи, що він залишив нотатки).
  • Якщо проект достатньо складний, щоб мати декілька ліцензій (без задоволення), я можу швидко побачити, які ліцензії застосовуються до будь-якого розділу. Справді, це боковий бонус.
  • Отримання уявлення про те, з ким поговорити про файл проекту.
  • Автоматичні списки завдань

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

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


4

Часто добре використовувати генератори документації для створення котлів або коментарів "очікування", які згодом переглядаються фактичними розробниками. Я часто використовую функцію auto-JavaDoc Eclipse для створення коментаря в заголовку з типом параметрів та повернутими вже заповненими значеннями, а потім просто додаю "м'ясо" документації.


3

Як розробник C # я використовую Stylecop, який мандатує коментарі для всіх класів, методів тощо. Я автоматично генерую ці коментарі за допомогою інструменту. У більшості випадків коментарі, що створюються інструментом, є достатніми і про них можна зробити висновок за назвою об'єкта, наприклад, у класу Person є і поле ідентифікатора.

ЯКЩО я хочу далі прокоментувати не очевидний метод, дуже просто розгорнути документацію котлоагрегату та кілька пояснень того, що це робить. Як приклад: у мене в класі Person є метод, який повертає FirstName + прізвище, але я додав трохи доку про те, що відбувається, коли одного з обох немає.

Коротше кажучи: я вважаю, що документ котла може бути згубним, якщо ви ніколи не змінюєте текст, наданий генератором. У цьому випадку це просто шум лінії. Але якщо ви бачите їх як шаблон, вони знижують планку для надання хороших та корисних коментарів для себе чи своїх споживачів. Чи можете ви написати коментарі, не автогенеруючи їх? Звичайно, але вам доведеться дотримуватися формату (який у випадку C # є досить багатослівним і дратівливим для створення вручну), і це знижує ймовірність того, що ви дійсно надасте цей коментар у спільноті.


Таке правило Stylecop можна відключити. Правило SA1600, якщо я не помиляюся.
Їжак

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

3

Уникайте тавтології

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

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

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

Не кожна річ повинна бути задокументована вручну

Такі речі, як getXXX / setXXX, повинні пояснювати себе, тому автогенеруюча документація, яка просто дає вам знати, що існує, буде добре прийнята.


2

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

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

Найменш досконалі користувачі не оцінять це з протилежної причини; вони все одно не зрозуміли б це.

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


0

на просту відповідь "чому генерувати документи" можна просто відповісти, показавши MSDN.

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

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

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

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

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