2011-11-11 10 views
1

インデクサーは常に離散シーケンスを参照すべきですか? 私は「いいえ」と思うように誘惑されますが、私は他の人が何を考えているか質問したいと思います。インデクサーは常に離散シーケンスを参照すべきですか?

「ショートカット」が多項式クラスで行われた後に質問が開始されました。 (double型のインデクサを使用して)

double y = p.Evaluate(5.2); 

ショートカットなされたものであった:

Polynomial p = new Polynomial(coefficients); 

Yを計算する通常の方法は、(5.2)Pは=は、次のメソッド呼び出しを使用することであった

double y = p[5.2]; 

多項式(連続関数)が一種のアナログ配列または連続配列と見なされていると思います。ただし、Evaluate関数はIMathFunctionインターフェイスから提供されます。このインタフェースは、補間クラスで使用されます。

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints) 

補間クラスはすでに補間に使用されるポイントの彼らの配列にアクセスするには、int型の公共インデクサーを持っているので、問題はここにあります。インターポレータは(1つの範囲内で)連続関数のように動作することができますが、ショートカットがすべてのIMathFunctionクラスに展開された場合、f [5.0]とf [5]は異なるオブジェクトを返し、コードを読むときに混乱することがあります。

double y; 
Point<double> p; 

// ... some other code 

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints) 
y = f[5.0]; 
p = f[5]; 

を私はdouble型のインデクサーのこの使用を心配するか、これは、彼らがために使用されるべきものであるべきか?

+0

まあ、それは悪い考えで、あなたはなぜそれを見つけましたか? –

+0

私は問題は、補間器が点の離散配列と連続したアナログ配列として同時に見ることができないことです。これは混乱の権利ですか? – Ben

+0

@Hans Passantこれは 'f.Evaluate(5.0)'と 'f.Evaluate(5)'とどう違うのですか?私は結論に同意しないが、... –

答えて

3

Microsoftのindexed property designのガイドラインによれば、「インデックス付きのプロパティでは、アイテムのグループに配列のようなアクセスが許可されます。したがってインデクサーには個別のセットから来るようにすることが意図されています。さらに:

可能System.Int32、System.Int64、可能System.String、System.Objectの、列挙型、またはジェネリック 型パラメータ以外のパラメータの型とインデクサを避けてください。

設計パラメータの他の種類が必要な場合は、メンバーが実際に論理 コレクションへのアクセスを表しているかどうかを強く 再評価すべきです。そうでない場合は、メソッドを代わりに使用し、GetまたはSetで始まるメソッド の名前を選択することを検討してください。

純粋に数学的に言えば、関数は実数のような無限の集合の上にある可能性があるマッピングとして定義されます。.NET言語はそのようなマッピングを表すメソッドを使用します。それはあなたが従うべきパターンです。

デリゲートは、これの特別なケースであり、Invokeメソッドがデフォルトメソッドとして扱われることに注意してください。これにより、myDelegate.Invoke(arg1)の代わりにmyDelegate(arg1)と書くことができます。しかしこれは特殊なケースです。デフォルトのメソッドは、C#またはVBでは使用できません。

インデクサーを添字として考える方が良いかもしれません。結局のところ、数学では、ベクトルやシーケンスのようなコレクションの要素は通常、添え字付きのコレクションの名前で表されます。ごくまれにf xが値xにある関数fの値を表しています。

+0

+1はガイドラインを探しています!良い説明のためにも。 –

+0

ありがとうJeffrey、添え字としてインデクサーの考えをお勧めします。 – Ben

2

インデクサーでやっていることは、通常、メソッドで処理されます。は、メソッドであるかのようにインデクサーを使用しますが、目的とするセマンティクスではないため、ほとんどの人を混乱させるでしょうあなたのコードを読んでください。コレクションの特定のアイテムに直接アクセスするインデクサーや、同様の目的を持つ操作のための予備のインデクサーを用意しています。

+0

だから私はダブルのインデクサーの使用のこの種のルールを推測する?連続的またはアナログ的なアレイのアイデアは非スターターですか? - 助けてくれてありがとうThomas。 – Ben

+0

@Ben、これは私の意見ですが、それは "非スターター"という意味ではありません。他の人はおそらくこの質問に関して異なる意見を持っています。それは私にはうってつけの気がしませんが、あなたがそれをする正当な理由があれば、あなたは私のアドバイスを無視することができます。結局のところ言語は許しています;) –

関連する問題