Следует ли добавить комментарии Javadoc к реализации? - PullRequest
99 голосов
/ 17 июня 2010

Правильно ли добавлять комментарии Javadoc в интерфейс и добавлять комментарии не-Javadoc в реализацию?

Большинство IDE генерируют комментарии не-JavaDoc для реализаций при автоматической генерации комментариев.Разве конкретный метод не должен иметь описание?

Ответы [ 7 ]

59 голосов
/ 17 июня 2010

Для методов, которые только для реализации (не переопределяют), конечно, почему бы и нет, особенно если они общедоступны.

Если у вас сложная ситуация и вы собираетесь копировать любой текст, то определенно нет. Репликация - верный способ вызвать расхождения. В результате пользователи будут по-разному понимать ваш метод в зависимости от того, проверяют ли они метод в супертипе или подтипе. Используйте @inheritDoc или не предоставляйте документацию - в среде IDE будет использоваться наименьший доступный текст для использования в представлении Javadoc.

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

Решение этой проблемы было одной из основных функций инструмента-прототипа, который я создал - всякий раз, когда вы вызывали метод, вы получали указание на то, содержала ли его цель или какие-либо потенциальные приоритетные цели важную информацию (например, конфликтующее поведение). Например, при вызове метода put на карту вам напомнили, что если ваша реализация представляет собой TreeMap, ваши элементы должны быть сопоставимы.

24 голосов
/ 17 июня 2010

И реализация, и интерфейс должны иметь Javadoc.С помощью некоторых инструментов вы можете наследовать документацию интерфейса с ключевым словом @inheritDoc.

/**
 * @inheritDoc
 *
 * This implementation is very slow when b equals 3.
 */
public foo(int b)
{ ... }
20 голосов
/ 17 июня 2010

Хорошей практикой является поставить

/**
 * {@inheritDoc}
 */

как javadoc реализации (если нет необходимости объяснять детали реализации).

15 голосов
/ 11 октября 2016

Как правило, когда вы переопределяете метод, вы придерживаетесь контракта, определенного в базовом классе / интерфейсе, поэтому вы все равно не хотите изменять исходный javadoc. Поэтому использование тега @inheritDoc или @see, упомянутого в других ответах, не требуется и фактически служит только шумом в коде. Все разумные инструменты наследуют метод javadoc от суперкласса или интерфейса, как указано здесь :

Inherit from classes and interfaces - Inheriting of comments occurs in all
three possible cases of inheritance from classes and interfaces:

- When a method in a class overrides a method in a superclass
- When a method in an interface overrides a method in a superinterface
- When a method in a class implements a method in an interface

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


Конечно, может быть и обратный случай, когда вы действительно хотите добавить комментарий к переопределяющему методу (обычно некоторые дополнительные детали реализации или сделать контракт немного более строгим). Но в этом случае вы почти никогда не захотите делать что-то вроде этого:

/**
 * {@inheritDoc}
 *
 * This implementation is very, very slow when b equals 3.
 */

Почему? Потому что унаследованный комментарий может быть очень длинным. В таком случае, кто заметит дополнительное предложение в конце 3 длинных параграфов? Вместо этого просто запишите часть вашего собственного комментария и все. Все инструменты javadoc всегда показывают какую-то Указанную ссылку, по которой вы можете щелкнуть, чтобы прочитать комментарий базового класса. Нет смысла их смешивать.

6 голосов
/ 17 июня 2010

@ см. Генерирует ссылку на описание в интерфейсе. Но я думаю, что было бы неплохо добавить некоторые подробности о реализации.

4 голосов
/ 17 июня 2010

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

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

0 голосов
/ 17 июня 2010

Ради сгенерированного javadoc да это имеет значение.Если вы объявляете ссылки на конкретную реализацию, используя только интерфейс, то этого не происходит, поскольку методы интерфейса будут извлечены IDE.

...