#java #spring #jakarta-ee
#java #spring #джакарта-ee
Вопрос:
У меня есть некоторый опыт работы с Django и его концепцией MVC (скорее MTV …). В моем предыдущем проекте в django я всегда пытался упаковать множество функций (методов) в Model class
все, которые могли бы работать с одним объектом в Model
объекте. Я знаю, что в Java EE
мире гораздо больше слоев, чем 3, так как же мне это сделать в Spring
? Например, где я должен разместить функцию, которая суммирует несколько свойств объекта? В любом случае, модели в spring также называются «model»?
Ответ №1:
Просто применяйте хорошие методы OO. Если какое-то поведение может быть инкапсулировано в классе модели, то обязательно поместите его в класс модели. Например, модель, имеющая свойства a salary
и a bonus
, может, конечно, иметь getTotalIncome
метод, который возвращает сумму зарплаты и бонуса.
Конечно, он не должен пересекать свои собственные границы. Если вычисление общего дохода требует вызова службы для применения некоторого налога на основе текущего месяца и некоторой конфигурации в базе данных, это становится бизнес-логикой и связывает ваш объект модели с уровнем сервиса, чего не следует делать. Таким образом, getTotalIncome
метод в этом случае больше не должен существовать.
Комментарии:
1. Да, это то, что я хотел бы услышать 🙂
Ответ №2:
Как правило, нет, вы не добавляете много функций в сам объект модели. А spring — это все о хорошем дизайне. Другими словами, модель должна быть просто контейнером для информации, представляющей элементы модели. Все, что делается с моделью, должно выполняться с помощью таких вещей, как DAO. Весной мои модели обычно выглядят так:
public class Car {
private int id;
private Engine engine;
private Control steeringWheel;
...
// getters and setters
}
С помощью DAO, подобного:
public interface CarDao {
public void add( Car car );
public void update( int id, Car car );
...
}
Комментарии:
1. Не могли бы вы немного расширить свой ответ? Куда я должен поместить, т. е. функцию, которая суммирует 2 поля модели?
2. @Maqxiq, что конкретно вы пытаетесь подвести итог и по какой причине? это имеет значение. Приведите мне пример ваших 2 объектов, что вы суммируете и что вы ожидаете сделать с суммой.
3. Ну, я привожу более сложный пример: допустим, у меня есть модель
player
. На 2D-доске идет игра, и в каждый ход игрок должен сделать ход. ВDjango
модели я мог бы просто определить метод, такой как doMove (x, y), и другой частный, который проверяет, отличаются ли новые x и y от предыдущих. Если все в порядке, объект будет сохранен (в БД). Как я мог бы реализовать такую логику бизнеса на Java?
Ответ №3:
Речь идет не столько о слоях, сколько о сохранении простоты объектов данных, чтобы вы могли перемещать их по своим корпоративным системам любым удобным вам способом без неожиданностей. В самом Spring нет ничего, что действительно заботило бы, сколько методов вы помещаете в класс, но я согласен с Лукасом, что упрощение класса сущности — лучший дизайн.
Многолетний опыт много раз приводил меня к этому выводу. «Занятые» объекты сущности рано или поздно становятся проблемой.
Ответ №4:
Хорошо, у меня был бы объект модели для Player, один для Game и, возможно, один для State. У меня был бы DAO для каждого и, у меня был бы контроллер, возможно, называемый Controller, который выполнял бы все операции. Например:
public class Player {
private String name;
...
}
public class State {
private Map<Player, Location> locations;
private Map<Player, Health> healths;
...
}
public class Game {
private Player player1;
private Player player2;
private State state;
...
}
Со стандартным CRUD, таким как DAO (возможно, с дополнительными вспомогательными методами), и контроллером, который реализует интерфейс, подобный этому:
public interface Controller {
public void move( Player player, Location location );
...
}
Комментарии:
1. Спасибо за этот код, но действительно ли это должен быть контроллер? Контроллеры Imho должны возвращать интерфейс для генерации представления?
2. @Maxiq, в чистом MVC контроллер предназначен для обработки действия, изменения модели и предоставления представления с данными, необходимыми для представления. Он буквально управляет приложением. Однако большинство людей не используют в полной мере чистый MVC. Вы можете использовать столько или так мало, сколько хотите, но разделение проблем почти всегда полезно.
Ответ №5:
Java EE изменила множество шаблонов, которые были распространены в мире J2EE. Хотя Spring не является Java EE, он был разработан вокруг той же идеи — избавиться от устаревшей громоздкости J2EE. Есть хорошая книга Адама Бьена о шаблонах J2EE, которые стали анти-шаблонами — «Шаблоны реального мира Java EE. Переосмысление лучших практик«
Одна из его глав «Постоянный доменный объект» отвечает именно на ваш вопрос. Моделируйте свое приложение с помощью реальных объектов и не заботьтесь о постоянстве в начале… JPA оказывается действительно гибким в отображении объектов расширенного домена в реляционные таблицы. Чем более сложную логику вы должны реализовать, тем проще поддерживать и развивать объектно-ориентированную персистентность.