2012-02-13 11 views
1

私はウェブサイトにシネマ、コンサート、クラブ、劇場、子供、その他のタブがあります。各タブには、適切なイベントとスケジュールが表示されます。 これは私の物である:シネマ用

FilmCinemaCinemaSchedule
シアター:
PerformanceTheaterTheaterSchedule
のように。
ConcertConcertPlaceConcertPlaceScheduleビジネスオブジェクトの構成とコードの複製

は今コンサートを検討してください。
しかし、これは正しくありません。コンサートがクラブや劇場などにあるかもしれないからです。 同じ状況がクラブにあります。コンサートやパーティーなど、さまざまなイベントが開催されています。

だから、クラスを整理する最良の方法は何ですか?もう一つの例:私たちは映画「ブーツのぬいぐるみ」を持っています。一方では、この映画、もう一つは漫画(子供のタブ)です。映画が「映画」に登場し、「子供」が映画を2度制作する必要があります。

もう1つ問題があります。

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の1つの違いはTheaterSchedule(またはClubScheduleなど)です。

この重複を避けるにはどうすればよいですか?

ありがとう、ごめんなさい、私の英語です。

答えて

3

あなたはそれを別の方法でモデル化する必要があるように感じます。

おそらく、あなたはものが(例えばCinemaTheatreのためのサブクラスで)で起こる物理的な場所、その原料を表しEventオブジェクト(例えばFilmPlay)と参加を表しPerformanceを表しVenueオブジェクトを持つことができますその2つのモデルのうちの2つの外部キー(おそらく時間のフィールド)があります。

1

私の最初のアイデアは、イベントと呼ばれる基本オブジェクト(またはここでは脳の暴風に似たもの)を持っていて、そのオブジェクトにシネマイベント、コンサートイベントなどを拡張するオブジェクトがあることですOCP

あなたの2番目の質問(または最初の質問ではコーヒーが少なすぎます)質問私は、指定されたイベントをいくつかのカテゴリに結びつけるテーブルを持っていても何の問題もありません。

2

シネマ、シアター、クラブのSholdは、あなたにスケジュールを返すIListを持っているのと同じ親を持っています。同じことがリポジトリの場合、GetFilmsForPeriodをGetObjectsForPeriodに変更してBaseRepositoryに移動したように見えることがあります。クラブと劇場の両方でIListコンサートを開催することができます。ダブルコーディングを避けるために、オブジェクトの類似のプロパティを親にマージしてみてください。

映画は参照クラスなので、MoviesとChildrenの両方で使用することができます。

関連する問題