Android开发Android开发经验谈Android开发

思考:你见过的Android开发,代码到底写的有多烂?

2020-10-19  本文已影响0人  10块钱new一个对象

这是一年前的事了!说起来还是挺乐的,当时前同事给我展示了我本来最初写的代码,后来可能是被外包的人改的面目全非,然后他又把它改规范了,让我意思意思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的暂停键。但是这个可能最后漏删了。

最后,这个代码还是被前同事改正常了。


上一篇 下一篇

猜你喜欢

热点阅读