单一职责原则(SRP)疑问:方法单一职责的含义及违规判定
嘿,我来帮你把这两个问题掰扯清楚~
问题1:“一个方法应该只做一件事,且仅做一次”是什么意思?
这句话其实是把单一职责原则和DRY(Don't Repeat Yourself)原则结合起来说的:
- “只做一件事”:指每个方法的职责要极度聚焦,不能把不相关的逻辑硬塞进去。比如一个叫
calculateTotalPrice的方法,就只负责计算总价,别同时去处理订单保存或者发送通知的逻辑。 - “仅做一次”:指同一段逻辑别在多个方法里重复写。比如你需要判断巴士是否满员的逻辑,别在
addPassenger、removePassenger、checkDeparture里都写一遍,抽成一个单独的isBusFull方法,以后要改判断规则,只需要改这一处就行,省心又不容易出错。
问题2:如何判断方法正在做不止一件事?
拿你给出的Bus类的addPassenger方法举例,咱可以从这几个角度判断:
public void addPassenger(Passenger p){ this.passengerList.add(p); if (passengerList.size() < 10) this.state = BusState.EMPTY; else if (passengerList.size() < 30) this.state = BusState.HALF_FULL; else this.state = BusState.FULL; }
- 看方法名和实际做的事是否匹配:方法名叫
addPassenger,字面意思是“添加乘客”,但它额外做了“根据乘客数量更新巴士状态”的事——这就明显超出了它的职责范围。 - 能不能拆出独立的逻辑块:这个方法里有两个完全独立的动作:把乘客加入列表、更新巴士状态。这两块逻辑可以毫无冲突地拆成两个方法,说明原方法做了不止一件事。
- 思考需求变化的影响范围:如果以后巴士状态的判断规则变了(比如改成<15才算EMPTY),本来只需要改状态相关的逻辑,但现在要动
addPassenger方法——这就说明两个职责耦合在一起了,原方法承担了多件事。 - 描述方法时是否用到多个动作词:当你描述这个方法时,会说“它先添加乘客,然后判断人数更新状态”——用到了“先...然后...”这类连接词,基本就能确定它做了不止一件事。
优化后的代码可以这样写,每个方法只专注一件事:
public void addPassenger(Passenger p){ this.passengerList.add(p); updateBusState(); // 把状态更新逻辑抽成单独方法 } private void updateBusState(){ int passengerCount = this.passengerList.size(); if (passengerCount < 10) this.state = BusState.EMPTY; else if (passengerCount < 30) this.state = BusState.HALF_FULL; else this.state = BusState.FULL; }
内容的提问来源于stack exchange,提问作者Mapi
相关产品推荐
相关产品推荐

