Следует ли добавлять комментарии Javadoc к реализации?
правильно ли добавлять комментарии Javadoc в интерфейс и добавлять комментарии, отличные от Javadoc, в реализацию?
большинство IDE генерируют комментарии без JavaDoc для реализаций при автоматическом создании комментариев. Разве конкретный метод не должен иметь описание?
7 ответов:
для методов, которые являются только реализацией (не переопределяет), конечно, почему бы и нет, особенно если они являются общедоступными.
Если у вас есть переопределяющая ситуация, и вы собираетесь реплицировать любой текст, то определенно нет. Репликация-это верный способ вызвать расхождения. В результате пользователи будут иметь другое представление о вашем методе, основанное на том, изучают ли они метод в супертипе или подтипе. Используйте
@inheritDoc
или не предоставляйте документацию-IDE будут принимать самый низкий доступный текст для использования в их представлении Javadoc.в стороне, если ваша переопределяющая версия добавляет материал в документацию супертипа, вы можете оказаться в мире неприятностей. Я изучил эту проблему во время моего PhD и обнаружил, что в целом люди никогда не будут знать о дополнительной информации в переопределяющей версии, если они вызывают через супертип.
решение этой проблемы было одной из основных особенностей прототипа инструмента, который я построил-всякий раз, когда вы вызвали метод, вы получили указание, содержит ли его цель или любые потенциальные переопределяющие цели важную информацию (например, конфликтное поведение). Например, при вызове put on a map вам напомнили, что если ваша реализация является TreeMap, ваши элементы должны быть сопоставимы.
и реализация, и интерфейс должны иметь javadoc. С помощью некоторых инструментов можно наследовать документацию интерфейса с ключевым словом @inheritDoc.
/** * @inheritDoc * * This implementation is very slow when b equals 3. */ public foo(int b) { ... }
несколько хорошей практикой является поставить
/** * {@inheritDoc} */
как javadoc реализации (если нет чего-то дополнительного, чтобы быть объясненным о деталях реализации).
как правило, при переопределении метода вы придерживаетесь контракта, определенного в базовом классе / интерфейсе, поэтому вы не хотите изменять исходный 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
дело в том, что некоторые инструменты (я смотрю на вас, Затмение!) генерируйте их по умолчанию, когда переопределение метода - это только печальное положение вещей, но не оправдывает загромождение вашего кода бесполезным шумом.
конечно, может быть противоположный случай, когда вы действительно хотите добавить комментарий к переопределяющему методу (обычно некоторые дополнительные детали реализации или сделать контракт немного более строгим). Но в этом случае, вы почти никогда не хотите сделать что-то вроде этого:
/** * {@inheritDoc} * * This implementation is very, very slow when b equals 3. */
Почему? Потому что унаследованное комментарий может быть очень длинным. В таком случае, кто заметит дополнительное предложение в конце 3 длинных абзацев?? Вместо этого просто запишите часть своего собственного комментария, и все. Все инструменты javadoc всегда показывают какой-то указано ссылка, которую вы можете нажать, чтобы прочитать базу комментарий. Нет смысла их смешивать.
@см. Он генерирует ссылку на описание в интерфейсе. Но я думаю, что это хорошо, чтобы добавить некоторые подробности о реализации.
Sjoerd правильно говорит, что и интерфейс, и реализация должны иметь JavaDoc. Интерфейс JavaDoc должен определить контракт метода - что должен делать метод, какие входные данные он принимает, какие значения он должен возвращать, и что он должен делать в случае ошибки.
в документации по реализации следует отметить расширения или ограничения контракта, а также соответствующие детали реализации, особенно производительность.