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

讨论一个业务代码判断的写法问题,这两种写法你们更喜欢那种?

  •  
  •   nuanshen · 2022-06-17 12:39:04 +08:00 · 5100 次点击
    这是一个创建于 888 天前的主题,其中的信息可能已经有所发展或是发生改变。
    //写法 1 ,不满足条件跳过业务处理
    for(){
      if(!condition){
        continue;
      }
      //businessCode
    }
    
    //写法 2,满足条件执行业务处理
    for(){
      if(condition){
        //businessCode
      }
    }
    
    55 条回复    2022-07-14 11:59:38 +08:00
    RedBeanIce
        1
    RedBeanIce  
       2022-06-17 12:40:34 +08:00 via iPhone
    分场景。绝大部分提前返回。1
    May725
        2
    May725  
       2022-06-17 12:42:30 +08:00
    更倾向于提前返回,避免嵌套
    TWorldIsNButThis
        3
    TWorldIsNButThis  
       2022-06-17 12:54:01 +08:00 via iPhone
    一般不用 for
    使用语义化的迭代工具
    map filter
    yazinnnn
        4
    yazinnnn  
       2022-06-17 12:57:06 +08:00   ❤️ 6
    collection.filter { } //过滤满足条件
    .map { } //执行业务,返回业务结果
    .reduce { } //聚合业务结果
    yolee599
        5
    yolee599  
       2022-06-17 13:01:27 +08:00 via Android
    提前 return ,可以提高运行效率,代码也美观
    chendy
        6
    chendy  
       2022-06-17 13:09:47 +08:00
    看内容多长……
    如果不长的话就套在写法 1 里
    如果比较长就写成写法 2 提前退出

    但是还有一种情况是好几个 contine / break 的( sonar 会警告
    这种情况一般就抽个方法,在方法里 return
    newaccount
        7
    newaccount  
       2022-06-17 13:10:01 +08:00
    看情况。business 部分行数不多用 2 ,多了用 1 。但用 1 的时候可能会声明变量以去掉 not 判断,因为快速浏览时感叹号不明显导致漏看。如果感叹号左右增加空格提高可读性又得配置 checkstyle ,麻烦
    dcsuibian
        8
    dcsuibian  
       2022-06-17 13:10:57 +08:00
    喜欢第 1 种,少一层嵌套。
    AlekoShen
        9
    AlekoShen  
       2022-06-17 13:34:45 +08:00
    一般 1 不过如果判断条件复杂会用 3,4 楼的写法
    VeryZero
        10
    VeryZero  
       2022-06-17 13:36:40 +08:00
    大多数情况肯定第一种好啊,可以显著降低阅读时的心智负担
    DrakeXiang
        11
    DrakeXiang  
       2022-06-17 13:37:52 +08:00
    我一般都是 2 ,除非业务逻辑比较长,然后只有一个 condition 的情况下可能会选择 1
    Detector
        12
    Detector  
       2022-06-17 13:37:58 +08:00
    第一种,不管是写起来是读起来,对我而言都舒服太多
    ericls
        13
    ericls  
       2022-06-17 13:41:32 +08:00 via iPhone
    @yazinnnn 有些语言这样写会产生实际的性能问题 虽然看起来比较舒服

    我个人喜欢第一种 但是你要写成别的 我也没意见
    MakHoCheung
        14
    MakHoCheung  
       2022-06-17 14:14:57 +08:00
    第一种是一个模式,忘了叫啥,Swift 的 guard 语句就是这样
    xuelu520
        15
    xuelu520  
       2022-06-17 14:17:56 +08:00
    写法一吧,
    第二种如果业务代码很多,很容易造成多重嵌套。
    buried
        16
    buried  
       2022-06-17 14:23:12 +08:00
    写法一,避免太多的缩进
    hidemyself
        17
    hidemyself  
       2022-06-17 14:23:45 +08:00
    第一种,卫语句
    SteveWoo
        18
    SteveWoo  
       2022-06-17 14:24:37 +08:00
    看这个模块重不重要。 如果出错了风险大不大。 一般情况第一种。
    重要场景,个人一定会 if 和 else 成对出现来实现,宁愿有一堆 if else 嵌套
    for(){
    if {
    if {
    } else{
    }
    } else {
    if {
    } else{
    // 根据算法多次与产品确认,这个场景就是啥也不做
    }
    }
    }
    fkname
        19
    fkname  
       2022-06-17 14:29:56 +08:00
    排除其他条件更喜欢第二种,因为第一种加了一个非,有时候变量命名又是什么 notSuccess 之类的,再加个非脑子里就要多想一下,如果疏忽了就可能导致判断错误。
    exmario
        20
    exmario  
       2022-06-17 14:40:22 +08:00
    一般选 2 ,业务流程更清晰
    aababc
        21
    aababc  
       2022-06-17 14:46:47 +08:00
    我感觉我是分情况,在循环里不太喜欢使用 break ,continue, 在非循环的场景下,喜欢提前返回!
    yfugibr
        22
    yfugibr  
       2022-06-17 14:55:45 +08:00
    看情况,一般会选用嵌套层数少的,逻辑看着清晰一点
    yaodong0126
        23
    yaodong0126  
       2022-06-17 15:00:26 +08:00
    说第一种的,一定没看过 lint 标准,我就贴个地址,自行斟酌: https://eslint.org/docs/rules/no-continue
    zakokun
        24
    zakokun  
       2022-06-17 15:02:42 +08:00
    一般都提前返回 防止嵌套太多层
    fpure
        25
    fpure  
       2022-06-17 15:05:08 +08:00
    @MakHoCheung Avoid Else, Return Early?
    SeaTac
        26
    SeaTac  
       2022-06-17 15:08:00 +08:00 via iPhone
    我反正从来不用 continue…
    jorneyr
        27
    jorneyr  
       2022-06-17 15:16:07 +08:00
    喜欢第一种守卫式写法,并且后面的代码也不用多一层缩进。
    potatowish
        28
    potatowish  
       2022-06-17 15:19:51 +08:00 via iPhone
    判断条件很多,就用第一种,判断条件少用第二种
    28Sv0ngQfIE7Yloe
        29
    28Sv0ngQfIE7Yloe  
       2022-06-17 16:41:16 +08:00
    目前我的代码尽量都是一次缩进,二次缩进就有阅读成本了
    dexterque
        30
    dexterque  
       2022-06-17 16:59:11 +08:00
    一般推荐 1 吧
    cnoder
        31
    cnoder  
       2022-06-17 16:59:36 +08:00
    有没有可能 他某个语言,没有 continue 0.0
    daimubai
        32
    daimubai  
       2022-06-17 17:04:01 +08:00
    第 1 种,可读性高。可以解放思维,continue 的就不用再管了
    Rache1
        33
    Rache1  
       2022-06-17 17:04:24 +08:00
    @cnoder TWIG 😂,虽然不算语言,是一个模板引擎,实现了自己的流程控制语句,但是就是没有 continue 和 break
    Xusually
        34
    Xusually  
       2022-06-17 17:04:34 +08:00
    在循环里,没有特殊情况的话,我一般用 2.

    但是在循环外,可以直接 return 的时候经常用 1.
    littlewing
        35
    littlewing  
       2022-06-17 17:06:57 +08:00
    1
    unregister
        36
    unregister  
       2022-06-17 17:19:07 +08:00 via Android
    用 continue 感觉有点多余
    libook
        37
    libook  
       2022-06-17 17:25:14 +08:00
    如果代码很长,提前返回可能不利于可读性;甚至建议除非有必要不写 else ,有 if 必有 else ,这样能规避一些逻辑盲区的 bug ,让任何情况都有所处理。

    当然代码风格没有完全之策,最好是在每个项目的迭代过程中进行归纳整理,然后沉淀为 lint 规则。
    guanhui07
        38
    guanhui07  
       2022-06-17 17:47:48 +08:00
    1 喜欢卫语句,减少嵌套 好看,方便维护,心智负担少点
    buxudashi
        39
    buxudashi  
       2022-06-17 17:51:29 +08:00
    再加个
    if(!!condition){}
    Suddoo
        40
    Suddoo  
       2022-06-17 17:53:11 +08:00 via iPhone
    我一般用第一种
    jiangzhizhou
        41
    jiangzhizhou  
       2022-06-17 18:17:54 +08:00
    这两种都可以,但是 for 一般必须被 Stream 替换。
    stillsilly
        42
    stillsilly  
       2022-06-17 18:23:38 +08:00
    我写代码 18 年了,从没用过 continue
    unco020511
        43
    unco020511  
       2022-06-17 18:48:04 +08:00
    我喜欢 1
    kinghly
        44
    kinghly  
       2022-06-18 00:19:49 +08:00 via Android
    减少嵌套
    clorischan
        45
    clorischan  
       2022-06-18 03:20:11 +08:00   ❤️ 1
    个人习惯是循环内用真判断, 满足条件时执行.
    函数内使用假判断, 参数不符合要求提前返回.
    e.g:
    DoSomethings (things)
    {
    if (things is null) throw
    if (things is empty) return

    for (thing in things)
    {
    if (thing is not nothing)
    {
    //do thing
    }
    }
    }
    lujiaosama
        46
    lujiaosama  
       2022-06-18 08:42:46 +08:00
    循环外第一种提前返回, 循环内第二种我不喜欢用 continue
    icylogic
        47
    icylogic  
       2022-06-18 11:08:39 +08:00
    第一种视觉上嵌套少,但 npath 复杂度仍然是升高的,函数最终还是要控制 npath (或者类似的标准)以适配人脑 cache 大小
    a68UkLHpycW7ImyV
        48
    a68UkLHpycW7ImyV  
       2022-06-18 12:00:21 +08:00 via Android
    大部分情况下都是第 1 种
    wu67
        49
    wu67  
       2022-06-18 14:41:14 +08:00
    建议看看《重构》, 有对这个场景的说明.
    按我个人理解, 是分支少就直接 if else.
    if else 过多, 需要打断嵌套地狱, 就使用‘错误先行’, 即提前返回, 后续的代码就能少一层{}
    cheng6563
        50
    cheng6563  
       2022-06-18 15:10:42 +08:00
    哪种{}小用哪种
    evan1024
        51
    evan1024  
       2022-06-18 19:23:08 +08:00 via Android
    一般保持团队一致即可,推荐引入代码风格检查工具
    irisdev
        52
    irisdev  
       2022-06-18 21:10:59 +08:00
    2 吧,不喜欢用 continue
    changz
        53
    changz  
       2022-06-19 16:55:25 +08:00
    卫语句
    alen0206
        54
    alen0206  
       2022-06-24 14:49:48 +08:00
    1
    siweipancc
        55
    siweipancc  
       2022-07-14 11:59:38 +08:00 via iPhone
    第二种容易写成无限套娃,看得人头大。
    我写的业务代码缩进超过两次就当场重构了。

    我的猜想是喜欢第二种的大部分原因来源产品模糊的需求,那怎么避免呢? if 判断精确判断到产品的原话不就得了,好处是出问题直接甩锅,至于代码维护的相信后人智慧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   977 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:57 · PVG 04:57 · LAX 12:57 · JFK 15:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.