0

私はここ数日、Javascript(タイスクリプト)の問題を解決しようとしているのに困惑しています。だからここに私のシナリオがあります:ダイナミック関数の呼び出しを解決するためのパラダイム/パターン

あなたは公的な機能を持っているクラスを持っています。この公的な機能は何千回も何度も呼び出され、パフォーマンスが最高です。ただし、その関数はif文や切り替えを使用せずに動的タスクを実行できる必要があります。たとえば...

class foo { 
    constructor() { 

    } 

    doWork1() { 
     return 1 + 1; 
    } 

    doWork2() { 
     return 5 + 5; 
    } 
} 

は今、任意のクラスは、それがdoWork1、またはdoWork2を呼び出す必要がある場合は知らずにとらわれないdoWork関数を呼び出すことができなければなりません。関数を列挙型にマッピングする方法を検討しましたが、パフォーマンステストではスケーラブルではあるが、恐ろしいアプローチになることが示されています。

そこで、私がこれまでに出ている最善の解決策は、このようにある:上記のコードで

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は、任意のクラスによって呼び出すことができ、常にそれが機能を指しますで初期化された。しかし、何かがちょうど私と座っていないと私はこれが最善のアプローチだとは思わない。私はコンストラクタで関数を渡してそこに割り当てることを考えていましたか?

このような問題を解決するためのパターンに関するご意見やアドバイスは、最も高く評価されます。ありがとう。あなたがあなたの代わりに列挙型の呼び出したい関数の名前を渡すことができる場合

+1

* "doWork1を呼び出すべきか、doWork2を呼び出すべきかわからない" * - しかし、...それはいつどこで必要なのかを知る必要があります。あなたのサンプルソリューションでは、コンストラクターが呼び出された時点で*知っています。 – nnnnnn

+0

どの機能を呼び出すかを決定するにはどうすればよいですか?そして、なぜif文が実行可能ではないと思いますか? – Aron

+3

私にはXY問題のように聞こえます... https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Lucero

答えて

0

あなたはこのようにそれを書き込むことができます。

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

あなたはTypeScript playgroundでこれを確認することができます。

関連する問題