【自己专坑自己之违反单一职责原则】
一个函数设计用来判断某种类型的内容是否展示,伪代码如
SomeCard card = cards.stream().findFirst(特定条件).orElse(null);
if(card == null) return;
if(canShow(card)) {
//省略一些业务逻辑
}
// 判断的函数定义
boolean canShow(SomeCard card)
由于此类型的每种卡片的判断逻辑都一样,因此选取第一张卡片进行判断即可。
后续需求变更,需要在展示卡片时为卡片填充一些特定属性。
显然应该在返回 show 之后再进行处理,但是填充的属性又依赖于是否展示,同学为了省事,直接在 canShow 里面对card 进行属性填充。
线上代码审查时,看到该函数用于判断是否展示,没特别仔细看发现没问题。
实际上 canShow 干了两件事,一个是判断是否可以展示,一个是进行属性填充。
结果只对第一张卡片进行了属性填充,出现了 BUG。
这是一个典型违反单一职责造成的 BUG,希望大家能够吸取经验和教训,在开发时尽量遵循设计原则,少踩坑。
另外,特别强调,我们写代码的原则一定是怎么合理怎么写,而不是这嫌麻烦,那嫌麻烦,很容易给自己埋坑。
宁愿多定义一个对象,也不要因为省事违反单一职责。