6

上一个问题中, Herbie 博士对已接受答案的评论之一是,我的方法正在执行两个职责……更改数据和保存数据。

我想弄清楚的是在我的情况下区分这些问题的最佳方法。

继续我的具有通过 NHibernate 检索的 Policy 对象的示例......

我目前将策略设置为非活动的方式如下:

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(充当 dao 的网关)管理 Policy 对象的状态是否更好:

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 policy = new Policy();
policy.Status = Active;

policy.Inactivate();

policyManager.Update(policy);

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

4 回答 4

3

我会做什么:

  • 创建一个存储和检索策略的存储库。(策略库)

  • 如果您必须执行复杂的逻辑来激活/停用策略,您可以为此创建一个服务。如果该服务需要访问数据库,那么您可以在必要时将 PolicyRepository 传递给它。如果不涉及复杂逻辑,并且激活/停用策略只是将标志设置为 false 或 true 的问题,或者如果仅涉及策略类的成员,那么为什么“已激活”不是策略的简单属性可以设置为 false / true 的类?如果涉及其他对象,或者如果需要数据库访问来激活或停用策略,我只会创建一个服务。

于 2009-09-15T07:41:47.680 回答
1

出于您提到的原因,我肯定会选择第三种选择:

Policy 对象维护自己的状态,然后使用管理器类将信息保存到数据库

另请查看存储库模式。它可能会替代您的PolicyManager.

于 2009-09-15T07:50:50.033 回答
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 是一种外观方法,它只是为了使调用代码更整洁,同时仍然允许执行实际工作的方法是单独的关注点(有点打破方法的单一责任,但有时你只需要务实!)。我特意将这些方法命名为 XY 样式,以使它们在做两件事时脱颖而出。

然后,InactivateAndUpdate 方法可以让您腾出时间来开始实施策略模式或将实际实施方法拆分为动态处理的命令对象或将来可能变得可行的任何其他架构。

于 2009-09-15T08:38:51.670 回答
0

如果状态是Policy类状态的一部分,那么Policy也应该有Inactivate方法——这只是基本的封装。将多个类纠缠在一个职责中至少与赋予一个类多个职责一样糟糕。

或者,可以将状态视为关于的元数据Policy,不属于 ,Policy但属于PolicyManager。但是,在这种情况下,Policy根本不应该知道自己的状态。

于 2009-09-15T07:49:44.420 回答