V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
waiaan
V2EX  ›  问与答

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

  •  
  •   waiaan · 2018-12-27 15:06:23 +08:00 · 1732 次点击
    这是一个创建于 2188 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 多谢。
    kzfile
        5
    kzfile  
       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   ·   实用小工具   ·   1128 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:47 · PVG 02:47 · LAX 10:47 · JFK 13:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.