В моем приложении есть сущности. но некоторые сущности нуждаются в реализации интерфейса. Например, У меня есть сущности "Курс", "Урок". Я создал интерфейсы «CourseService», «LessonService» и «CourseServiceImpl», «LessonServiceImpl». Но проблема в том, что мои «Курс» и «Урок» должны реализовывать интерфейс «Платный». что мне делать? дублировать мои объекты?
Спасибо,
В чем именно проблема? Почему бы вам просто не позволить Course и Lesson реализовать интерфейс Payable?
@HBo, Course и Lesson - это классы сущностей. если я реализую интерфейс Payable, они будут содержать методы из интерфейса Payable. Правильно ли содержать бизнес-методы в классах сущностей?
@ElvinAliyev вроде как в точку, да. Но вам действительно стоит создать пример, показывающий нам, что вы сделали, что не так и что вы пытались исправить. Кроме этого, это просто догадка за догадкой ...
@DamCx не могли бы вы объяснить, почему у сущностей не должно быть интеллекта в своем коде? Желательно со ссылкой на признанную методологию. Те, кого я знаю (особенно DDD), говорят прямо противоположное
@crizzis DDD - это особый способ разработки кода и объектов. В большинстве случаев сущности JPA генерируются, поэтому вы не хотите иметь в них интеллекта, поэтому вы уверены, что ничего не пропустите и не сломаете свой код.
@DamCx «В большинстве случаев сущности JPA генерируются» звучит довольно анекдотично, и если бы я предоставил собственное анекдотическое свидетельство, это указывало бы на вывод, что в большинстве случаев сущности генерируются нет. Все, что я хотел отметить, это то, что ваш комментарий звучал так, будто в JPA существует техническое ограничение или всеобщий консенсус в отрасли, что сущности не должны содержать логику, ни то, ни другое на самом деле не так.




Не совсем. Я предполагаю, что ваш интерфейс Payable имеет метод pay(). Реализуйте это в обеих ваших сущностях. Если реализации разные, все в порядке. Если они одинаковы, вы можете извлечь его в другой объект и инкапсулировать в Course и Lesson. Или нет - нет ничего плохого в дублировании кода как такового - только с кодом, который сложно изменить и расширить. У нас есть принцип DRY - не повторяйся. Я предпочитаю НАПИТОК - повторить, если необходимо, Кей? :) (Хотя не уверен, кто это придумал).
В любом случае, я бы рекомендовал использовать как можно меньше кода в сервисах. У вас будет более высокий сплоченность, если ваши сущности могут выполнять свои обязанности самостоятельно и не раскрывают свою внутреннюю структуру какой-либо службе. Мартин Фаулер объясняет это довольно хорошо. Также это.
Почему бы вам просто не добавить на свои интерфейсы
CourseиLessonextends Payable? Таким образом, у вас будут ваши сущности, которые будутPayable. Хотя, что касается дизайна, я настоятельно рекомендую не использовать такое решение, поскольку для сущностей лучше не иметь интеллекта в своем коде.