【发布时间】: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