Каковы плюсы и минусы написания методов класса в доменных классах Grails? Я спрашиваю, потому что я часто не вижу никаких проектов Grails с методами внутри классов предметной области, только элементы данных. Есть ли в этом недостаток?
Каковы плюсы и минусы написания методов класса в доменных классах Grails?
Ответы (2)
Когда класс предметной области (не только в Grails, но и в объектно-ориентированном программировании в целом), это называется анемичным модель домена. Мартин Фаулер предлагает поместить логику предметной области в класс предметной области для создания богатой модели предметной области. Делая это, классы предметной области становятся умнее и знают, как выполнять операции, вместо того, чтобы иметь другой класс обслуживания, который должен работать с классом предметной области. Плюсы богатой модели предметной области заключаются в том, что класс инкапсулирует больше своего собственного поведения и является более автономным. С другой стороны, это делает класс предметной области более сложным. Хотя я думаю, что доменный класс должен быть чем-то большим, чем просто бизнес-объект.
В Grails я стараюсь использовать комбинацию богатой модели предметной области и использования сервисов. Трудно сделать общее заявление о том, когда метод должен быть в доменном классе, а когда — в службе. Однако, как правило, если операция сложная и требует нескольких соавторов, я склонен помещать ее в класс обслуживания. Если метод покажется, что он должен быть поведением в классе предметной области, я помещу его туда.
Чтобы привести более конкретный пример, возьмем класс Person
.
class Person {
String firstName
String lastName
List<Person> friends
}
В нашем приложении человек может говорить. Теперь у меня может быть TalkService
, который знает, как разговаривает человек. Но в данном случае я думаю, что talk
является основным поведением человека, поэтому я бы добавил метод talk
к Person
.
Допустим, у меня также есть функция, в которой я хочу найти всех друзей друзей людей (друзей 2-й степени). Для меня это не основное поведение Person
, поэтому я делегирую это службе.
Напомним, что в общем случае я бы добавил методы в класс предметной области, когда это основное поведение объекта (например, является ли он методом предметной области), в противном случае я бы поместил его в службу.
В проекте Java у вас должны быть классы POJO, представляющие модель. Например: Лицо, Счет, Книга, ...
Затем есть уровень службы, который содержит интерфейсы для пользователей, чтобы они могли выполнять некоторые запросы к базе данных, он принимает параметры вашей модели, а также возвращает модель, и есть уровень контроллера, который отвечает за перенаправление и внедрение ваших услуг.
В Grails это очень просто с помощью внедрения сервисов в ваш контроллер.
Теперь, когда нам нужно использовать методы внутри классов предметной области? это когда только модель, отвечающая за то, что нам нужно сделать, например, сколько лет Человеку Х (это от даты рождения), сколько предметов существует в Счете (из Списка), думаю, мы используйте это только тогда, когда мы манипулируем данными текущего объекта.
Например, для метода сохранения вы не можете добавить его в свою модель.
PersonController :
def personService
def save() {
...
Person person = ...
personService.save(person);
...
}
Это более эволюционно