Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop &引用;一个方法应该做一件事,一次而且只能做一次这是什么意思?_Oop_Methods_Coding Style - Fatal编程技术网

Oop &引用;一个方法应该做一件事,一次而且只能做一次这是什么意思?

Oop &引用;一个方法应该做一件事,一次而且只能做一次这是什么意思?,oop,methods,coding-style,Oop,Methods,Coding Style,SRP:“它说你的类或方法应该只做一件事” 我什么时候知道我的方法在做不止一件事? 例子: 我有一个类Bus,其中有一个List和一个enumBusState。总线的状态取决于列表的大小 public void addPassenger(乘客p){ 本.乘客名单.add(p);; if(乘客列表大小

SRP:“它说你的类或方法应该只做一件事”

我什么时候知道我的方法在做不止一件事?
例子: 我有一个类
Bus
,其中有一个
List
和一个enum
BusState
总线的状态取决于
列表的大小

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...
}