Oop &引用;一个方法应该做一件事,一次而且只能做一次这是什么意思?
SRP:“它说你的类或方法应该只做一件事” 我什么时候知道我的方法在做不止一件事?Oop &引用;一个方法应该做一件事,一次而且只能做一次这是什么意思?,oop,methods,coding-style,Oop,Methods,Coding Style,SRP:“它说你的类或方法应该只做一件事” 我什么时候知道我的方法在做不止一件事? 例子: 我有一个类Bus,其中有一个List和一个enumBusState。总线的状态取决于列表的大小 public void addPassenger(乘客p){ 本.乘客名单.add(p);; if(乘客列表大小
例子: 我有一个类
Bus
,其中有一个List
和一个enumBusState
。总线的状态取决于列表的大小
public void addPassenger(乘客p){
本.乘客名单.add(p);;
if(乘客列表大小<10)
this.state=bustate.EMPTY;
否则如果(乘客列表大小<30)
this.state=BusState.HALF_-FULL;
否则如果(passengerList.size>=30)
this.state=BusState.FULL;
}
即使我重构了它:
public void addPassenger(Passenger p){
this.passengerList.add(p);
changeBusState();
}
private void changeBusState(){
if (passengerList.size < 10)
this.state = BusState.EMPTY;
else if (passengerList.size < 30)
this.state = BusState.HALF_FULL;
else if (passengerList.size >= 30)
this.state = BusState.FULL;
}
public void addPassenger(乘客p){
本.乘客名单.add(p);;
changeBusState();
}
私有void changeBusState(){
if(乘客列表大小<10)
this.state=bustate.EMPTY;
否则如果(乘客列表大小<30)
this.state=BusState.HALF_-FULL;
否则如果(passengerList.size>=30)
this.state=BusState.FULL;
}
在我看来,方法addPassenger()
做的不止一件事:
-将新乘客添加到列表中
-检查当前的乘客人数
-如有必要,更改总线的状态
我如何理解SRP?这种方法做的不止一件事吗?我同意addPassenger
做的不止一件事
让它只做一件事的一种方法是删除state
字段,并使用getState
方法返回基于乘客数量的状态(假设您使用Java编写,并且BusState
是一个枚举):
公共总线状态getState(){
if(乘客列表大小<10)
返回BusState.EMPTY;
否则如果(乘客列表大小<30)
返回总线状态。半满;
否则如果(passengerList.size>=30)
返回BusState.FULL;
其他的
返回班车。未知的;/不知何故乘客的数量是负的?你也可以考虑在这里抛出一个例外…
}
罗伯特·马丁将“一件事”解释为“改变的一个商业理由”。对于所有的代码库,没有“一”的通用定义,因为我们创建的API在不同的抽象级别上工作。因此,这完全取决于谁是类的客户机,以及他们可能需要进行哪些更改
在您的案例中,可以说该方法正在做两件事:它管理总线的内容并计算状态。因此,它可能有两个改变的原因:
- 添加乘客的不同业务逻辑:例如,您可能希望验证总线中是否有足够的位置容纳另一名乘客,如果没有,则抛出异常
- 关于
BusState
语义的不同业务逻辑(最简单的例子:人们可能希望整辆公交车从31名乘客开始,而不是30名乘客)
在此上下文中,您可以将addPassenger
更改为只关注添加:
public void addPassenger(乘客p){
本.乘客名单.add(p);;
}
并更改BusState
getter以按需执行计算(类似于中的建议):
公共总线状态getBusState(){
if(乘客列表大小<10)
返回BusState.EMPTY;
否则如果(乘客列表大小<30)
返回总线状态。半满;
否则如果(passengerList.size>=30)
返回BusState.FULL;
其他的
扔。。。
}
public void addPassenger(Passenger p){
this.passengerList.add(p);
changeBusState();
}
private void changeBusState(){
if (passengerList.size < 10)
this.state = BusState.EMPTY;
else if (passengerList.size < 30)
this.state = BusState.HALF_FULL;
else if (passengerList.size >= 30)
this.state = BusState.FULL;
}
public BusState getState() {
if (passengerList.size < 10)
return BusState.EMPTY;
else if (passengerList.size < 30)
return BusState.HALF_FULL;
else if (passengerList.size >= 30)
return BusState.FULL;
else
return BusState.UNKNOWN; // somehow the no. of passengers is negative? You can consider throwing an exception here as well...
}