2009-09-15 53 views
5

previous questionDr. Herbie對接受的答案的評論之一是,我的方法是執行兩個職責..改變數據和保存數據。什麼是分離此代碼的關注的最佳方式?

我想弄清楚的是在我的情況下區分這些問題的最佳方法。

與我具有通過NHibernate的檢索策略對象的身體力行上....

我目前正在制定政策爲不活動的方法如下:

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 

//method in PolicyManager which has data access and update responsibility 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
    Update(policy); 
} 

如果我要分開數據訪問和數據更新的責任,那麼最好的辦法是什麼?

是更好地有PolicyManager(充當通往道)管理政策對象的狀態:

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 
policyManager.Update(policy); 

//method in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
} 

,或者讓政策目標保持它自己的狀態,然後使用管理器類的信息保存到數據庫:

Policy policy = new Policy(); 
policy.Status = Active; 

policy.Inactivate(); 

policyManager.Update(policy); 

//method in Policy 
public void Inactivate() 
{ 
    this.Status = Inactive; 
} 

回答

1

作爲我原來的評論的延續:) ... 目前你最好的選擇是第三種選擇,但如果事情變得更復雜,你可以與第二個選項一起添加外觀方法來執行預先指定的序列:

Policy policy = new Policy(); 

policy.Status = Active; 

policyManager.InactivateAndUpdate(policy); 


//methods in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    // possibly complex checks and validations might be put there in the future? ... 
    policy.Status = Inactive; 
} 

public void InactivateAndUpdate(Policy policy) 
{ 
    Inactivate(policy); 
    Update(policy); 
} 

的InactivateAndUpdate是一種門面方法,這是隻是爲了讓調用代碼稍微整潔的,同時還允許做實際工作的方法是不同的關注(一種休息的方式單一職責,但有時你只需要務實!)。我特意將這些方法命名爲X Y,以使它們脫穎而出,從事兩件事情。

InactivateAndUpdate方法然後釋放您開始實施策略模式或將實際實現方法拆分爲用於動態處理的命令對象或任何其他架構可能在未來可行的架構。

3

我會做什麼:

  • 創建一個保存並檢索策略的存儲庫。 (PolicyRepository)

  • 如果您必須執行復雜的邏輯來激活/停用策略,則可以爲此創建服務。如果該服務需要訪問數據庫,則可以在必要時將PolicyRepository傳遞給它。 如果不涉及複雜的邏輯,激活/取消激活策略只是將標誌設置爲false或true,或者只涉及策略類的成員,那麼爲什麼「激活」不是該屬性的簡單屬性可以設置爲false/true的策略類? 我只會創建一個服務,如果涉及其他對象,或者需要數據庫訪問來激活或停用策略。

0

如果狀態是Policy階級的國家的一部分,那麼Policy應該也有Inactivate方法 - 這只是基本的封裝。在一個責任中糾纏多個班級至少和給一個班級多個職責一樣糟糕。

另外,狀態可以被認爲是關於的Policy,不屬於Policy但對PolicyManager。在這種情況下,Policy根本不應該知道自己的狀態。

1

我肯定會用的原因,第三選項,您提到去:

策略對象維護它自己的 狀態,然後使用管理器類 到的信息保存到 數據庫

另請參閱Repository Pattern。它可能會替代你的PolicyManager

相關問題