单一责任原则(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
?您能想到一个更好的名称来更清楚地表达该课程的目的吗?我并不是说这是一个坏名字,或者必须更改它。我只是在说,您应该认识到必须问这个问题会在您脑海中浮现一点“警告”标志。