2012-02-13 3 views
1

У меня есть вкладки на сайте: Кино, Концерты, Клубы, Театры, Дети, Другое. На каждой вкладке отображаются соответствующие события и расписания. Это мой объект:
Для кино:
Film, Cinema, CinemaSchedule
театр:
Performance, Theater, TheaterSchedule
и так далее.Организация бизнес-объектов и дублирование кода

Теперь рассмотрим концерт:
Concert, ConcertPlace, ConcertPlaceSchedule.
Но это неверно, потому что концерт может быть в клубе или в театре (например). Такая же ситуация с клубами. Происходят различные события: концерты и вечеринки.

Итак, что является лучшим способом организовать занятия? Другой пример: у нас есть фильм «Кот в сапогах». С одной стороны, этот фильм, другой - мультфильм (вкладка «Дети»). Теперь, когда фильм появился в «Кино» и «Дети», нужно создать его дважды.

Другая проблема, я покажу на примере.

This is my repository for `Film`: 

    public class FilmRepository:BaseRepository<Film> 
     { 
      public FilmRepository(DatabaseContext database) : base(database) 
      { 
      } 
       /// <summary> 
       /// Loads films for specific period 
       /// </summary> 
       /// <param name="period"></param> 
       /// <returns></returns> 
       public IList<Film> GetFilmsForPeriod(PeriodEvent period) 
       { 
        switch (period) 
        { 
          case PeriodEvent.All: 
          return GetAllFilms(); 

          case PeriodEvent.Today: 
          return GetFilmsForToday(); 

          case PeriodEvent.Tomorrow: 
          return GetFilmsForTomorrow(); 

          case PeriodEvent.Week: 
          return GetFilmsForWeek(); 

          case PeriodEvent.FewWeek: 
          return GetFilmsForFewWeek(); 

          case PeriodEvent.Month: 
          return GetFilmsForMonth(); 

          case PeriodEvent.FewMonth: 
          return GetFilmsForFewMonth(); 

         default: 
          return GetFilmsForToday(); 
        } 
       } 

      // load films for today 
      private IList<Film> GetFilmsForToday() 
      { 
       return 
        Database.Films.Where(c => c.CinemaSchedules.Any(s => 
         s.ShowDate.Value.Date == DateTime.Now.Date)).ToList(); 
      } 

      //implementation another methods from above. 
    } 

И каждый репозиторий имеет одинаковые методы. Одна разница в том, что вместо CinemaSchedule - TheaterSchedule (или ClubSchedule и т. Д.).

Как избежать этого дублирования?

Спасибо, и извините за мой английский.

ответ

3

Такое чувство, что вам нужно моделировать его по-другому.

Может быть, вы могли бы иметь Venue объект, который представляет собой физическое местоположение, материал происходит в (с подклассов для например Cinema, Theatre), в Event объект, представляющий этот материал (например Film, Play) и Performance, который представляет объединение из этих двух моделей (и так будет иметь два внешних ключа и, вероятно, поле для времени).

1

Моя первая идея заключается в том, что у вас должен быть базовый объект Event (или что-то подобное, например, мозговой штурм здесь), и что у него будут объекты, которые продлят его, чтобы стать событием в кинотеатре, концертным событием и т. Д., Основываясь на OCP.

На втором (или это было первое задание) Слишком мало кофе слишком много времени. Вопрос: Я не вижу ничего плохого в том, что у меня есть таблица, соединяющая указанное событие с несколькими категориями.

2

У кинотеатра, театра и клуба есть один и тот же родитель, у которого есть IList, который возвращает вам графики. То же самое касается репозитория, кажется, что вы можете использовать GetFilmsForPeriod для использования в GetObjectsForPeriod и переместить его в BaseRepository. У клуба и театра могут быть концерты IList. Попытайтесь объединить некоторые аналогичные свойства ваших объектов в родителях, чтобы избежать двойного кодирования.

As Film - это класс, который вы можете получить как в Кино, так и в Детях, так как это ссылочный класс.

Смежные вопросы