У меня есть вкладки на сайте: Кино, Концерты, Клубы, Театры, Дети, Другое. На каждой вкладке отображаются соответствующие события и расписания. Это мой объект:
Для кино:
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
и т. Д.).
Как избежать этого дублирования?
Спасибо, и извините за мой английский.