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

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

  •  
  •   ALLROBOT · 76 天前 · 3953 次点击
    这是一个创建于 76 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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



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

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

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

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

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

    用 xxx[0]='\o'不管用😅,可能是我太菜的缘故吧
    libook
        25
    libook  
       76 天前   ❤️ 1
    每种语法都有其适合的情况和不适合的情况,该用啥就用啥。

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

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