java - 在类里面应用单一职责原则?

标签 java solid-principles design-principles

单一职责原则(SRP):-

每个类都应该有单一的责任。基本上,应该有一个改变的理由。我不知道 最后一句话到底是什么意思。我的解释是,以一种应该有单一理由进行更改的方式设计类,可以有单一方法,因为每个方法都是一种行为,因此也是一种原因。那是对的吗?如果不是,到底是什么原因?

考虑一个股票交易系统,其中大多数开发人员都提出了 StockService.java 具有买入和卖出方法的设计。这里会有两个原因(买入和卖出)来改变这个类

public class StockService {
    
   private String name = "ABC";
   private int quantity = 10;

   public void buy(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   }
   public void sell(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   }
   
   // other methods related to socks
}

为了遵循SRM原则,我是否需要提出单独的类,其中StockBuyService.java(包含购买相关方法)和StockSellService(包含出售相关方法)。是吗?

最佳答案

不一定。当您考虑到该类的用途是 StockService 时,buy()sell() 方法一起使用就有意义了。从名称来看,可以合理地预期股票服务将处理投资者的交易请求,这些交易请求可以是 buy()sell()。 (事实上​​,具有单一方法 trade() 的股票服务可能存在违反接口(interface)隔离原则的风险,具体取决于其实现方式。)

可能存在将此类内部的买卖分开的情况,即如果您必须一起处理所有类型的交易,但又为每种类型实现不同的规则或规定。在这种情况下,您可以考虑使用策略模式,该模式使用多态性来根据正在发生的交易类型来实现规则。但是您的示例类没有涉及这些细节,因此请遵循 YAGNI principle ,你还没到。

但是既然你问了这个问题,那就表明这个名字可能不够清晰。 (在重构实践中,这被称为代码味道。)这是检查它并问问自己类是否正确命名的好时机。这真的是库存服务吗?如果该类被命名为 StockTradingService,您还会不确定吗?你能想出一个更好的名字来更清楚地表达这个类的目的吗?我并不是说这是一个坏名字,或者说它必须改变。我只是说你应该认识到,必须提出这个问题应该在你的脑海中升起一个“谨慎”的旗帜。

关于java - 在类里面应用单一职责原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46391397/

相关文章:

java - CDI @Transactional 与自调用

c# - C# 中的同步方法

solid-principles - Liskov 替换原理示例

c# - 将逻辑放入异常中可以吗?

java - Spring DATA JPA 以 Hibernate 作为 JPA 提供者

java - 初始化时关闭 Spring

java - 如何摆脱类型转换?

android - 如何在MVVM,整洁架构中为存储库提供Drawable

oop - "dependency inversion principle"在 OOP 中是什么意思?

c# - 一种非常常见的 C# 模式,它打破了非常基本的 OOP 原则