# Правила документирования кода на JavaScript
JSDoc - это стандартный способ документирования кода на JavaScript с помощью специальных комментариев, которые можно извлекать автоматически для создания документации. Вот основные правила введения комментариев JSDoc:
Типы данных: Указывайте типы данных параметров функций и возвращаемого значения. Например:
/** * Функция для сложения двух чисел. * @param {number} a - Первое число. * @param {number} b - Второе число. * @returns {number} Сумма двух чисел. */ function add(a, b) { return a + b; }Описания: При необходимости добавляйте описание для функций, переменных или классов, чтобы пояснить их назначение или особенности. Описания заключаются в текстовые блоки, начинающиеся с символов
/**и заканчивающихся/. Например:/** * Класс, представляющий пользователя. */ class User { // ... }Опциональные параметры: Указывайте, если параметр функции является опциональным, добавляя к нему символ
[]. Например:/** * Функция для умножения двух чисел. * @param {number} a - Первое число. * @param {number} [b=1] - Второе число (опционально, по умолчанию 1). * @returns {number} Произведение двух чисел. */ function multiply(a, b = 1) { return a * b; }Документирование классов и методов: Для классов и их методов также указывайте типы данных входных параметров и возвращаемых значений, а также описания класса и его методов.
/** * Класс, представляющий книгу. */ class Book { /** * Создает новую книгу. * @param {string} title - Заголовок книги. * @param {string} author - Автор книги. */ constructor(title, author) { // ... } /** * Получает информацию о книге. * @returns {string} Информация о книге в формате "Заголовок - Автор". */ getInfo() { // ... } }Использование ссылок: Если вы ссылаетесь на другие функции, классы или переменные в комментариях JSDoc, используйте ссылки для лучшей связи документации. Например:
/** * Функция, которая возвращает случайное число. * @returns {number} Случайное число от 0 до 1. */ function getRandom() { // ... }Использование маркеров: В JSDoc есть различные маркеры, которые позволяют указывать информацию, такую как
@param,@returns,@throws,@deprecated,@private, и другие. Используйте соответствующие маркеры для правильного оформления документации.Документирование модулей и пространств имен: Если вы используете модули или пространства имен, документируйте их, чтобы обеспечить понимание их назначения и использования.
Описание маркеров JSDoc
@param: Описывает параметры функции или метода.
Пример:/** * Функция для сложения двух чисел. * @param {number} a - Первое число. * @param {number} b - Второе число. */ function add(a, b) { // ... }@returns: Описывает возвращаемое значение функции или метода.
Пример:/** * Функция для умножения двух чисел. * @param {number} a - Первое число. * @param {number} b - Второе число. * @returns {number} Произведение двух чисел. */ function multiply(a, b) { // ... }@throws: Описывает исключения, которые может выбросить функция или метод.
Пример:/** * Функция для деления двух чисел. * @param {number} dividend - Делимое. * @param {number} divisor - Делитель. * @returns {number} Частное двух чисел. * @throws {Error} Ошибка, если делитель равен 0. */ function divide(dividend, divisor) { if (divisor === 0) { throw new Error("Деление на ноль недопустимо."); } // ... }@deprecated: Указывает, что функция, метод, класс или переменная устарела и может быть удалена в будущих версиях. Рекомендуется использовать другой альтернативный подход.
Пример:/** * Функция для вычисления квадрата числа (устаревшая, используйте функцию `calculateSquare`). * @deprecated * @param {number} x - Число, для которого нужно вычислить квадрат. * @returns {number} Квадрат числа. */ function square(x) { return x * x; }@private: Указывает, что функция, метод или переменная являются приватными и предназначены только для внутреннего использования внутри модуля, класса или объекта. Не следует использовать их вне данного контекста.
Пример:/** * Класс, представляющий пользователя. * @class * @private */ class User { // ... }@typedef: Позволяет создавать свои пользовательские типы данных (алиасы) для улучшения понимания кода.
Пример:/** * @typedef {Object} User * @property {string} name - Имя пользователя. * @property {number} age - Возраст пользователя. */@enum: Описывает перечисление (enum) - набор именованных константных значений.
Пример:/** * @enum {string} * @property {string} RED - Красный цвет. * @property {string} GREEN - Зеленый цвет. * @property {string} BLUE - Синий цвет. */ const Colors = { RED: 'red', GREEN: 'green', BLUE: 'blue' };@namespace: Позволяет описывать пространства имен для группировки связанных функций, классов и переменных.
Пример:/** * Пространство имен для работы с математическими операциями. * @namespace */ const MathUtils = { // ... };@callback: Описывает тип функции обратного вызова (callback).
Пример:/** * Функция, выполняющая операцию над числами. * @callback MathOperation * @param {number} a - Первое число. * @param {number} b - Второе число. * @returns {number} Результат операции. */@class: Описывает конструктор класса и его свойства/методы.
Пример:/** * Класс, представляющий книгу. * @class */ class Book { /** * Создает новую книгу. * @constructor * @param {string} title - Заголовок книги. * @param {string} author - Автор книги. */ constructor(title, author) { // ... } /** * Получает информацию о книге. * @returns {string} Информация о книге в формате "Заголовок - Автор". */ getInfo() { // ... } }@readonly: Помечает свойство объекта как доступное только для чтения (read-only).
Пример:/** * Объект с информацией о книге. * @readonly * @type {object} * @property {string} title - Заголовок книги. * @property {string} author - Автор книги. */ const bookInfo = { title: "Название книги", author: "Имя автора" };@example: Предоставляет пример использования функции, класса или метода.
Пример:/** * Функция для сложения двух чисел. * @param {number} a - Первое число. * @param {number} b - Второе число. * @returns {number} Сумма двух чисел. * @example * // Пример использования: * const result = add(5, 3); * // Результат: 8 */ function add(a, b) { return a + b; }@inheritdoc: Указывает, что документацию для данного элемента следует взять из другого места (родительского класса или метода).
Пример:/** * Класс, представляющий книгу. * @class */ class Book { /** * Получает информацию о книге. * @returns {string} Информация о книге в формате "Заголовок - Автор". */ getInfo() { // ... } } /** * Класс, представляющий электронную книгу. * @class * @extends Book */ class EBook { /** * @inheritdoc */ getInfo() { // ... } }@link: Создает ссылку на связанный ресурс, например, на документацию или веб-страницу.
Пример:/** * Функция для работы с массивами. * См. {@link <https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array>} * @param {Array} arr - Входной массив. */ function processArray(arr) { // ... }@augments (или @extends): Указывает на родительский класс, от которого наследуется данный класс.
Пример:
/**
* Класс, представляющий животное.
* @class
*/
class Animal {
// ...
}
/**
* Класс, представляющий кошку.
* @class
* @augments Animal
*/
class Cat extends Animal {
// ...
}
- @this: Указывает тип контекста
thisдля метода или функции.
Пример:
/**
* Функция для умножения числа на коэффициент.
* @param {number} coefficient - Коэффициент.
* @this {number}
*/
function multiplyByCoefficient(coefficient) {
return this * coefficient;
}
- @typedef: Создает пользовательский тип данных (алиас) для повторного использования.
Пример:
/**
* @typedef {Object} Book
* @property {string} title - Заголовок книги.
* @property {string} author - Автор книги.
*/
- @template (или @generic): Описывает параметры шаблона для обобщенных типов (generic) в классах или функциях.
Пример:
/**
* Класс для хранения пары значений.
* @template T, U
*/
class Pair {
// ...
}
- @borrows: Позволяет "заимствовать" документацию из другого объекта или функции.
Пример:
/**
* @borrows SomeClass#someMethod as myMethod
*/
- @inheritdoc (или @override): Указывает, что данный метод или свойство наследует документацию из базового класса, но может быть переопределено.
Пример:
/**
* Базовый класс для всех фигур.
* @class
*/
class Shape {
/**
* Вычисляет площадь фигуры.
* @returns {number} Площадь.
*/
calculateArea() {
// ...
}
}
/**
* Класс, представляющий квадрат.
* @class
* @extends Shape
*/
class Square extends Shape {
/**
* @inheritdoc
*/
calculateArea() {
// ... Переопределение логики для квадрата ...
}
}
- @record: Описывает структуру данных (запись), которая используется для представления простых объектов без методов.
Пример:
/**
* @record
* @typedef {Object} Person
* @property {string} name - Имя человека.
* @property {number} age - Возраст человека.
*/
- @global: Описывает переменные или свойства, которые доступны в глобальной области видимости.
Пример:
/**
* Глобальная переменная, содержащая настройки приложения.
* @global
* @type {object}
*/
var appConfig = {
// ...
};