2009-09-15 91 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

相关问题