編集:この興味深いライブラリを見つけました。これは、私が最後に説明したこととまったく同じことができるように見えます: https://github.com/philbooth/check-types.js
check.quacksLike を呼び出すことでできるようです。
私は JavaScript を使用するのにかなり慣れていないので、JavaScript が提供する強力な機能を気に入っています。一部の引数が特定のインターフェイスを尊重するようにする簡単な方法が欲しいです。
私の問題を強調する簡単な方法の例を次に示します。
var execute = function(args)
{
executor.execute(args);
}
args
エグゼキュータが というプロパティを持つことを期待しているとしましょうcmd
。定義されていない場合、プログラムが参照しようとしたときに別のレベルでエラーがキャッチされる可能性がありますがcmd
、undefined
. cmd
このようなエラーは、このメソッドに が存在することを明示的に強制するよりも、デバッグが面倒です。エグゼキュータは、少し渡さargs
れる関数が呼び出されることを期待することさえあります。getExecutionContext()
デバッグが、引数が最初に渡された場所を確認するために関数呼び出しを追跡するという悪夢にすぐに変わる、はるかに複雑なシナリオを想像することができました。
また、次の行で何かをしたくありません。
var execute = function(args)
{
if(args.cmd === undefined || args.getExecutionContext === undefined ||
typeof args.getExecutionContext !== 'function')
throw new Error("args not setup correctly");
executor.execute(args);
}
これは、引数を持つすべての関数、特に複雑な引数の場合、かなりの量のメンテナンスを必要とします。インターフェイスを指定して、このインターフェイスに一致する入力を期待することを javascript に伝えるコントラクトを何らかの方法で強制できるようにしたいと考えています。
たぶん次のようなもの:
var baseCommand =
{
cmd: '',
getExecutionContext: function(){}
};
var execute = function(args)
{
enforce(args, baseCommand); //throws an error if args does not honor
//baseCommand's properties
executor.execute(args);
}
その後、これらのインターフェイスをさまざまな関数間で再利用し、プロパティ名のスペルミスや間違った引数を渡すことを心配することなく、それらを拡張して関数に渡すオブジェクトを定義できます。これを実装する方法、または既存の実装をどこで利用できるかについてのアイデアはありますか?