java - 这个类是否遵循单一职责原则?

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

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

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

在方法 calculateCost() 中完成的计算完全没问题,但是对象的其他属性可以改变计算的完成方式。 因此,根据某些条件我应该能够应用折扣,有多个条件,每个条件都可以更改计算完成。

所以我通过创建私有(private)方法来应用简单的方法,如下所示

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

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

并从公共(public)方法中调用这些方法

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

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

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

最佳答案

I got the feedback that its not following Single Responsibility Principle

您的类(class)遵循单一职责原则,因为类(class)中的所有方法都有计算成本的单一目标。

你的类(class)没有遵守开放-封闭原则。每次需要引入新的计算机制时,你都需要修改你的类。 Open Closed Principle 声明类应该对扩展开放但对修改关闭。在您的案例中,您可以遵守 OCP 的方法之一是使用 Strategy Pattern每种计算类型都有一个类。

关于java - 这个类是否遵循单一职责原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42228157/

相关文章:

JButton 中的 Java 图标大小

java - 通过 JMS 使用 Oracle 高级队列 : NPE thrown at AQjmsProducer. jdbcEnqueue

java - 在任何派生类的构造函数之后运行方法

java - 我如何限制使用它们的子类的抽象类中的方法参数?

mysql - 如何设计此数据库以避免 3 个表之间的循环引用

C++:使用重载而不是动态转换通过基类选择派生类

java - 解决Java内存泄漏的一般策略?

java - 如何在java中单击按钮时暂停线程

c# - 更好的 C# 扑克框架设计?

asp.net-mvc - MVC3 设计 - 存储库模式和服务层