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

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

  •  
  •   waiaan · 174 天前 · 1045 次点击
    这是一个创建于 174 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
        1
    hcymk2   174 天前
    Optional Chaining
        2
    coderluan   174 天前
    函数数组喽,不光优雅,性能也好,类似 handleEvents[state](events[state])
        3
    ytxbnahn   174 天前
    var temp = state1 ? someObj.a : someObj.b;
    temp.events1 && handleEvents1(temp.events1);
    temp.events2 && handleEvents1(temp.events2);
        4
    waiaan   174 天前
    @ytxbnahn 多谢。
        5
    kzfile   174 天前
    很迷的 else if
        6
    waiaan   174 天前
    @ytxbnahn 能否说一下思路?
        7
    FInt1620   174 天前
    @ytxbnahn
    @waiaan
    if 后的表达式可视为布尔值。如果只触发了 events1 而没有触发 events2 或者只触发了 events2 而没有触发 events1,你准备怎么做?
        8
    FInt1620   174 天前
    先用自然语言捋一捋这段代码的基本思路,再视情况能否精简。
    如果 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)
        9
    FInt1620   174 天前
    以上代码未完成。以下是精简后的全部内容:
    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);
    }
        10
    whileFalse   174 天前
    with(state1 ? someObj.a : someObj.b){
    if(event1) handleEvent1(event1)
    if(event2) handleEvent1(event2)
    }
        11
    FInt1620   174 天前
    如果在实际开发中,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 属性而言,具有相同的属性名称并不是一件好事,不建议这么做
        12
    waiaan   174 天前
    @FInt1620 非常感谢,我仔细消化一下。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   943 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 19:27 · PVG 03:27 · LAX 12:27 · JFK 15:27
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1