如何避免 while、for、if 的滥用? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ALLROBOT
V2EX    程序员

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

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

    要是一个方法包含很多 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
    你说的具体是哪个语言?
    ryanbuu
        14
    ryanbuu  
       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
    多用函数式编程(
    AV1
        29
    AV1  
       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     Solana     6015 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 02:34 PVG 10:34 LAX 19:34 JFK 22:34
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86