代码之家  ›  专栏  ›  技术社区  ›  mezoid

区分此代码关注点的最佳方法是什么?

  •  5
  • mezoid  · 技术社区  · 15 年前

    在一个 previous question 其中一条评论来自 Dr. 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(充当DAO的网关)管理策略对象的状态是否更好:

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

    或者让策略对象保持其自身状态,然后使用Manager类将信息保存到数据库:

    Policy policy = new Policy();
    policy.Status = Active;
    
    policy.Inactivate();
    
    policyManager.Update(policy);
    
    //method in Policy
    public void Inactivate()
    {
        this.Status = Inactive;
    }
    
    4 回复  |  直到 15 年前
        1
  •  1
  •   Dr Herbie    15 年前

    作为我最初评论的延续:)… 目前,您的最佳选择是第三个选项,但是如果事情变得更复杂,您可以使用第二个选项,同时添加facade方法来执行预先指定的序列:

    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);
    }
    

    灭活重复日期是一种外观方法,它只是为了使调用代码更整洁一些,同时仍然允许实际工作的方法成为独立的关注点(有点打破了对方法的单一责任,但有时你必须务实!).I故意用X样式命名这些方法 让他们在做两件事时脱颖而出。

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

        2
  •  3
  •   Frederik Gheysels    15 年前

    我会怎么做:

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

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

        3
  •  1
  •   bruno conde    15 年前

    我肯定会选择第三个选项,因为你提到的原因:

    策略对象维护它自己的 陈述然后使用Manager类 将信息保存到 数据库

    还可以看看 Repository Pattern . 它可以代替你的 PolicyManager .

        4
  •  0
  •   David Moles paddy-p    15 年前

    如果状态是 Policy 类,然后 政策 也应该有 Inactivate 方法——这只是基本的封装。在一个职责中纠缠多个类至少和赋予单个类多个职责一样糟糕。

    或者,可以将状态视为元数据 关于 这个 政策 ,不属于 政策 但对 PolicyManager .但在这种情况下, 政策 根本不应该知道自己的地位。