这段代码有没有更优雅的写法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waiaan
V2EX    问与答

这段代码有没有更优雅的写法?

  •  
  •   waiaan 2018-12-27 15:06:23 +08:00 2059 次点击
    这是一个创建于 2541 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if (state1) { if (someObj.a.events1) { handleEvents1(someObj.a.events1); } if (someObj.a.events2) { handleEvents2(someObj.a.events2); } } else if (!state1) { if (someObj.b.events1) { handleEvents1(someObj.b.events1); } if (someObj.b.events2) { handleEvents2(someObj.b.events2); } } 

    请说一下思路,谢谢!

    12 条回复    2018-12-27 17:23:34 +08:00
    hcymk2
        1
    hcymk2  
       2018-12-27 15:14:42 +08:00
    Optional Chaining
    coderluan
        2
    coderluan  
       2018-12-27 15:18:08 +08:00
    函数数组喽,不光优雅,性能也好,类似 handleEvents[state](events[state])
    ytxbnahn
        3
    ytxbnahn  
       2018-12-27 15:50:52 +08:00
    var temp = state1 ? someObj.a : someObj.b;
    temp.events1 && handleEvents1(temp.events1);
    temp.events2 && handleEvents1(temp.events2);
    waiaan
        4
    waiaan  
    OP
       2018-12-27 16:04:55 +08:00
    @ytxbnahn 多谢。
    penisulaS
        5
    penisulaS  
       2018-12-27 16:08:34 +08:00
    很迷的 else if
    waiaan
        6
    waiaan  
    OP
       2018-12-27 16:14:12 +08:00
    @ytxbnahn 能否说一下思路?
    FInt1620
        7
    FInt1620  
       2018-12-27 16:17:41 +08:00
    @ytxbnahn
    @waiaan
    if 后的表达式可视为布尔值。如果只触发了 events1 而没有触发 events2 或者只触发了 events2 而没有触发 events1,你准备怎么做?
    FInt1620
        8
    FInt1620  
       2018-12-27 16:41:02 +08:00
    先用自然语言捋一捋这段代码的基本思路,再视情况能否精简。
    如果 state1 为 true,那么执行
    if (someObj.a.events1) {
    ...
    }
    if (someObj.a.events2) {
    ...
    }
    否则,如果 state1 为 false,那么执行
    if (someObj.b.events1) {
    ...
    }
    if (someObj.b.events2) {
    ...
    }
    由于布尔值只有 true 或 false,所以最外侧 if 语句的表达式判断语句可以改成
    if (state1) {
    ...
    } else {
    ...
    }
    var obj = state1 ? someObj.a : someObj.b;
    而 a 和 b 都是 someObj 对象的属性。
    但是,无法确定 a 和 b 各自的属性是否具有相同的含义。也就是说,a.events1 属性和 b.events1 属性的性质不同,那么它们不能被精简。
    类似于 Java 中的两个不同类。即使它们的实例都可以是父类的属性,但即使它们有相同名称的属性或方法,也不可将它们混淆。
    所以,内部 if 语句不能被精简。最保险且最能体现原有代码含义的结果为:
    var obj;
    if (state1) {
    obj = someObj.a;
    if (obj.events1)
    obj.handleEvents(obj.events1);
    }
    var obj = state ? someObj.a : someObj.b;
    if (obj.event1)
    obj.handleEvents(obj.events1)
    FInt1620
        9
    FInt1620  
       2018-12-27 16:43:15 +08:00
    以上代码未完成。以下是精简后的全部内容:
    var obj;
    if (state1) {
    obj = someObj.a;
    if (obj.events1)
    obj.handleEvents(obj.events1);
    if (obj.events2)
    obj.handleEvents(obj.events2);
    } else {
    obj = someObj.b;
    if (obj.events1)
    obj.handleEvents(obj.events1);
    if (obj.events2)
    obj.handleEvents(obj.events2);
    }
    whileFalse
        10
    whileFalse  
       2018-12-27 16:49:19 +08:00
    with(state1 ? someObj.a : someObj.b){
    if(event1) handleEvent1(event1)
    if(event2) handleEvent1(event2)
    }
    FInt1620
        11
    FInt1620  
       2018-12-27 16:54:41 +08:00
    如果在实际开发中,a 属性中的 events1 属性名称和 b 属性 events1 的名称完全一致,并且 a 属性中的 events2 属性名称和 b 属性 events2 的名称也完全一致,可以再进行精简:
    var obj = state1 ? someObj.a : someObj.b;
    if (obj.events1)
    obj.handleEvents(obj.events1);
    if (obj.events2)
    obj.handleEvents(obj.events2);
    但是,对于在同一页面同时使用的 a 属性和 b 属性而言,具有相同的属性名称并不是一件好事,不建议这么做
    waiaan
        12
    waiaan  
    OP
       2018-12-27 17:23:34 +08:00
    @FInt1620 非常感谢,我仔细消化一下。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1411 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 16:53 PVG 00:53 LAX 08:53 JFK 11:53
    Do have faith in what you're doing.
    ubao msn 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