現在、JavaScriptのセット実装に取り組んでいます。これは、JavaまたはC#から知られているジェネリックをシミュレートする必要があります。その可変バージョン(設定値の追加/削除が可能)と不変バージョンが必要です。
私のコンストラクターの署名は次のようになります。
new GenericSet( 'number', [ 10, 20, 30 ] );
、
// mutable set of mixed values (allows to add further values via "add")
new MutableGenericSet( '*', [ 'foo', 42, {}, /./ ] );
または
// DataValues.prototype.equals will be used by the set for determining equality.
new GenericSet( { type: DataValue, valueComparison: 'equals' }, [ dv1, dv2, dv3 ] );
GenericSetだけか、タイプごとに1つのセット実装ですか?
当初、これの主な目的は、1つのタイプの値のセットを持つことでした。たとえば、データ値のみを受け入れるDataValuesSet。次に、DataValuesSetインスタンスを必要とする関数を使用してインターフェイスを定義できます。継承を使用することはできず(とにかく悪いことだと思います)、そのため、コンポジションを使用し、GenericSet / MutableGenericSetインスタンスを内部で使用します。
別のアプローチは、常にGenericSetを取得して実装し、使用することです。GenericSet.requireSetOfType( type )
これは、セットのタイプが必要なタイプでない場合にエラーをスローします。この方法で行うことに対する私の懸念は、インターフェイスの定義がそれほど明確に見えないことです。
取る
/**
* @param DataValuesSet dataValues
*/
function printDataValues( dataValues ) {
if( !( dataValues instanceof DataValuesSet ) ) {
throw Error( '...' );
}
// ...
}
対
/**
* @param GenericSet<DataValue>
*/
function printDataValues( dataValues ) {
// Throws error if dataValues is not a set or it it is a set with values of wrong type.
GenericSet.requireSetOfType( dataValues, DataValue );
// ...
}
おそらく@param GenericSet(DataValues) dataValues
、2番目の選択肢を文書化するために使用しても大丈夫でしょうか?誰かが2番目のアプローチとの関連をさらに見ていますか、それとも別の提案がありますか?私にとって、2つ目はより直感的に見え、1つ目に対する懸念は、現時点では明確な利点が見当たらない一方で、コンストラクターでオーバーヘッドを増やすことです。