Правила по документированию Python и JS кода

Содержание

  1. Термины и определения
  2. Общие положения
  3. Ручное документирование
  4. Документирование python-кода
  5. Документирование javascript-кода

Термины и определения

reStructuredText (ReST) – язык разметки, предназначенный для документирования программ непосредственно в исходном коде.

Sphinx – генератор документации, преобразующий файлы в формате ReST в другие форматы (HTML, PDF, EPub и др.)

Модуль - набор алгоритмов, классов и других структур, имеющий имя, поставляемых как единое целое, объединенных общей целью и вариантом использования.

Общие положения

Следует разделять документацию модуля и документацию кода. Цель документирования модуля - описание структуры модуля, его вариантов использования, интерфейса взаимодействия с модулем. Цель документирования кода - описание внутренних структур модуля и алгоритмов.

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

Документирование кода является неотъемлемой частью разработки программных продуктов. Оно направлено на описание дополнительных аспектов того, что именно делает код.

Общие правила:

  • Документация пишется на русском языке с соблюдением грамматики и пунктуации;
  • Предложения разделяются пробелами;
  • Комментарии пишутся на русском языке;
  • Используются строки шириной не более 79 символов. Ширина в 79 знаков заполняется максимально полно;
  • В строках документации и комментариях не допускается использование шуток, сленга, ненормативной лексики, «языка паддонкаф» и пр.

Документирование кода ведется с использованием генератора документации Sphinx и языка разметки reStructuredText.

Различаются два типа документирования:

  • Ручное документирование – в этом случае создается отдельный файл документации, в котором формируется текст в соответствии с языком разметки reStructuredText;

  • Документирование кода – в этом случае разработчик делает соответствующую разметку непосредственно в коде. После чего такая документация может использовать различными IDE или при автоматической сборке в режиме ручного документирования.

Ручное документирование

Обычно, документация к модулю состоит из следующих разделов:

  • Общее описание (About, Introduction, Overview)
  • Установка (Installation, Setup, Requirements, Dependencies)
  • Приступая к работе (Tutorial, Basic usage, First steps, Quickstart, Getting started)

Дополнительными разделами могут быть:

  • Расширенное использование (Advanced usage, Tips&Tricks)
  • Интерфейс взаимодействия (API, Command reference, Integration)
  • ЧаВО (FAQ, Common issues)
  • Дополнительные сведения (Resources, Community, Links)

Общее описание

  • Назначение модуля и основной функционал
  • Состав и структура
  • История, предпосылки
  • Лицензия

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

Установка

  • Необходимые библиотеки и другие модули
  • Процесс установки
  • Описание настроек
  • Установка должна описывать зависимости и особенности выполнения установки модуля. Возможные варианты установки. Также должно содержаться описание всех настроек, которые необходимо выполнить при и после установки.

Приступая к работе

  • Описание необходимых условий
  • Простые примеры использования модуля
  • В этом разделе должны описываться самые простые варианты использования модуля с указанием выполняемых действий и кода. Должны содержаться результаты выполнения примеров. Примеров должно быть максимально много, чтобы разобрать все простые варианты использования модуля.
  • Примеры должны показать основные функции модуля в их простом применении. Примеры, которые требуют большей подоготовки и сложного поведения следует вынести в следующий раздел.

Расширенное использование

  • Специальные и критические варианты использования
  • Использование различных настроек

В этом разделе могут быть описаны примеры использования при более тонкой настройке модуля, требующие более глубокого погружения в особенности работы модуля. Также могут быть примеры использования модуля в различных комбинациях настроек.

Интерфейс взаимодействия

  • Описание классов и методов, api-функций, REST-интерфейса
  • Описание команд
  • Описание точек расширения функционала
  • Примеры интеграции и расширений

В этом разделе могут описываться все объекты и функции для обеспечения взаимодействия с модулем. Даются ссылки на автодокументацию по коду. Приводятся примеры и способы расширения и/или изменения функционала модуля.

ЧаВО

  • Частозадаваемые вопросы и ответы
  • Решеные и нерешенные проблемы
  • Особенности и трюки
  • Обработка ошибок

В этом разделе описываются ответы на типичные вопросы, возникающие при использовании модуля. Также, рассматриваются возможные проблемы и способы их ршения (если это возможно). Рассматриваются возможные ошибки и их обработка.

Дополнительные сведения

  • Ссылки на дополнительные ресурсы, форумы, документы
  • Авторы
  • История версий (changelog)

В этом разделе могут содержаться любые иные сведения не описывающие использование модуля, но дополняющие его описание.

Документирование Python кода

Каждый новый создаваемый модуль должен предваряться директивой:

#coding: utf-8

или

# -*- coding: utf-8 -*-

После которой в тройных кавычках идет аннотация к модулю. Аннотация может содержать в себе дату его создания, автора модуля, краткое резюме о предназначении модуля. Например:

"""
Created on 12.05.13

:author: ivanov
Описание моделей
"""

Классы

После строки определения класса должен следовать комментарий в тройных кавычках, о назначении этого класса.

class Account(BaseEnterpriseDictionaryModel):
    """
    Модель плана счетов.
    """

Методы и функции

После строки объявления функции (метода) должен следовать комментарий в тройных кавычках о назначении этой функции. Затем указывается перечень аргументов функции, их типов, возвращаемый результат, а также типы возможных исключений в функции. Описание функции и перечень аргументов необходимо разделять пустой строкой. Также пустой строкой отделяется перечень аргументов с их типами и перечень возвращаемых значений с типами возможных исключений.

Если описание элемента превышает в строке 79 символов, его необходимо перенести на новую строку с обязательным отступом.

Элементы синтаксиса документирования аргументов функций:

Элемент Назначение
:param [тип] имя: Описание параметра функции
:type имя параметра: тип Тип параметра
:return: Описание возвращаемого результата
:rtype: Тип возвращаемого результата
:raise: Тип(ы) возможных исключений

Если тип передаваемого параметра является встроенным типом языка Python, то он указывается с ключевым словом param. В противном случае, он указывается с ключевым словом type. Для возможности перехода к описанию типов программного продукта рекомендуется в параметре type указывать полный путь до типа, например:

web_bb.core.acc_chart.models.Account #  для классов из ядра системы,
web_bb.plugins.ack.models.Budget #  для классов из плагинов.

Пример описания метода:

def create_doc(doc_model, operation, doc_params=None):
    """ Создание документа на основе полученных данных

    :param doc_model: класс модели документа
    :param operation: шаблон операции
    :type operation: web_bb.core.repos.models.DocumentOperations
    :param dict doc_params: словарь параметров, которые будут присвоены
        экземпляру документа

    :return: экземпляр на основе переданной модели документа

    :raise: KeyError

    """

Для переопределяемых методов в наследующих классах допустимо опускать описание только в случае, если описание присутствует в классе-родителе, и в методе потомка используется вызов такого же метода родителя.

Пример 1

Описание метода присутствует в классе-родителе, также используется вызов метода родителя с помощью ключевого слова super. Описание метода можно опустить

def get_rows(self, request, context, query_object):
        query_object.with_parents = True

        # "Соответствие капитальных вложений и счетов НМА" (НМАКапВл)
        # Заложено в фикстурах модуля acc_chart
        acc_group = 12
        acc_list = get_equivalent_accounts_from_group(acc_group)
        query_object.filter = BE(
            'id', BE.IN, acc_list) & query_object.filter

        return super(NMACapInvestAccChartPack, self).get_rows(
            request, context, query_object)

Пример 2

Полностью переопределяется метод родительского класса. Описание обязательно.

class MergeRecordsPack(RecordsPack):

    def validate_row(self, request, context, record, is_new):
        """Выключаем проверку базового класса
        """
        pass

Документирование JavaScript кода

Документирование JavaScript-кода производится с использованием синтаксиса языка JSDoc. Строки документирования заключаются в секции /*/. Все строки документирования помещаются перед определением параметров, функций, классов.

Структура блока документирования

/**
* Описание параметра, функции, класса и т.д.
*
* параметры, типы, возвращаемые результаты
*/

Переменные

/**
 * Счетчик
 * @type {number}
 */
var i = 0;

/**
 * Массив
 * @type {Array}
 */
var d = [];

С помощью ключевого слова type в фигурных скобках отражаем тип переменной.

Функции

/**
 * Проверяет какое-то условие
 *
 * @param а какой-то параметр
 *
 * @returns {boolean}
 */
function myFunction(a) {
    if (a) {
        return true;
    } else {
        return false;
    }
}

С помощью ключевого слова param описываем аргументы функции. С помощью ключевого слова returns описываем возвращаемое значение. В фигурных скобках можно указать типы описываемых элементов.

Классы

/**
 * Создает экземпляр класса MyClass
 *
 * @param {number} x параметр x
 * @param {number} y параметр y
 * @this {MyClass}
 * @constructor
 */
function MyClass(x ,y) {
    this.x = x;
    this.y = y;
}

С помощью ключевого слова constructor указываем, что данная функция является конструктором класса. С помощью ключевого слова this указываем, какого типа будет созданный объект.

Contents © 2014 БАРС Груп - Powered by Nikola