分离此代码的问题的最佳方法是什么?

mez*_*oid 5 c# separation-of-concerns

在上一个问题中,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);
}
Run Code Online (Sandbox Code Playgroud)

如果我将数据访问和数据更新的责任分开,那么最好的方法是什么呢?

最好让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;
}
Run Code Online (Sandbox Code Playgroud)

或者让Policy对象维护它自己的状态,然后使用manager类将信息保存到数据库:

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

policy.Inactivate();

policyManager.Update(policy);

//method in Policy
public void Inactivate()
{
    this.Status = Inactive;
}
Run Code Online (Sandbox Code Playgroud)

Dr *_*bie 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);
}
Run Code Online (Sandbox Code Playgroud)

InactivateAndUpdate 是一种外观方法,它的作用是使调用代码更加整洁,同时仍然允许执行实际工作的方法成为单独的关注点(有点破坏方法的单一责任,但有时您只需要务实一点!)。我特意以 X和Y风格命名这些方法,以使它们在做两件事时脱颖而出。

然后,InactivateAndUpdate 方法可以让您开始实现策略模式或将实际的实现方法拆分为用于动态处理的命令对象或将来可能变得可行的任何其他体系结构。