Считается ли плохой практикой создавать подклассы в Java для изменения аннотаций? - PullRequest
2 голосов
/ 06 февраля 2012

Например, при написании кода JPA или Hibernate я мог бы захотеть создать потомка класса домена, скажем Account. Нисходящая версия представляет собой форму показа пользователю. Форма имеет только около половины полей, которые находятся в учетной записи. Поэтому объект, который я использую для хранения значения формы, не должен изменять другие поля.

Использование наследования для изменения аннотаций считается плохим? Если предположить, что это не так, есть ли хорошие короткие руки или шаблоны дизайна, чтобы сделать это лучше или эффективнее?

1 Ответ

2 голосов
/ 06 февраля 2012

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

По сути, вы хотите ограничить форму изменением только некоторых полей / ассоциаций сущности, верно? Кроме того, я предполагаю, что вы не доверяете разработчику формы, что изменяются только те поля, которые должны быть редактируемыми, поэтому необходимо ограничить это.

В этом случае одним из вариантов может быть использование шаблона DTO (объект передачи данных): создайте DTO для данных формы и дайте пользователю заполнить его поля. Затем передайте DTO службе, которая обновляет объект соответствующим образом. Таким образом, вы можете контролировать, какие поля являются редактируемыми и как выполняется обновление.

Другим способом может быть создание оболочки для сущности, которая генерирует исключения, когда вызывается установщик для не редактируемого поля. Однако это было бы решение во время выполнения, и я бы предпочел подход DTO здесь.

Редактировать :

некоторые причины, по которым наследование может оказаться проблематичным в этом случае:

  • Подклассы не представляют сущности, однако вам все равно придется представлять подклассы в базе данных (либо через дискриминаторы, либо через дополнительные таблицы)
  • Сущность, созданная этой формой, всегда будет иметь подкласс и, следовательно, не будет редактируемой в других местах (если вы не возитесь с базой данных и т. Д.)
  • Объекты являются контейнерами данных и не должны зависеть от представления. Следовательно, наличие специального объекта (подкласса) для одного варианта использования пользовательского интерфейса (форма в вашем случае) нарушит принцип единой ответственности и абстракцию между моделью / данными и уровнем представления / представления.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...