Вы должны удалить методы из "POJO" ... Они на самом деле не POJO, если вы инкапсулируете такую функциональность.Причина этого кроется в принципах проектирования SOA , которые в основном говорят о том, что вы хотите слабую связь между различными уровнями вашего приложения.
Если вы знакомы с Инверсиями контейнеров управления , например Google_Guice или Spring Framework - это разделение является обязательным.Например, предположим, что у вас есть CreditCard
POJO и CreditCardProcessor
сервис, а также DebugCreditCardProcess
сервис, который фактически не взимает с CC деньги (для тестирования).
@Inject
private CardProcessor processor;
...
CreditCard card = new CreditCard(...params...);
processor.process(card);
В моемНапример, я полагаюсь на контейнер IoC, чтобы предоставить мне CardProcessor
.Является ли это отладкой или настоящей ... Мне все равно, и объект CreditCard
тоже не имеет значения.То, что предоставляется, зависит от конфигурации вашего приложения.
Если бы у вас была связь между процессором и кредитной картой, где я мог бы сказать card.process()
, вам всегда нужно было бы передать processor
в конструкторе карт.CreditCards
может использоваться для других целей, кроме обработки, однако.Возможно, вы просто хотите загрузить CreditCard
из базы данных и получить дату истечения срока действия ... Для этой простой операции не нужен процессор.
Вы можете возразить: «Кредитная карта может быть полученапроцессор от статической фабрики ".Несмотря на это, синглеты широко рассматриваются как анти-шаблон, требующий сохранения глобального состояния в вашем приложении.
Хранение бизнес-логики отдельно от модели данных - это всегда хорошая вещь, чтобыуменьшить требуемое сцепление.Слабое связывание облегчает тестирование и делает ваш код более читабельным.