V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TIGERB
V2EX  ›  程序员

在一堆业务逻辑无限 return false 的代码里查 bug,真的很蛋疼。。。

  •  
  •   TIGERB ·
    TIGERB · 2017-03-28 19:44:20 +08:00 · 3437 次点击
    这是一个创建于 2800 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在一堆业务逻辑无限 return false 的代码里查 bug,真的很蛋疼。。。

    就这样~

    18 条回复    2017-03-29 11:12:55 +08:00
    WenhaoWu
        1
    WenhaoWu  
       2017-03-28 20:31:42 +08:00
    if(dataNotValid(data)){
    notValid();
    return false;
    }

    if(dataNotMatch(data)){
    notMatch();
    return false;
    }

    handleData(data);
    return true;

    vs

    if(!dataNotValid(data)){
    if (!dataNotMatch(data)){
    handleData(data);
    return true;
    }
    else {
    notMatch();
    return false;
    }
    }
    else{
    notValid();
    return false;
    }
    mokeyjay
        2
    mokeyjay  
       2017-03-28 20:34:54 +08:00 via Android
    直接把 return false 替换为抛出错误然后外部捕捉统一返回不是更好吗?
    cdwyd
        3
    cdwyd  
       2017-03-28 20:36:43 +08:00
    直接 return false 更容易理解。
    bk201
        4
    bk201  
       2017-03-28 20:37:05 +08:00 via iPhone
    @mokeyjay return false 不代表异常啊
    xialdj
        5
    xialdj  
       2017-03-28 20:55:11 +08:00 via iPhone
    @WenhaoWu 我喜欢前一种 代码清晰 条件分拆清楚
    laball
        6
    laball  
       2017-03-28 21:23:06 +08:00
    这个时候,就是体现代码重构的功底了!
    linbiaye
        7
    linbiaye  
       2017-03-28 21:24:29 +08:00
    求看看代码张什么样啊
    greatbody
        8
    greatbody  
       2017-03-28 22:18:06 +08:00
    建议写一个函数,将所有需要验证的逻辑作为参数数组传给这个函数。
    比如:
    验证器([
    ()=>{验证逻辑 1},
    ()=>{验证逻辑 2},
    ()=>{验证逻辑 3}])

    验证器函数自己逐个调用这些函数,然后遇到一个 false 就直接 return 。

    这一朵朵奇葩一样嵌套的 if 判断也是够了。
    wc951
        9
    wc951  
       2017-03-29 08:49:55 +08:00 via Android
    返回布尔型其实不是一个好的选择,分支多的情况下连哪出错都判断不了
    0915240
        10
    0915240  
       2017-03-29 09:08:58 +08:00 via iPhone
    @mokeyjay 所以现在大多数情况下我喜欢 Preconditions
    TIGERB
        11
    TIGERB  
    OP
       2017-03-29 10:17:38 +08:00
    @wc951 是啊,很蛋疼呢,哈哈
    guyskk
        12
    guyskk  
       2017-03-29 10:17:59 +08:00
    这种情况就应该抛异常
    TIGERB
        13
    TIGERB  
    OP
       2017-03-29 10:18:50 +08:00
    @mokeyjay 除了函数,使用异常是个明智的选择
    TIGERB
        14
    TIGERB  
    OP
       2017-03-29 10:19:07 +08:00
    @laball 哈哈
    TIGERB
        15
    TIGERB  
    OP
       2017-03-29 10:19:32 +08:00
    @linbiaye 不太方便,哈哈
    mokeyjay
        16
    mokeyjay  
       2017-03-29 10:23:26 +08:00
    @bk201 #4 并不是真的要抛出异常,我说“统一捕捉返回”的意思就是 try{ ... } catch(e) { return false; }。抛出异常其实只是跳出业务逻辑的一种手段。后期如果需要扩展、让程序返回具体的异常类型时也比较方便
    annielong
        17
    annielong  
       2017-03-29 10:54:49 +08:00
    就这个来看应该重写 dataNotValid ,返回错误代码,然后再根据错误代码输出
    ic2y
        18
    ic2y  
       2017-03-29 11:12:55 +08:00
    应该改改,返回 0 表示正常,返回非零,表示异常。

    然后,在前面定义宏,
    MATCH _ERROR = 1;
    VAILD_ERROR = 2;
    等等,或者使用枚举。

    然后,最后 return *_ERROR ;

    这样观察返回值,就知道哪里错了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3261 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:07 · PVG 22:07 · LAX 06:07 · JFK 09:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.