业务对象的组织和代码重复
本文关键字:代码 对象 业务 | 更新日期: 2023-09-27 18:24:14
我在网站上有标签:电影院,音乐会,俱乐部,剧院,儿童,其他。每个选项卡都显示相应的事件和计划。这是我的对象:
对于电影:
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
,依此类推(。
如何避免这种重复?
谢谢,对不起我的英语。
感觉你需要以不同的方式建模。
也许你可以有一个Venue
对象,它表示事情发生的物理位置(例如,带有子类 Cinema
, Theatre
(,表示该东西的Event
对象(例如 Film
, Play
( 和一个表示这两个模型连接的Performance
(因此将有两个外键,可能还有一个时间字段(。
电影院、剧院和俱乐部应该具有相同的父级,该父级具有为您返回时间表的 IList。存储库也是如此,似乎您可以将GetFilmsForPeriod更改为GetObjectsForPeriod并将其移动到BaseRepository。俱乐部和剧院都可以举办IList音乐会。尝试将对象的一些类似属性合并到父级中,以避免双重编码。
由于电影是一门课,您可以在电影和儿童中都有它,因为它是参考课。
我的第一个想法是,你应该有一个名为 Event 的基本对象(或者类似的只是在这里进行头脑风暴(,并且它将有将其扩展到电影事件、音乐会事件等的对象,这些对象建立在 OCP 之上。
在你的第二个(还是第一个?咖啡太少太多时间(问题 我认为拥有一个将指定事件与多个类别连接起来的表没有任何问题。