【问题标题】:Is it bad to have If-instanceof-statements in Typescript? [closed]在 Typescript 中使用 If-instanceof-statements 是不是很糟糕? [关闭]
【发布时间】:2018-07-26 13:34:28
【问题描述】:
   selectAction: (actionEvent) => {
        if (actionEvent instanceof Action1) { 
            // action1 body implementation
        } else if (actionEvent instanceof Action2) {
            // action2 body implementation
        } 
    }

上面的代码 sn-p 反映了不同类型的动作,它执行不同的功能。我使用 if 和 else 条件来检查动作。

我觉得这不是一个好的解决方案,因为我将来可能会有更多的操作,而且我的 if-else-ladder 会不断增长,当有变化时我需要再次更新我的代码。

对改进这个特定场景有什么想法吗?

【问题讨论】:

  • 应该是actionEvent.select()。使其成为Action 接口的方法。
  • action2action1 是什么?这些实际上是否应该与传递给方法的参数相同(actionEvent)?
  • action1action2 来自哪里,你的意思是 actionEvent
  • 视情况而定,一如既往。这个列表可能会增长吗?或者它是一个特定的有限列表。例如,如果您正在处理内置类型,因为您正在编写 JSON 编码器,那么要使用的类型列表是有限的,这将是一种合适的方法。 OTOH,如果类型不受定义限制,那么使用接口和actionEvent.someAction() 会更有意义。细节在这里很重要。
  • 请避免Is is badis it goodwhat better way to do X问题。不好怎么办?好如何?在您的情况下,您希望提高可维护性。在某些项目中,if-else-ladder 足够好。它本质上并不坏。

标签: javascript typescript if-statement instanceof


【解决方案1】:

使用duck typing的方法来避免条件场景。 Source

在每个类型实例Action1Action2 中都有一个名为selection() 的方法,并使用它来定义您想要构建的主体/所需功能。并且只需调用selection() 方法避免条件。所以根据类型的实例,它会调用对应类型的正确的selection()方法

【讨论】:

    【解决方案2】:

    在 TypeScript 中使用 if/else 本身并没有错。

    但是,当您使用 instanceof 时,您可能有更好的选择。在这种情况下,几乎可以肯定的是,操作本身应该为他们所做的事情负责:

    selectAction: (actionEvent) => {
        actionEvent.execute();
    }
    

    ...或

    selectAction: (actionEvent) => {
        const action = /*...derive action from actionEvent...*/;
        action.execute();
    }
    

    ...或类似的(或者当然,直接使用actionEvent.execute() 而不是selectAction)。

    这从根本上说是多态性,不同的对象遵循相同的接口,并且在调用时(可能)做不同的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-13
      • 2011-09-20
      • 2011-10-06
      • 2015-03-09
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多