【问题标题】:Is this class following the Single Responsibility Principle?这个类是否遵循单一职责原则?
【发布时间】:2017-02-14 14:01:18
【问题描述】:

我最近被指派设计一个在单个公共方法中包含业务逻辑的类

 class MyClass
       private BusinessObject object;
       public BigInteger calculateCost() {
              //do calcualation using properties of object
       }
 }

在方法 calculateCost() 中完成的计算完全没问题,但是对象的其他属性可以改变计算的完成方式。 所以基于某些条件我应该可以申请折扣,有多个条件每个都可以改变计算完成。

所以我通过创建如下私有方法来应用简单的方法

     private calculateCost1() {
           //using object's properties calculate the cost
     }

     private calcualteCost2() {
           //using object's properties calculate the cost
     }

并从公共方法中调用这些方法

      public BigInteger calculateCost() {
              //do calcualation using properties of object
              calculateCost1();
              calculateCost2();
      }

这种设计的缺点是,如果我需要添加额外的计算方法,我将不得不更改 MyClass 但是我得到的反馈是它没有遵循单一责任原则。我相信这个类的唯一职责是计算成本,在添加额外的方法来根据业务对象的属性以不同的方式计算成本之后,它仍然坚持 SRP。

如果不是真的,任何人都可以评论为什么这个设计不遵循 SRP 吗?

【问题讨论】:

  • 没有更多信息,我认为它符合 SRP
  • 你也负责设计BusinessObject这个类,还是给的?
  • 或者你在那里做,或者在其他类中做,然后从计算成本中调用这些类。无论哪种方式,最终值都需要在返回之前进行更改。
  • 如果你想让它更简单,你可以在返回最终值之前保留一个扣除列表 (%) 循环遍历它们。没有额外的课程或进一步的修改

标签: java oop design-patterns single-responsibility-principle


【解决方案1】:

我得到的反馈是它没有遵循单一职责原则

您的班级遵循单一责任原则,因为班级中的所有方法都有一个计算成本的目标。

你的班级不遵守的是开闭原则。每次需要引入新的计算机制时,都需要修改类。 开放封闭原则指出类应该对扩展开放但对修改关闭。在您的情况下,您可以遵守 OCP 的一种方法是使用Strategy Pattern,其中每种计算类型都有一个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多