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

如何避免 while、for、if 的滥用?

  •  
  •   ALLROBOT · 2022-04-21 10:55:57 +08:00 · 4842 次点击
    这是一个创建于 939 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要是一个方法包含很多 while 、for 、if 或 case 啥,代码不仅丑,维护性又烂,大家咋避免这情况的?

    33 条回复    2022-04-22 08:24:33 +08:00
    maninfog
        1
    maninfog  
       2022-04-21 11:00:45 +08:00 via iPhone
    lint 检查?有一项是检查方法复杂度的
    villivateur
        2
    villivateur  
       2022-04-21 11:01:11 +08:00 via Android   ❤️ 4
    没懂你的意思,程序不就是由顺序代码、判断、循环组成的嘛?
    secondwtq
        3
    secondwtq  
       2022-04-21 11:02:23 +08:00   ❤️ 27
    那当然是换用 goto 啦
    evoluc97
        4
    evoluc97  
       2022-04-21 11:03:32 +08:00
    多用语法糖
    cmdOptionKana
        5
    cmdOptionKana  
       2022-04-21 11:04:45 +08:00   ❤️ 2
    多数情况下可以拆解成小函数。
    stillsilly
        6
    stillsilly  
       2022-04-21 11:05:23 +08:00
    你的问题可能是不会抽象
    谷歌搜一下
    herich
        7
    herich  
       2022-04-21 11:05:32 +08:00   ❤️ 16
    套上各种设计模式,消灭 if else, 这样不久之后你的代码就没多少人能看懂了
    knir
        8
    knir  
       2022-04-21 11:06:17 +08:00   ❤️ 1
    if 太多就改成表驱动,循环太多就拆成独立的函数
    stillsilly
        9
    stillsilly  
       2022-04-21 11:10:27 +08:00   ❤️ 1
    我随手帮你找了 2 篇,可以看一下
    https://www.infoq.cn/article/txedztawypmafc41kufq
    https://zhuanlan.zhihu.com/p/32563505

    另外《代码整洁之道》这本书,第 3 章第 3 小节“每个函数一个抽象层次”是讲抽象的,
    这书写得超级好,整本书都值得一读
    hikarufighter32
        10
    hikarufighter32  
       2022-04-21 11:13:29 +08:00   ❤️ 3
    如何避免酱油、醋、盐 的滥用?
    GeruzoniAnsasu
        11
    GeruzoniAnsasu  
       2022-04-21 11:13:47 +08:00   ❤️ 4
    1. if() if () 改为 if(not) break

    2. 多写一个函数取代第三层以及更里面的嵌套



    比起嵌套条件语句,嵌套匿名函数更让人崩溃, .map(()=>{.map(()=>这样的)})
    gesse
        12
    gesse  
       2022-04-21 11:15:30 +08:00
    @secondwtq
    嚯~哦~
    您搁着开倒车呢? 🐶
    TWorldIsNButThis
        13
    TWorldIsNButThis  
       2022-04-21 11:26:01 +08:00 via iPhone
    基本没写过 while
    你说的具体是哪个语言?
    q1angch0u
        14
    q1angch0u  
       2022-04-21 11:33:12 +08:00 via iPhone
    @TWorldIsNButThis 您这是 golang 吧 hhh
    adoal
        15
    adoal  
       2022-04-21 11:33:19 +08:00
    写成纯函数式呗
    66beta
        16
    66beta  
       2022-04-21 11:46:25 +08:00
    用 sonar 扫描 可读性复杂度
    ALLROBOT
        17
    ALLROBOT  
    OP
       2022-04-21 12:29:37 +08:00
    @TWorldIsNButThis #13 python ,C 之类🤣
    golangLover
        18
    golangLover  
       2022-04-21 12:37:15 +08:00 via Android
    v2ex 标准答案: 能跑就行了
    cssk
        19
    cssk  
       2022-04-21 12:41:49 +08:00
    嵌入式,单片机就应该多用用这些,还要用 goto
    fayetitus
        20
    fayetitus  
       2022-04-21 13:35:40 +08:00
    你是不是想问:如何降低圈复杂度?
    3dwelcome
        21
    3dwelcome  
       2022-04-21 13:37:56 +08:00
    @stillsilly 对我来说,抽象就是把经常变动的部分从代码里踢出去,保留不变的部分。

    多次递归后,就形成程序的第一层抽象。而良好的程序,多层抽象组合在一起的。

    很多新人需求都没弄明白,一上手就设计模式,有点画蛇添足了。
    zhangjinghua
        22
    zhangjinghua  
       2022-04-21 15:17:52 +08:00
    @stillsilly 这本书我认真读过两遍,确实非常不错
    ikas
        23
    ikas  
       2022-04-21 15:46:45 +08:00
    while 、for 、if 改成 elihw, rof, if
    ALLROBOT
        24
    ALLROBOT  
    OP
       2022-04-21 15:55:50 +08:00
    @fayetitus #20 是的。。。
    @cssk #19 单片机用 if ,for ,while 有时候发生 BUG 很奇怪

    比如 if 判断明明是 True 的,但 if 就是不执行

    比如用全局数组,方法按顺序执行,第一个方法能执行给数组某个索引下标赋值,第二个方法再次为数组某个下标赋值等等,我执行了 1000 次,前几次能正常输出不同的数组,但之后就输出 900 多个相同的一行。。。

    用 xxx[0]='\o'不管用😅,可能是我太菜的缘故吧
    libook
        25
    libook  
       2022-04-21 17:07:42 +08:00   ❤️ 1
    每种语法都有其适合的情况和不适合的情况,该用啥就用啥。

    提高代码的可读性有很多思路;
    比如拆分函数,一个入口函数进来就是很清晰的一个任务列表,然后每个任务想看具体实现就看对应子函数的代码;
    比如空行和注释,用空行来分割不同代码章节,如果一段代码很复杂,那么没有什么比加几句注释更容易让人理解的。

    有时候有人会避免使用 if ,比如函数提前 return ,或者各种三元表达式和逻辑运算,这样虽然代码少了,但同时也难以理解了,因为你要在自己脑海里建立一套状态。我反而十分推荐写 if 的时候尽量写 else ,把所有情况都清晰表达出来,这样也能避免一些逻辑不严谨产生的 bug 。
    DTCPSS
        26
    DTCPSS  
       2022-04-21 18:44:09 +08:00 via iPhone
    复杂度不能消灭只能转移…
    fernandoxu
        27
    fernandoxu  
       2022-04-21 18:49:37 +08:00   ❤️ 1
    fp ,多用数组方法,三亩运算
    darer
        28
    darer  
       2022-04-21 18:50:42 +08:00
    多用函数式编程(
    DOLLOR
        29
    DOLLOR  
       2022-04-21 19:50:52 +08:00 via Android
    用数组的 forEach, map, some, every 代替
    ragnaroks
        30
    ragnaroks  
       2022-04-21 19:51:59 +08:00
    无非就是防御性编程和响应式编程
    felixcode
        31
    felixcode  
       2022-04-21 20:24:37 +08:00 via Android
    只用状态机
    aliveyang
        32
    aliveyang  
       2022-04-21 21:32:07 +08:00
    业务简化了,程序自然就简化了
    fortunezhang
        33
    fortunezhang  
       2022-04-22 08:24:33 +08:00
    杀了产品经理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5369 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:34 · PVG 15:34 · LAX 23:34 · JFK 02:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.