【问题标题】:paradigm / pattern to solve dynamical function calling解决动态函数调用的范式/模式
【发布时间】:2017-03-19 00:20:10
【问题描述】:

过去几天我一直在尝试解决 Javascript(打字稿)中的问题,但我无法找到我觉得满意的解决方案。所以这是我的场景:

你有一个类,它有一个公共函数。这个公共函数将被调用数千次,所以性能是最重要的。但是,该函数必须能够在不使用 if 语句或切换的情况下执行动态任务。举个例子……

class foo {
    constructor() {

    }

    doWork1() {
        return 1 + 1;
    }

    doWork2() {
        return 5 + 5;
    }
}

现在任何类都必须能够调用不可知的 doWork 函数,但不知道它应该调用 doWork1 还是 doWork2。我已经研究过将函数映射到一个可枚举的,但是性能测试表明这是一种可怕的方法,尽管它是可扩展的。

因此,迄今为止我想出的最佳解决方案是:

class foo {

    public doWork:Function;

    constructor(fnFlag) {
        if(fnFlag === 1) {
            this.doWork = this.doWork1;
        } else if (fnFlag === 2) {
            this.doWork = this.doWork2;
        }
    }

    doWork1() {
        return 1 + 1;
    }

    doWork2() {
        return 5 + 5;
    }
}

在上面的代码中,公共函数 doWork 可以被任何类调用,并且总是指向初始化它的函数。但是,有些事情不适合我,我觉得这不是最好的方法。我正在考虑在构造函数中传递函数并在那里分配它?

对于解决此类问题的模式的任何想法或建议将不胜感激。谢谢。

【问题讨论】:

  • “但不知道它应该调用 doWork1 还是 doWork2。” - 但是……它必须在某个时候知道它想要哪个。在您的示例解决方案中,它确实知道在调用构造函数时。
  • 是什么决定了你要调用哪些函数?为什么你认为 if 语句没有性能?
  • 对我来说听起来像是 XY 问题...meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • 用工厂替换 foo - 搜索工厂模式 - 实例化例如foo 的子类,具有所需的行为。动态交换方法使得声明类不变量和编写测试用例变得更加困难。

标签: javascript typescript design-patterns dynamic polymorphism


【解决方案1】:

如果您可以传递要调用的函数的名称而不是枚举,则可以这样编写:

constructor(functionName) {
    this.doWork = this[functionName];
}

您可以通过TypeScript playground 验证这一点。

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2021-03-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多