Назви булеве поле, яке є дієсловом


14

У Java, за умовою, getter та setter для булевих полів будуть isField()і setField(). Це відмінно працює з іменами полів , які є таким прикметниками , як active, visible, closedі т.д.

Але як я можу назвати поле, яке має значення дієслова, як haveChildren? Додайте «_ing» до дієслова ( ), можливо?havingChildren

Для уточнення я не маю контролю над назвами методів (getter та setter), оскільки вони автоматично генеруються IDE. Отже, мені потрібно відповідне ім'я поля, щоб IDE, коли генерував для нього гетьтер, відчував. Наприклад, hasChildrenідеальна назва поля, але коли IDE генерує гетьтер для поля, це було б isHasChildren. Як я це вирішую?


3
Якщо це поле bool, parentпрацювало б.
янніс

2
Якщо ви можете піти з інвертуванням сенсу, "бездітний" прийшов би до хитрості.
Кіліан Фот

3
Здається, нерозумно потрібно перестрибувати обручі щодо назви поля, щоб уникнути граматичної проблеми, викликаної IDE. Незважаючи на це, тут є кілька додаткових пропозицій, хоча я думаю, що ті, які вже дали інші, краще: isAllowedChildren, isNotEmpty, isContainer, isLeaf,
учень доктора Вілі

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

1
Я погоджуюся з @dnhang, що ви не повинні дозволяти IDE диктувати такі речі. Вибір імен змінних та методів важливий для того, щоб зробити ваш код читабельним, для якого IDE, в якому він написаний, не має значення.
Digitalex

Відповіді:


11

Коротка відповідь:

  • Назви методів не можуть відображати внутрішню реалізацію, а очікувану поведінку.

Довга відповідь:

haveChildren()слід назвати hasChildren().

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

Ім'я за замовчуванням, яке IDE надає згенерованим геттерам і сетерам, не вважається законом, встановленим в камені.

Ще один момент: інтерфейси мають назви методів, які ще не реалізуються.

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

Візьмемо для прикладу Iteratorінтерфейс на Java.

Коли ви реалізуєте Iterator, навіть коли у вас є ім'я булевого члена next, ви не можете перейменовувати hasNext()в isNext()або isHavingNext(). Це деталізація реалізації. Насправді я реалізував, Iteratorі те, що я роблю, - це член типу того, що в моєму класі є список, названий next(не булевим). hasNext()потім повертається next!=null.

Також дивіться це:

class patient {
      private boolean pulse;
      private boolean breaths:
      public boolean isDead(){ return (!pulse & !breaths);}
}

Зауважте, що isDead()це не нормальний дім.

Візьміть інструменти продуктивності IDE, якими вони є.


3

Я б запропонував перейменувати поле parentтаким чином, щоб геттер був isParentі сетер був setParent.

Ви також можете спробувати childPresentім'я змінної isChildPresentі setChildPresentяк і геттер і сеттер.


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

0

Ви можете поставити doesперед дієсловом. Такі, як doesHaveChildrenу наведеному вами прикладі. А може shouldHaveChildrenзалежно від контексту.


1
Проблема полягає в тому, що я не маю контролю над назвою методу, оскільки геттер і сеттер автоматично генеруються IDE (наприклад, Eclipse).
dnang

1
Просто перейменуйте метод (и)? Додайте палітурку для перейменування методів (якщо у вас її ще немає).
miguel.martin

@dnhang, якщо це ваш код, ви можете викликати методи будь-якими зручностями незалежно від того, що IDE викликає їх, коли він автоматично генерується.
Річард

1
@ miguel.martin Однією з причин, чому ви не хотіли б цього робити, є Java-боби. Припущення isSomethingє частиною цієї специфікації, і багато припущень зроблені навколо неї, для кращого чи гіршого випадку, протилежність цьому doesSomethingможе призвести до того, що загрома розіб'є речі не настільки очевидними способами, що призведе до помилок.

0

Питання цілком розумне. Іноді перейменування автоматично створеного методу недостатньо. Приклад: Очікується, що боби, керовані JSF, використовуються isXyz()як спосіб отримання boolean xyzвластивості.

Я погоджуюся з BlackPanther, який пропонує перейменувати поле parentта використовувати isParentяк ім'я методу. Відповідно до принципу приховування інформації, читабельність і спосіб встановлення важливіша, ніж атрибут.

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