2011-03-31 147 views
1

我用於設計我的應用程序使用更多的數據庫驅動的方法,現在我想從模型開始。我有以下要求,並希望得到你的看法。它基本上是一個活動,與它相關的點。需要域模型的一些幫助

與超級30醫生活動

  1. 最低4元不等
  2. 減去一個點,如果你,如果你去了6每月不打最低(4)
  3. 1點或2點
  4. 2分當與本地提倡

活性與120醫生

  1. 0.5分

活動與合作

  1. 2點

活動隨訪夥伴會議

  1. 2點

所以,我試圖決定是否在這裏爲每個活動類型或活動的枚舉使用繼承hiearchy。那麼,是否每個活動都負責計算他們的積分(但在某些情況下,需要知道總活動數量來決定),還是我有一些記分員組件知道所有的邏輯。

任何想法都會很棒!

我有這樣的設計迄今,但我不知道在哪裏可以處理超30規則:

public abstract class ActivityBase { 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
    public abstract double CalculatePoints(); 
} 

public class SuperThirtyActivity : ActivityBase { 
    public bool WithCE { get; set; } 
    public bool WithLocalAdvocate { get; set; } 

    public override double CalculatePoints() { 
     if (Date.Month == 3 && Date.AddDays(7).Month == 4) 
      return 1; 
     else if (WithCE || WithLocalAdvocate) 
      return 2; 
     else 
      return 1; 
    } 
} 

public class OneTwentyActivity : ActivityBase { 
    public override double CalculatePoints() { 
     return .5; 
    } 
} 

public class PartnershipActivity : ActivityBase { 
    public override double CalculatePoints() { 
     return 2; 
    } 
} 

我們處理超30規則,我想介紹以下類的。然而,這裏有一些領域的邏輯漏洞。這是好的還是其他的想法?

public class Scorer { 
    public double CalculateScore(IEnumerable<ActivityBase> activities) { 
     var score = activities.Select(a => a.CalculatePoints()).Sum(); 
     var count = activities.Count(a => a is SuperThirtyActivity); 

     if (count < 4) 
      score--; 
     else if (count > 6) 
      score += count; 

     return score; 
    } 
} 
+0

需要更多背景信息 – 2011-03-31 15:06:03

+0

在這種情況下'需求'不清楚;什麼是活動,什麼是觀點等?作爲一個經驗法則,當需求不好時,代碼也不會那麼好。 – Tejs 2011-03-31 15:06:29

+0

活動是與醫生會面。這是一個比賽,所以他們根據活動統計積分。請讓我知道你還需要什麼。 – Marco 2011-03-31 15:08:14

回答

0

由於某些點基於聚合活動,因此看起來有另一個概念未在對象模型ActivityCollection中捕獲。它在Scorer.CalculateScore的參數中暗示,但也許需要明確說明。然後ActivityCollection可以計算得分,因爲它擁有所有必要的信息。

另一方面,Scorer對象也可以起到這個作用。域邏輯在Scorer對象中是可以的,因爲它只是Scorer完成名字所暗示的邏輯所必需的。如果您保留Scorer,但將活動類中的點值移入其中,那麼該結構也可以起作用,如果不是更好。

+0

gotcha。所以將'得分'邏輯移到集合中,擺脫記分器組件。我喜歡這個想法.. – Marco 2011-03-31 16:40:58

1

如果活動基類不包含邏輯,我建議製作一個IActivity接口並讓4個類來實現它而不是繼承。 IActivity應該有一個像CalculatePoints這樣的方法來實現每個實現類。

如果你不打算檢查活動類型的應用程序中的任何地方我的意思是,如果你將永遠不會有這樣的代碼:

if (activity is PartnershipActivity){ 
//do something 
} 
else if (activity is FollowUpActivity) { 
// do something else 
} 

,如果你是肯定會有引入任何新的活動類型在未來的應用程序中,您可能會考慮按照您所說的使用枚舉字段創建一個Activity類,並執行您在其業務邏輯中提到的所有檢查和計算。

+0

我想我會繼承設計(使用EF4)。現在在確定積分時需要知道總活動的規則是什麼?顯然,該活動無法訪問其包含的集合。在哪裏/如何發生? – Marco 2011-03-31 16:06:20

+0

您可以在活動類本身中創建一個靜態成員,以保存對所有活動的引用。 – 2011-03-31 16:11:03

+0

請參閱我原來的帖子增加.. – Marco 2011-03-31 16:28:33