思考:你见过的Android开发,代码到底写的有多烂?
这是一年前的事了!说起来还是挺乐的,当时前同事给我展示了我本来最初写的代码,后来可能是被外包的人改的面目全非,然后他又把它改规范了,让我意思意思review下,并且吐槽下外包的代码。我拿起代码和git提交历史一看,一口老血喷在地上。
我写的初版是这样的(不喜欢直接展示原代码,所以这边是抽象掉+集中展示槽点的修改版):
public bool ValidateUser(long userId)
{
int userScore = 100;
if (!CheckCondition1(userId)) userScore -= 10;
if (!CheckCondition2(userId)) userScore -= 15;
......
return userScore >= 60;
}
这个代码我当时写的时候没有留意magic number的问题,但是,可读性上是OK的。
然后,翻git看到了第一版改动。应该是有需求提出,有一个condition,是一票否决的,这个为false直接结束。
于是代码变成了这样:
public bool ValidateUser(long userId)
{
int userScore = 100;
bool b = CheckYCDYCondition(userId);
if (!CheckCondition1(userId)) userScore -= 10;
if (!CheckCondition2(userId)) userScore -= 15;
......
if (b == true)
goto end;
if (b == false)
return false;
:end
return userScore >= 60;
}
b== true, goto, 还有你都上来一票否决了,还在check剩下的条件,这我就不说了。YCDY是啥呢?我问前同事,他也不知道,回头去问。第二天他告诉了我:
此时一万把锤子在我的心中呼啸而过。(这边说点正经的,看到有几个人问我这个正常应该怎么写?个人觉得表现出高阶覆盖/起决定作用的意思即可。因此,写Ultimate, SuperOverride, FirstPriority等都可以)
第二版:
public bool ValidateUser(long userId)
{
int userScore = 100;
bool b = CheckYCDYCondition(userId);
if (!CheckCondition1(userId)) userScore -= 10;
if (!CheckCondition2(userId)) userScore -= 15;
......
if (!b == true)
return userScore >= 60;
else if (!b == false)
return false;
else
return false;
}
嗯好,goto没了,变成如果b既不等于true也不等于false还可以进行下去了。YDCY听同事解释是里面逻辑改了,本来false变成true,本来true变false(喷血)。
改就改吧,我也没办法,但是对应措施是把b改成!b么?然后!b == false???
我在草丛里蹲你,
你知道我在草丛里蹲你?
我知道你知道我在草丛里蹲你?
我问同事这代码有人review吗,他说这段时间就那几个外包的在搞这个模块,我们这边就看跑起来功能正确就可以了。
第三版:
const static int fillScore = 100;
const static int passScore = 60;
public static bool ValidateUser(long userId)
{
int userScore = fillScore ;
int Score10 = 12;
int Score15 = 15;
bool b = CheckYCDYCondition(userId);
if (!CheckCondition1(userId)) userScore -= Score10 ;
if (!CheckCondition2(userId)) userScore -= Score15 ;
......
if (!b == true)
return userScore >= passScore;
else if (!b == false)
return false;
else
return false;
}
fillScore 是满分的意思,懒得专门开篇吐槽。看出来好像也在解决魔数问题。但是Score10是啥啊,说明如果condition1不过,要扣10分么?那你赋值10就行了,变量写10是啥意思?看,这里被要求改成12了吧?
还有,怎么就变static了?这个原因忘了,好像说是要new什么静态类的。new静态类就除了把整个方法都静态化之外没其他办法了吗???
第四版:
bool b = !CheckYCDYCondition(userId);
if (!CheckCondition1(userId)) userScore -= Score10 ;
if (!CheckCondition2(userId)) userScore -= Score15 ;
......//后面又加过好几个条件,不仅仅这一版
System.threading.thread.sleep(3000);
if (!b == true)
return userScore >= passScore;
else if (!b == false)
return false;
else
return false;
}
一锤定音看起来又反回来了(第一行),所以逻辑现在变成你知道我知道你知道我在草丛里蹲你了;(这个我觉得情有可原吧,毕竟bool b 和if (b)间隔超过一屏了) 但是一看到sleep(3000),我就想起了这个段子——这个函数性能不好,加钱给你优(sleep后面的数字改小)化。
就问他,是不是当初是这个意思,结果他说,哦,我知道,他们是拿这个来debug的,单独函数跑太快了,直接执行就完毕了,所以要时间给你点debug的暂停键。但是这个可能最后漏删了。
最后,这个代码还是被前同事改正常了。