业务对象的组织和代码重复

本文关键字:代码 对象 业务 | 更新日期: 2023-09-27 18:24:14

我在网站上有标签:电影院,音乐会,俱乐部,剧院,儿童,其他。每个选项卡都显示相应的事件和计划。这是我的对象:
对于电影:
FilmCinemaCinemaSchedule
剧院:
PerformanceTheaterTheaterSchedule
等等。

现在考虑音乐会:
ConcertConcertPlaceConcertPlaceSchedule
但这是不正确的,因为音乐会可能在俱乐部或剧院(例如(。俱乐部的情况也是如此。有不同的活动:音乐会和派对。

那么,组织课程的最佳方式是什么?另一个例子:我们有电影《穿靴子的猫》。一方面是这部电影,另一方面是动画片(儿童标签(。现在电影出现在"电影"和"儿童"中需要两次创作。

另一个问题,我将举例说明。

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对象,它表示事情发生的物理位置(例如,带有子类 CinemaTheatre (,表示该东西的Event对象(例如 FilmPlay ( 和一个表示这两个模型连接的Performance(因此将有两个外键,可能还有一个时间字段(。

电影院、剧院和俱乐部应该具有相同的父级,该父级具有为您返回时间表的 IList。存储库也是如此,似乎您可以将GetFilmsForPeriod更改为GetObjectsForPeriod并将其移动到BaseRepository。俱乐部和剧院都可以举办IList音乐会。尝试将对象的一些类似属性合并到父级中,以避免双重编码。

由于电影是一门课,

您可以在电影和儿童中都有它,因为它是参考课。

我的第一个想法是,你应该有一个名为 Event 的基本对象(或者类似的只是在这里进行头脑风暴(,并且它将有将其扩展到电影事件、音乐会事件等的对象,这些对象建立在 OCP 之上。

在你的第二个(还是第一个?咖啡太少太多时间(问题 我认为拥有一个将指定事件与多个类别连接起来的表没有任何问题。