单一责任原则(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(包含Buy相关方法)和StockSellService(包含Sell相关方法)。是吗 ?

最佳答案

不必要。当您认为类的目的是buy()时,sell()StockService方法一起有意义。根据名称,可以合理预期股票服务将处理投资者的交易请求,这些交易请求可以是buy()sell()。 (事实上​​,使用单一方法trade()的股票服务可能会违反接口隔离原则,具体取决于实施方式。)

在这种情况下,可能存在将此类内部的买卖分开的情况,那就是如果您必须一起处理所有类型的交易,但为每种类型实施不同的规则或规定。在这种情况下,您可能会考虑使用策略模式,该模式使用多态性根据正在发生的交易类型来实施规则。但是您的示例类没有涉及到此类细节,因此按照YAGNI principle进行操作时,您还不存在。

但是由于您是在问这个问题,所以这表明该名称可能不够清楚。 (在重构的实践中,这被称为代码气味。)这是回顾它并询问自己是否正确命名该类的好时机。这真的是股票服务吗?您是否会不确定类是否已命名为StockTradingService?您能想到一个更好的名称来更清楚地表达该课程的目的吗?我并不是说这是一个坏名字,或者必须更改它。我只是在说,您应该认识到必须问这个问题会在您脑海中浮现一点“警告”标志。

10-01 16:10