Избегайте дублирования кода в классе POJO

Допустим, у нас есть 3 класса: A, B и C. Каждый класс имеет другие параметры. Вот так: РЕДАКТИРОВАТЬ:

 +-----+  +-----+  +-----+
 |  A  |  |  B  |  |  C  |
 -------  -------  -------
 | X x |  | X x |  | Z z |
 | Z z |  | Y Y |  | Y y |
 -------  -------  -------

Геттеры и сеттеры будут дублироваться. Итак, является ли это плохой практикой и следует ли нам избегать этого? Или это не должно восприниматься анализаторами кода (например, PMB) как дублирование кода?

Я думал о «шаблоне стратегии», но я думаю, что это, может быть, слишком много, только для геттеров и сеттеров...

РЕДАКТИРОВАТЬ: Мой первый вопрос, возможно, не совсем ясен. Вопрос в том, есть ли у нас два класса (не связанных) с общим атрибутом и точно таким же геттером/сеттером. Sonar или PMD должны рассматривать эти методы как дублированный код или нет? А если нет, то будет ли это исправлено?


person Pith    schedule 25.05.2012    source источник
comment
Эти классы кажутся очень тесно связанными. Почему они?   -  person Matt Ball    schedule 25.05.2012
comment
Дублирование кода — это плохо. Почему вы не можете просто ссылаться на класс B из A и использовать методы таким образом?   -  person Limey    schedule 25.05.2012
comment
A.getB() не обязательно означает то же самое, что и C.getB(). Так что не дублируется. Тем не менее, я где-то видел аннотации @Getter и @Setter, которые помогают упростить даже это (я не помню, какой это был фреймворк/библиотека)   -  person SJuan76    schedule 25.05.2012
comment
@ Мэтт Болл, ты прав. Я отредактировал свой пример.   -  person Pith    schedule 25.05.2012


Ответы (4)


Как уже отмечалось, сначала подумайте, действительно ли вам нужно дублирование. Возможно, они должны быть в общем объекте, который передается. Может они и не нужны.

Теперь предположим, что они действительно нужны. Что может быть, конечно. Детектор копи-пасты PMD позволяет вам установить минимальное количество строк, прежде чем оно будет считаться дубликатом. Поскольку геттер/сеттер состоит всего из трех строк каждый (или 6 для обоих), вы можете установить порог чуть выше.

person Jeanne Boyarsky    schedule 26.05.2012

Это циклическая ссылка и, как правило, плохая практика. Можете ли вы изменить дизайн, чтобы этого не делать?

person Starkey    schedule 25.05.2012
comment
Да, вы правы, но в моем реальном случае циклической ссылки нет. Я отредактирую свой пост, чтобы иметь лучший пример. - person Pith; 25.05.2012

Дублирование кода не всегда является неправильной идеей, в некоторых случаях неизбежно создание клонов. Также верно, что в настоящее время генерируются сеттеры и геттеры, но также генерируются циклы for и while, и эти коды не должны автоматически исключаться, поскольку они поддерживаются вручную. Агрессивное устранение дубликатов кода без какого-либо рассмотрения — плохая идея. В принципе не все дублирования плохи, и не всегда их устранение окупается. Что окупается, так это так называемое управление клонами, то есть отслеживание существующих дубликатов и устранение тех, которые действительно вызывают проблемы. Для этого вам понадобится сложный инструмент, такой как QualityGate от FrontEndART, который включает в себя CloneManager. Он не только перечисляет дубликаты, но и отслеживает их жизнь по версиям и позволяет узнать, на какие именно дубликаты следует обратить внимание. Вы можете проверить этот инструмент в демонстрационной онлайн-версии QualityGate.

person Tibor Bakota - FrontEndART    schedule 14.08.2014

Сеттеры и геттеры генерируются автоматически, поэтому они никогда не дублируют код (есть ли кто-то, кто пишет их вручную)?

Единственная проблема, которую вы должны учитывать, это дублирование данных? А на вашем примере сказать нельзя, потому что поле «b» в классах «A» и «C» может иметь другое значение.

Это как поле «Адрес» в «Клиент» и «Здание». Это означает что-то другое.

person Danubian Sailor    schedule 25.05.2012
comment
В Java геттеры и сеттеры не генерируются автоматически. Вы, должно быть, думаете о C#. - person Matt Ball; 25.05.2012
comment
@Matt Ball: Java-разработчики обычно позволяют eclipse генерировать геттеры и сеттеры, eclipse также отражает переименования полей в get/setters. - person Synox; 08.01.2014