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


124

Яку умову ви використовуєте, щоб коментувати геттерів та сетерів? Це те, про що я задався питанням, наприклад:

/**
 * (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) зарплату працівника. Це просто здається таким зайвим. Тепер я міг побачити щось складніше, що ви можете написати більше в (а) частинах, щоб надати контексту, але для більшості учасників / сеттерів формулювання майже точно таке.

Мені просто цікаво, якщо для простих гетерів / сеттерів нормально заповнити лише (а) частину АБО (б) частину.

Що ти думаєш?


54
В сторону, будь ласка, не використовуйте float ні для чого грошового (наприклад, тут зарплати). Дивіться, наприклад, stackoverflow.com/questions/965831/…
Jonik

3
Використовуйте натомість BigDecimal.
Хосеп

Відповіді:


83

Зазвичай я просто заповнюю парам-частину для сетерів, а частину @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) вийдуть чистими, а дублювання не буде.


Чи можете ви виправити друкарську помилку? "@return part for setters"
Jonik

1
Існує також помилка в коментарі до зарплати (). Це не коментар JavaDoc.
Фоста

1
Я погоджуюся, що це найкращий підхід до коментування доступу.
Фоста

31
Додавання шуму до вашого коду заради приглушення надмірно педантичного попередження від наших інструментів мені здається неправильним. Якщо це не додасть програмісту значення, то правильним рішенням буде зменшити / виправити багатослівність інструментів та / або полегшити те, наскільки ми дбаємо про стрибки через обручі, щоб інструменти винагороджували нас. Інструменти аналізу повинні допомогти нам і заощадити зусилля, а не створювати для нас більш безглузді завдання.
Lyle

1
@Lyle Це може бути правдою, але я відчуваю, що майже завжди є щось корисне, що програміст може сказати, що описує геттера / сеттера краще, ніж просто підпис методу. Так, бувають випадки, коли програміст лінивий і просто повторює підпис методу в коментарі, але я вважаю, що загалом кажучи, це корисна поведінка змусити.
Метт Вукас

174

Абсолютно безглуздо - вам краще без подібних лайків, що захаращують ваш код:

/**
 * 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 () "задає гобблдигук", я хочу когось задушити.


2
Мої настрої точно, найгірше - це моделі, що стосуються конкретних доменів, де лише експерт по домену знає, що означає властивість майна.
ThaDon

7
Навіть якщо це корисно, що б ви зробили для getFoo (). Чи скопіюєте ви такий самий коментар і для getFoo ()?
Vinoth Kumar CM

3
@cmv: Очевидно, "парам" частина не буде скопійована. Я не визначився, чи значення обкладинки інформації обох постачальників виправдовує дублювання інформації. Напевно, так. Ще краще було б способом долучити один коментар до обох; Я вважаю, що це доступно в Project Lombok.
Майкл Боргвардт

@VinothKumar: можливо, було б приємніше просто пояснити властивість в getter (як у "Foo - це коефіцієнт коригування, який використовується в Bar-обчисленні") і наслідки зміни значення в сеттері (або це необхідно або не ініціалізувати це значення - у прикладі відповіді не потрібно ініціалізувати Foo, оскільки "воно має значення за замовчуванням залежно від типу Baz").
фрейтас

+1 за "незрозумілі імена, які розуміють лише банкіри-інвестори, біохіміки або квантові фізики"
Джексон,

36

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

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


5
Наступною правильною відповіддю може бути "конструкції з геттерами та сеттерами неправильно розуміють поняття інкапсуляції" :)
Trejkaz

2
@Trejkaz: Неправда, тому що методи аксесуарів допускають властивості лише для читання або запису, а також поліморфізм (і так обгортання, проксі та ін.).
Лоран Пірейн

2
Вони можуть допускати ці речі, але часто модель будівельника може замінити сетерів (менш змінних) або шаблон відвідувача може замінити геттери (більш гнучкі.)
Трейказ

Мені, звичайно, подобається і використовую схему builder, але існує стільки підтримки POJO (наприклад, в сплячому режимі), що геттери та сетери все ще займають своє дуже помітне місце - на краще чи на гірше. Це найсміливіша річ щодо Java, IMHO, і після написання повторюваних JavaDocs протягом більше десяти років я готовий підписатися на поради @ sleske.
Майкл Шепер

34

Я б сказав, що хвилюйтеся лише щодо коментування одержувачів та сетерів, якщо вони мають якийсь побічний ефект або потребують певної передумови поза ініціалізацією (тобто: отримання видалить елемент із структури даних або для того, щоб встановити щось необхідне щоб спочатку були місця x і y). Інакше коментарі тут досить зайві.

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


10
Можливо, ви повинні змінити назву отримувачів, які мають побічні ефекти, щоб бути більш зрозумілими, оскільки не всі розробники будуть читати коментарі.
akf

Це добре - але це вимагає, щоб користувачі вашого API знали, що якби були побічні ефекти, вони були б задокументовані !
oxbow_lakes

akf, я думав саме про це після публікації :) Я думаю, я додам це до своєї відповіді.
Гоферхан

1
але якщо ви не документуєте "дурних" геттерів та сеттерів (це теж те, що я віддаю перевагу!) - як ви позбудетеся попереджень Eclipse про відсутній javadoc? Я не хочу захаращувати свою робочу область подібними попередженнями, але також не хочу, щоб це попередження було відключено для всіх інших методів ...
Zordid

12

Запитайте себе, що ви хочете, щоб люди бачили, коли коментарі розглядаються як JavaDocs (з браузера). Багато людей кажуть, що документація не потрібна, оскільки це очевидно. Це не буде затримано, якщо поле приватне (якщо ви явно не включите JavaDocs для приватних полів).

У вашому випадку:

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

Незрозуміло, в чому виражена зарплата. Це центи, долари, фунти, юані?

Документуючи сетери / геттери, я люблю відокремлювати те, що від кодування. Приклад:

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

Перший рядок каже, що повертає висоту. Параметр повернення документує висоту в метрах.


1
хоча я погоджуюся з вами, я думаю, що потрібно переконатися, що коментарі до функцій не видають неправильно вибране, не явне ім'я функції.
karlipoppins

Я великий прихильник JavaDocs, але також великий прихильник коду самодокументування. Тож для сетера принаймні я б зробив щось на кшталт public void setSalary(float aud)(або більш реально public void setSalary(BigDecimal aud)). Ще краще, властивість має бути типу abstract class CurrencyAmount, яка, у свою чергу, має властивості java.util.Currency currencyта java.math.BigDecimal amount. Більшість розробників, з якими я працював, страшенно ледачі з JavaDoc, але застосування таких програм API робить це менш проблемою.
Майкл Шепер

Якщо одиниця є одиницею SI, такою як метри / секунди, потрібно менше документувати, якщо це не одиниця Si, то вона повинна бути задокументована або краще названа для включення нестандартної одиниці, наприклад, висота столу
AlexWien

8

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

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

public String getFoo() {
  return foo;
}

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

Так що документація стосується геттера та сеттера, а також поля (якщо ввімкнено приватний javadocs).


Я згоден. І тоді я зрозумів, навіщо взагалі писати всю цю котельню? Дивіться мою відповідь про Project Lombok.
Майкл Шепер

7

Такого типу котельних плит можна уникнути, використовуючи Project Lombok . Просто задокументуйте змінну поля, навіть якщо вона є private, і нехай анотації Lombok генерують належним чином задокументовані геттери та сетери.

Для мене ця вигода сама по собі коштує витрат .


4

Я дуже розчарований у відповідях, кажучи, що всебічне документування - це марна трата часу. Як клієнти вашого API повинні знати, що метод, який називається, setXє стандартним налаштуванням властивостей JavaBean, якщо ви не чітко сказали в документації ?

Без документації абонент не мав би поняття, якби у методу були будь-які побічні ефекти, крім схрещування пальцями щодо очевидних умов, що дотримуються.

Я впевнений, що я не єдиний, хто мав нещастя, коли з'ясував важкий шлях, що названий метод setXробить набагато більше, ніж просто встановити властивість.


11
Без документації будь-який абонент може припустити, що метод під назвою setX встановлює X. Звідси випливає, що якщо setX насправді встановлює X, не роблячи нічого іншого важливого, тоді вам документація не потрібна.
mqp

Це чудово! Тепер ця компанія CrudTech, чий API я кодую, дотримується вашої конвенції, чи вона дотримується когось іншого в цій темі? Хммм
oxbow_lakes

5
Немає сенсу писати "встановлює ціну" в документі setPrice, якщо метод просто встановлює значення цінової властивості, але якщо він також, наприклад, оновлює властивість totalPrice і перераховує податок, така поведінка, очевидно, повинна бути задокументована.
Жоао Маркус

8
Ви, здається, просите документацію, щоб сказати "Це робить те, що ви очікуєте". Що трохи нагадує написання "Обережно: гаряче" на чашці кави. У досконалому світі не потрібно було б ніколи говорити подібних речей.
Кевін Панько

1
Так - використовуючи API, де методи, які називали такі речі, setXмали інші побічні ефекти, ніж очікувані, я дійсно можу впевнено констатувати, що це не ідеальний світ.
oxbow_lakes

4

Якщо в getter / setter немає спеціальної операції, я зазвичай пишу:

З Javadoc (з приватною опцією):

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

та / або

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

За допомогою Доксигену (з приватним екстрактом):

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

/** @return #salary. */
public float salary();

2
Проблема такого підходу полягає в тому, що Javadoc не створює приватну документацію за замовчуванням! У цьому випадку посилальний тег {@see #salary}недійсний у створеній документації.
Jarek Przygódzki

1

Коментувати аксесуарів, особливо якщо вони ніде не роблять жодних операцій, є непотрібним і марним шляхом.

Якщо хтось, читаючи ваш код, не може зрозуміти, що person.getFirstName()повертає ім’я людини, вам слід спробувати все, що у вас є, щоб звільнити його. Якщо вона робить якусь магію бази даних, кидає кілька кісток, закликає секретаря перших імен, щоб отримати ім'я, можна припустити, що це нетривіальна операція, і добре це задокументувати.

Якщо, з іншого боку, ваше person.getFirstName()не поверне прізвище людини ... ну, не давайте туди, чи не так?


6
Що робити, якщо getFirstName () повертає null? Де це було б зафіксовано?
Стів Куо

Як щодо security.getFinalMatmature ()? Не всі назви властивостей мають негайно зрозуміле значення. Чи хотіли б вас звільнити за те, що не знаєте, що це означає?
Майкл Боргвардт

Що робити, якщо метод реалізований шиплячими? Як ви повинні це знати, якщо це чітко не зафіксовано? Як ви повинні знати, що це стандартний сетер, якщо доктор не каже, що це?
oxbow_lakes

2
get / set повинен, на мою думку, бути зарезервованим для жителів та сеттерів. Пошукові бази даних повинні бути названі як "lookupPerson" або так.
Thorbjørn Ravn Andersen

1

Нічого не вкладайте, якщо назва поля вміщує опис вмісту.

Як правило, нехай код стоїть самостійно, і уникайте коментування, якщо це можливо. Це може зажадати рефакторингу.

РЕДАКТИРУВАННЯ: Вищезазначене стосується лише геттерів та сетер. Я вважаю, що все, що не є тривіальним, має бути належним чином javadoc'ed.


1
Існує різниця між коментуванням та документуванням.
Том Хотін - тайклін

1
Дуже правильно. Саме тому я не коментую гетерів та сетерів. Вони повинні бути роз'яснювальними, а додавання коментаря означає, що код не пояснює себе.
Thorbjørn Ravn Andersen

0

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


Нічого хорошого - люди не читають коментарів на місцях. Javadoc навіть не створює приватну документацію за замовчуванням, і IDE не показують вам польову документацію, коли ви використовуєте швидку допомогу для виклику методу.
Трейказ

люди не читають коментарів на місцях, якщо не потрібно. Після того, як є потреба, чим більше інформації, тим краще.
akf

0

Якщо javadoc нічого не додає, я видаляю javadoc і використовую автоматично створені коментарі.


0

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


Вони роз'яснюються лише тоді, якщо ви скажете "це налаштування власності". Інакше клієнт API поняття не має, що насправді відбувається всередині методів
oxbow_lakes

1
Хто щось сказав про роз'яснення?
Пол Соньє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.