Простые комментарии Getter / Setter

Какое соглашение вы используете для комментирования геттеров и сеттеров? Вот то, что я задавался вопросом довольно долгое время, например:

/**
 * (1a) what do you put here?
 * @param salary (1b) what do you put here?
 */
public void setSalary(float salary);

/*
 * (2a) what do you put here?
 * @return (2b)
 */
public float getSalary();

Я всегда обнаруживаю, что пишу одно и то же для 1a / b и 2a / b, что-то вроде 1a) Устанавливает зарплату сотрудника, 1b) зарплату сотрудника. Это кажется таким излишним. Теперь я мог видеть что-то более сложное, что вы могли бы написать больше в частях (а), чтобы дать контекст, но для большинства геттеров / сеттеров формулировка почти такая же.

Мне просто любопытно, для простых геттеров / сеттеров нормально заполнять только часть (a) ИЛИ часть (b).

Что вы думаете?


person ThaDon    schedule 22.06.2009    source источник
comment
Кроме того, пожалуйста, никогда не используйте float для каких-либо денежных показателей (например, зарплаты). См., Например, stackoverflow.com/questions/965831/   -  person Jonik    schedule 22.06.2009
comment
Вместо этого используйте BigDecimal.   -  person Josep    schedule 04.04.2013


Ответы (14)


Обычно я просто заполняю часть параметров для сеттеров и часть @return для геттеров:

/**
 * 
 * @param salary salary to set (in cents)
 */
public void setSalary(float salary);

/**
 * @return current salary (in cents, may be imaginary for weird employees)
 */
public float getSalary();

Таким образом, инструменты проверки javadoc (например, предупреждения Eclipse) будут чистыми и не будут дублироваться.

person sleske    schedule 22.06.2009
comment
Вы можете исправить опечатку? @return часть для сеттеров - person Jonik; 22.06.2009
comment
Я думаю, что мне больше всего нравится этот ответ, так как в нем нет избыточности, и такие вещи, как cobertura, не заставят его выглядеть так, будто кодер бездельничает с его / ее комментариями - person ThaDon; 23.06.2009
comment
Также есть опечатка в комментарии salary (). Это не комментарий JavaDoc. - person Fostah; 23.06.2009
comment
Я согласен, что это лучший подход к комментированию аксессуаров. - person Fostah; 23.06.2009
comment
Я думаю, что "s" в "salary" здесь должно быть в нижнем регистре, принимая во внимание то, как они отображаются в выводе Javadoc (они не в начале предложения. Этот глюк Javadoc - моя любимая мозоль). - person Trejkaz; 22.10.2010
comment
Мне кажется неправильным добавлять шум в ваш код для того, чтобы заглушить чересчур педантичные предупреждения от наших инструментов. Если это не добавляет ценности программисту, то правильным решением было бы уменьшить / исправить многословие инструментов и / или уменьшить то, насколько мы заботимся о прыжках через обручи, чтобы инструменты вознаграждали нас. Инструменты анализа призваны помогать нам и экономить силы, а не создавать для нас более бессмысленные задачи. - person Lyle; 23.03.2011
comment
Результатом этого является то, что теперь алфавитное резюме метода не содержит вообще никакого текста для этих методов. Это может быть хорошо или плохо в зависимости от точки зрения. - person Paŭlo Ebermann; 24.12.2011
comment
@Lyle Это может быть правдой, но я чувствую, что почти всегда есть что-то полезное, что программист может сказать, что описывает геттер / сеттер лучше, чем просто сигнатура метода. Да, есть случаи, когда программист ленив и просто повторяет сигнатуру метода в комментарии, но я думаю, что, вообще говоря, принудительное поведение полезно. - person Matt Vukas; 22.09.2014

Абсолютно бессмысленно - вам будет лучше без этой чуши, загромождающей ваш код:

/**
 * Sets the foo.
 * 
 * @param foo the foo to set
 */
public void setFoo(float foo);

Очень полезно, если это необходимо:

/**
 * Foo is the adjustment factor used in the Bar-calculation. It has a default
 * value depending on the Baz type, but can be adjusted on a per-case base.
 * 
 * @param foo must be greater than 0 and not greater than MAX_FOO.
 */
public void setFoo(float foo);

В частности, объяснение того, что на самом деле означает свойство, может иметь решающее значение в моделях предметной области. Всякий раз, когда я вижу боб, полный свойств с непонятными названиями, понятными только инвестиционным банкирам, биохимикам или квантовым физикам, и в комментариях объясняется, что метод setGobbledygook () «устанавливает тупик», я хочу кого-нибудь задушить.

person Michael Borgwardt    schedule 22.06.2009
comment
По моему мнению, хуже всего являются модели, ориентированные на конкретную предметную область, где только эксперт в предметной области знает, что, черт возьми, означает свойство. - person ThaDon; 23.06.2009
comment
Даже если это будет полезно, что бы вы сделали для getFoo (). Скопируете ли вы тот же комментарий для getFoo ()? - person Vinoth Kumar C M; 15.09.2011
comment
@cmv: Очевидно, что часть параметров не будет скопирована. Я не уверен, оправдывает ли ценность наличия информации, прикрепленной к обоим аксессорам, прямое дублирование информации. Возможно - да. Еще лучше было бы прикрепить один комментарий к обоим; Я считаю, что это доступно в Project Lombok. - person Michael Borgwardt; 15.09.2011
comment
@VinothKumar: может быть, было бы лучше просто объяснить свойство в геттере (как в Foo - это коэффициент настройки, используемый в вычислении Bar.) И эффекты изменения значения в сеттере (или необходимо ли это или нет для инициализации этого значения - в примере ответа нет необходимости инициализировать Foo, поскольку он имеет значение по умолчанию, зависящее от типа Baz). - person freitass; 04.05.2013
comment
+1 за непонятные имена, понятные только инвестиционным банкирам, биохимикам или квантовым физикам - person Jackson; 31.05.2014

В общем, ничего, если я могу помочь. Геттеры и сеттеры не требуют пояснений.

Я знаю, что это звучит как отказ от ответа, но я стараюсь использовать свое время, чтобы комментировать вещи, требующие объяснения.

person Eric Wendelin    schedule 22.06.2009
comment
Еще один верный ответ в этом направлении может заключаться в проектах с геттерами и сеттерами, которые неправильно понимают понятие инкапсуляции :) - person Trejkaz; 22.10.2010
comment
@Trejkaz: Неправда, потому что методы доступа допускают свойства только для чтения или только для записи, а также для полиморфизма (и, следовательно, обертывания, проксирования и т. Д.). - person Laurent Pireyn; 29.04.2011
comment
Они могут допускать эти вещи, но часто шаблон построителя может заменить сеттеры (менее изменчивый) или шаблон посетителя может заменить геттеры (более гибкий). - person Trejkaz; 03.05.2011
comment
Я, конечно, люблю и использую шаблон построителя, но поддержка POJO (например, в Hibernate) настолько велика, что геттеры и сеттеры по-прежнему занимают свое видное место, к лучшему или к худшему. Это самое опасное в Java, ИМХО, и после того, как я писал повторяющиеся JavaDocs в течение более десяти лет, я готов подписаться на совет @sleske. - person Michael Scheper; 21.05.2013

Я бы сказал, что беспокоиться о комментировании геттеров и сеттеров можно только в том случае, если у них есть какой-то побочный эффект или требуется какое-то предварительное условие вне инициализации (например: получение удалит элемент из структуры данных или для того, чтобы установить что-то, что вам нужно чтобы сначала поставить x и y на свои места). В противном случае комментарии здесь излишни.

Изменить: Кроме того, если вы обнаружите, что в вашем геттере / сеттере задействовано много побочных эффектов, вы можете изменить геттер / сеттер, чтобы иметь другое имя метода (например, push и pop для стека) [Спасибо за комментарии ниже]

person Gopherkhan    schedule 22.06.2009
comment
возможно, вам следует изменить имена геттеров, у которых есть побочные эффекты, чтобы они были более понятными, поскольку не все разработчики будут читать комментарии. - person akf; 22.06.2009
comment
Это нормально, но для этого необходимо, чтобы пользователи вашего API знали, что если бы были какие-либо побочные эффекты, они были бы задокументированы! - person oxbow_lakes; 22.06.2009
comment
akf, я именно так и думал после публикации :) Думаю, добавлю в свой ответ. - person Gopherkhan; 22.06.2009
comment
но если вы не документируете глупые геттеры и сеттеры (это то, что я тоже предпочитаю!) - как избавиться от предупреждений Eclipse об отсутствии документации javadoc? Я не хочу загромождать свое рабочее пространство подобными предупреждениями, но я также не хочу, чтобы это предупреждение отключалось для всех других методов ... - person Zordid; 14.06.2012

Спросите себя, что вы хотите, чтобы люди видели, когда комментарии просматриваются как JavaDocs (из браузера). Многие говорят, что документация не нужна, потому что это очевидно. Этого не будет, если поле является частным (если вы явно не включите JavaDocs для частных полей).

В твоем случае:

public void setSalary(float s)
public float getSalary()

Непонятно, в чем выражается заработная плата. Это центы, доллары, фунты, юань?

При документировании сеттеров / геттеров мне нравится отделять что от кодировки. Пример:

/**
 * Returns the height.
 * @return height in meters
 */
public double getHeight()

Первая строка говорит, что возвращает высоту. В возвращаемом параметре указывается высота в метрах.

person Steve Kuo    schedule 22.06.2009
comment
Хотя я согласен с вами, я думаю, что нужно убедиться, что комментарии к функциям не соответствуют неверно выбранному, неявному имени функции. - person koni; 31.08.2010
comment
Я большой сторонник JavaDocs, но также большой сторонник самодокументирующегося кода. Так что, по крайней мере, для установщика я бы сделал что-то вроде public void setSalary(float aud) (или, что более реалистично, public void setSalary(BigDecimal aud)). Еще лучше, свойство должно быть типа abstract class CurrencyAmount, которое, в свою очередь, имеет свойства java.util.Currency currency и java.math.BigDecimal amount. Большинство разработчиков, с которыми я работал, ужасно ленивы с JavaDoc, но применение подобного API делает это менее проблематичным. - person Michael Scheper; 21.05.2013
comment
Если единица измерения - это единица СИ, такая как метры / секунды, нет необходимости документировать, если это не единица Si, тогда она должна быть задокументирована или лучше названа, чтобы включать нестандартную единицу, например, heightFeet. - person AlexWien; 21.06.2013

Почему бы им просто не включить тег ссылки, чтобы вы могли комментировать значение поля и ссылку из геттеров и сеттеров.

/**
* The adjustment factor for the bar calculation.
* @HasGetter
* @HasSetter
*/
private String foo;

public String getFoo() {
  return foo;
}

public void setFoo() {
  this foo = foo;
}

Так что документация применима к методам получения и установки, а также к полю (если включены частные javadocs).

person Steve    schedule 16.04.2011
comment
Я согласен. И тогда я понял, зачем вообще писать весь этот шаблон? Смотрите мой ответ о Проекте Ломбок. - person Michael Scheper; 11.02.2014

Этого шаблона можно избежать, используя Project Lombok. Просто задокументируйте переменную поля, даже если она private, и позвольте аннотациям Lombok генерировать правильно задокументированные методы получения и установки.

Для меня одно только это преимущество стоит затрат.

person Michael Scheper    schedule 11.02.2014

Я действительно разочарован ответами, в основном утверждающими, что полное документирование - пустая трата времени. Как клиенты вашего API должны знать, что метод с именем setX является стандартным средством установки свойств JavaBean, если вы не указали это четко в документации?

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

Я уверен, что я не единственный здесь, кто имел несчастье узнать на собственном опыте, что метод с именем setX делает гораздо больше, чем просто устанавливает свойство.

person oxbow_lakes    schedule 22.06.2009
comment
Без документации любой вызывающий будет предположить, что метод с именем setX устанавливает X. Отсюда следует, что если setX действительно устанавливает X, не делая ничего другого важного, тогда вам не нужна документация. - person mqp; 22.06.2009
comment
Замечательно! Теперь эта компания CrudTech, чей API я кодирую, следует вашим соглашениям, или она следует чьим-то еще в этой ветке? Хмммм - person oxbow_lakes; 22.06.2009
comment
Нет смысла писать, устанавливает цену в документе setPrice, если метод просто устанавливает значение для свойства price, но если он также, например, обновляет свойство totalPrice и пересчитывает налог, такое поведение, очевидно, должно быть задокументировано. - person João Marcus; 23.06.2009
comment
Нет; но средство установки свойств JavaBean прекрасно наглядно - person oxbow_lakes; 23.06.2009
comment
Похоже, вы просите документацию указать, что это именно то, что вы ожидаете. Это немного похоже на надпись «Осторожно: ГОРЯЧЕЕ» на чашке кофе. В идеальном мире не было бы нужды говорить такие вещи. - person Kevin Panko; 07.04.2010
comment
Да, используя API, в которых методы, называемые такими вещами, как setX, имели побочные эффекты, отличные от ожидаемых, я действительно могу с уверенностью заявить, что это не идеальный мир. - person oxbow_lakes; 07.04.2010

Если в геттере / сеттере нет специальной операции, я обычно пишу:

С помощью Javadoc (с частным вариантом):

/** Set {@see #salary}. @param {@link #salary}. */
public void setSalary(float salary);

и / или

/** 
 * Get {@see #salary}.
 * @return {@link #salary}.
 */
public float salary();

С Doxygen (с опцией частного извлечения):

/** @param[in] #salary. */
public void setSalary(float salary);

/** @return #salary. */
public float salary();
person TermWay    schedule 15.10.2011
comment
Проблема с этим подходом в том, что Javadoc по умолчанию не генерирует частную документацию! В этом случае ссылочный тег {@see #salary} недействителен в сгенерированной документации. - person Jarek Przygódzki; 15.11.2012

Комментирование аксессуаров, особенно если они нигде не выполняют никаких операций, не нужно и бесполезно.

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

Если же, с другой стороны, ваш person.getFirstName() не возвращает имя человека ... ну, давайте не будем туда ходить, ладно?

person Henrik Paul    schedule 22.06.2009
comment
Что, если getFirstName () вернет null? Где это было бы задокументировано? - person Steve Kuo; 22.06.2009
comment
Как насчет security.getFinalMaturity ()? Не все названия свойств имеют понятное значение. Хотели бы вы, чтобы вас уволили за то, что вы не знали, что это значит? - person Michael Borgwardt; 22.06.2009
comment
Что делать, если метод реализован путем свиззлинга? Откуда вы можете это знать, если это не было четко задокументировано? Откуда вы должны знать, что это установщик стандартов, если это не указано в документации? - person oxbow_lakes; 22.06.2009
comment
get / set, на мой взгляд, следует зарезервировать для геттеров и сеттеров. Поиск в базе данных должен называться lookupPerson или около того. - person Thorbjørn Ravn Andersen; 23.06.2009

Не указывайте ничего, если имя поля достаточно описывает содержимое.

В общем, пусть код будет самодостаточным, и по возможности избегайте комментариев. Это может потребовать рефакторинга.

РЕДАКТИРОВАТЬ: Вышеупомянутое относится только к геттерам и сеттерам. Я считаю, что все нетривиальное нужно должным образом оформить с помощью javadoc.

person Thorbjørn Ravn Andersen    schedule 22.06.2009
comment
Есть разница между комментированием и документированием. - person Tom Hawtin - tackline; 23.06.2009
comment
Совершенно верно. Именно поэтому я не комментирую геттеры и сеттеры. Они должны быть понятными, а добавление комментария указывает на то, что код не требует пояснений. - person Thorbjørn Ravn Andersen; 23.06.2009

можно заполнить часть (b), особенно если вы добавите комментарий к объявлению поля, указывающий, что это за поле.

person akf    schedule 22.06.2009
comment
Ничего хорошего - люди не читают полевые комментарии. Javadoc даже не создает личную документацию по умолчанию, а IDE не показывают вам документацию по полю, когда вы используете быструю справку по вызову метода. - person Trejkaz; 22.10.2010
comment
люди не читают полевые комментарии без необходимости. Если возникнет необходимость, чем больше информации, тем лучше. - person akf; 22.10.2010

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

person Alex B    schedule 22.06.2009

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

person Paul Sonier    schedule 22.06.2009
comment
Они говорят сами за себя, только если вы говорите, что это средство задания свойств. В противном случае клиент API не имеет ни малейшего представления о том, что на самом деле происходит внутри методов. - person oxbow_lakes; 22.06.2009
comment
Кто сказал что-нибудь о самоочевидности? - person Paul Sonier; 22.06.2009