Voyage, Booking, BookingService - Где поставить проверку мощности - PullRequest
1 голос
/ 24 марта 2011

Я новичок в дизайне, управляемом доменом, и хотел бы услышать ваши мысли по поводу решения о дизайне: в моем домене есть объекты "путешествие" и "бронирование".Конструктор voyage выглядит следующим образом:

public Voyage(VoyageNumber voyageNumber,
                  Schedule schedule,
                  IList<VoyagePrice> voyagePrices,
                  Location location,
                    Capacity capacity)

Значения объектов "voyagePrices" содержат информацию о цене для определенного типа человека (ребенок, взрослый и т. Д.).Вместимость содержит максимальное количество людей, разрешенных в рейсе.

Конструктор для «Бронирования» выглядит следующим образом:

public Booking(BookingNumber bookingNumber,
        Customer customer,
        Voyage voyage,
        IList<ConfirmedPerson> confirmedPersons)

подтверждено. Персоны содержат список людей, которых один клиент хочет забронировать.(т.е. 2 взрослых, 1 ребенок).Теперь, конечно, необходимо проверить вместимость рейса, прежде чем разрешить сохранение бронирования.Я не думаю, что "путешествие" должно содержать список всех бронирований.Было бы хорошо проверить вместимость в BookingService или в BookingFactory?У вас есть предложения, возможно, с небольшим фрагментом кода?Спасибо!

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Вполне возможно и допустимо иметь доступную емкость в составе Voyage или логической инкапсуляции, такой как

  Voyage.isFull()

При получении определенного агрегата рейса из VoyageRepository эта информация может быть получена.

Однако этого недостаточно, всегда есть шанс, что путешествие заполняется после того, как вы извлекли его из VoyageRepository. Так что вам нужно разобраться с этим исключительным случаем, например,

  public interface BookingService {
     Booking book(BookingRequest br) throws VoyageIsFullException; 
  }

И вы, вероятно, захотите фабрику BookingRequest

 public class BookingRequestFactory {
    public static BookingRequest create(Voyage v, Customer c, IList<Person> travelers)
 }

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

0 голосов
/ 25 марта 2011

Если я правильно понял, вы должны соединить две сущности. Я хотел бы предложить вам сделать это так же, как это было бы сделано в реляционной базе данных. Перейдите по этой ссылке: дизайн реляционной базы данных и прочитайте параграф: «Отношения многие-ко-многим», я думаю, что это может быть решением

...