Именование логического поля, которое является глаголом

14

В Java по соглашению getter и setter для логических полей будут isField()и setField(). Это отлично работает с именами полей , которые являются таким прилагательными , как active, visible, closedи т.д.

Но как я могу назвать поле, которое имеет значение глагола, например haveChildren? Может быть, добавить «_ing» к глаголу ( )?havingChildren

Чтобы уточнить, у меня нет контроля над именами методов (getter и setter), поскольку они автоматически генерируются IDE. Так что мне нужно подходящее имя поля, чтобы когда IDE генерировала для него геттер, это имело смысл. Например, hasChildrenэто идеальное имя поля, но когда IDE сгенерирует метод получения для поля, это будет так isHasChildren. Как мне это решить?

dnang
источник
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, вы не supossed переименовать 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поле для хранения ссылки на родительский объект. Я думаю, что мне нужно общее правило для преобразования всех глаголов в прилагательные для логических полей.
dnang
0

Вы могли бы поставить doesперед глаголом. Например, doesHaveChildrenв вашем примере вы предоставили. Или, возможно, в shouldHaveChildrenзависимости от контекста.

miguel.martin
источник
1
Проблема в том, что у меня нет контроля над именем метода, потому что геттер и сеттер автоматически генерируются IDE (например, Eclipse).
Днанг
1
Просто переименовать метод (ы)? Добавьте связку клавиш для методов переименования (если у вас ее еще нет).
miguel.martin
@dnhang, если это ваш код, вы можете вызывать методы как угодно, независимо от того, как IDE вызывает их при автоматической генерации.
Ричард
1
@ miguel.martin Одна из причин, по которой вы бы этого не хотели, - Java-бины. Предположение isSomethingявляется частью этой спецификации, и вокруг нее делается много предположений, что бы там ни было, если идти против этого с doesSomethingволей, это может сломать вещи не столь очевидными способами, что приведет к ошибкам.
0

Вопрос совершенно разумный. Иногда переименование автоматически сгенерированного метода недостаточно. Пример. Ожидается, что управляемые JSF-компоненты будут иметь isXyz()метод получения boolean xyzсвойства.

Я согласен с BlackPanther, который предлагает переименовать поле parentи использовать в isParentкачестве имени метода. Согласно принципу сокрытия информации, читаемость методов получения и установки важнее, чем атрибут.

Пауло Мерсон
источник