Каковы плюсы и минусы написания методов класса в доменных классах Grails?

Каковы плюсы и минусы написания методов класса в доменных классах Grails? Я спрашиваю, потому что я часто не вижу никаких проектов Grails с методами внутри классов предметной области, только элементы данных. Есть ли в этом недостаток?


person Orca Ninja    schedule 24.12.2012    source источник


Ответы (2)


Когда класс предметной области (не только в Grails, но и в объектно-ориентированном программировании в целом), это называется анемичным модель домена. Мартин Фаулер предлагает поместить логику предметной области в класс предметной области для создания богатой модели предметной области. Делая это, классы предметной области становятся умнее и знают, как выполнять операции, вместо того, чтобы иметь другой класс обслуживания, который должен работать с классом предметной области. Плюсы богатой модели предметной области заключаются в том, что класс инкапсулирует больше своего собственного поведения и является более автономным. С другой стороны, это делает класс предметной области более сложным. Хотя я думаю, что доменный класс должен быть чем-то большим, чем просто бизнес-объект.

В Grails я стараюсь использовать комбинацию богатой модели предметной области и использования сервисов. Трудно сделать общее заявление о том, когда метод должен быть в доменном классе, а когда — в службе. Однако, как правило, если операция сложная и требует нескольких соавторов, я склонен помещать ее в класс обслуживания. Если метод покажется, что он должен быть поведением в классе предметной области, я помещу его туда.

Чтобы привести более конкретный пример, возьмем класс Person.

class Person {
  String firstName
  String lastName
  List<Person> friends
}

В нашем приложении человек может говорить. Теперь у меня может быть TalkService, который знает, как разговаривает человек. Но в данном случае я думаю, что talk является основным поведением человека, поэтому я бы добавил метод talk к Person.

Допустим, у меня также есть функция, в которой я хочу найти всех друзей друзей людей (друзей 2-й степени). Для меня это не основное поведение Person, поэтому я делегирую это службе.

Напомним, что в общем случае я бы добавил методы в класс предметной области, когда это основное поведение объекта (например, является ли он методом предметной области), в противном случае я бы поместил его в службу.

person Jeff Storey    schedule 24.12.2012

В проекте Java у вас должны быть классы POJO, представляющие модель. Например: Лицо, Счет, Книга, ...

Затем есть уровень службы, который содержит интерфейсы для пользователей, чтобы они могли выполнять некоторые запросы к базе данных, он принимает параметры вашей модели, а также возвращает модель, и есть уровень контроллера, который отвечает за перенаправление и внедрение ваших услуг.

В Grails это очень просто с помощью внедрения сервисов в ваш контроллер.

Теперь, когда нам нужно использовать методы внутри классов предметной области? это когда только модель, отвечающая за то, что нам нужно сделать, например, сколько лет Человеку Х (это от даты рождения), сколько предметов существует в Счете (из Списка), думаю, мы используйте это только тогда, когда мы манипулируем данными текущего объекта.

Например, для метода сохранения вы не можете добавить его в свою модель.

PersonController :

def personService

def save() {
...
Person person = ...
personService.save(person);
...
}

Это более эволюционно

person Sakhr    schedule 24.12.2012