2011-11-11 45 views
1

索引器是否應該總是引用一個離散序列? 我很想不想,但我想問問別人怎麼想。索引器是否總是引用一個離散序列?

在多項式類上創建'快捷方式'後,問題就開始了。

Polynomial p = new Polynomial(coefficients); 

正常的方法來計算Y = P(5.2)是使用下面的方法調用:

double y = p.Evaluate(5.2); 

的快捷方式,製成(使用型雙的一個索引)是:

double y = p[5.2]; 

我認爲這個想法是多項式(一個連續函數)被視爲一種模擬數組或連續數組,如果這是有道理的。但是,Evaluate函數來自IMathFunction接口。該接口也採用的插值類:

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints) 

有一個問題在這裏,因爲插類已經有一個int類型的公共索引來訪問其用於插補點陣列。內插器可以像連續函數一樣工作(在其限制範圍內),但是如果快捷方式轉出到所有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]; 

我應該擔心這種使用類型的索引的兩倍,或者這是什麼,他們應該使用?

+0

嗯,這是一個壞主意,你找到了原因。 –

+0

我想問題是插值器不能同時看作點和連續模擬陣列的離散陣列。這是混淆的權利? – Ben

+0

@Hans Passant儘管這與「f.Evaluate(5.0)」和「f.Evaluate(5)」有什麼不同?我並不不同意這個結論,但是...... – 2011-11-11 01:10:17

回答

3

根據微軟的indexed property design準則,「索引屬性允許類似數組訪問項目組。所以目的顯然是讓索引者來自一個離散的集合。此外:

避免索引具有比System.Int32,System.Int64,System.String,System.Object的,枚舉,或通用 類型參數的其它參數類型。

如果設計需要其他類型的參數,你應該認真 重新評估該成員是否真正代表訪問邏輯 集合。如果不是,請改用方法,並考慮選擇一個以Get或Set開頭的名稱的方法 。

純數學術語中,函數被定義爲映射,可能超過無限集(如實數),.NET語言使用方法來表示映射。這是你應該遵循的模式。

請注意,代表是這方面的一個特例,其中Invoke方法被視爲默認方法。這可讓您編寫myDelegate(arg1)而不是myDelegate.Invoke(arg1)。不過,這是一個特例。缺省方法在C#或VB中不可用。

也許這是更好地認爲索引爲下標。畢竟,在數學中,像矢量或序列這樣的集合的元素通常用帶有下標的集合的名稱來表示。只有很少做你瀏覽F X在x的值代表一個函數f值。

+0

+1用於查找準則!併爲一個很好的解釋... –

+0

謝謝傑弗裏,我喜歡你建議索引作爲下標思考。 – Ben

2

你用索引器做什麼通常用一種方法來完成...儘管你可以使用索引器,就好像它是一種方法一樣,但它不是它想要的語義,所以它可能會混淆大多數閱讀你的代碼。所以我會反對它:保留索引器直接訪問集合中的特定項目,或者用於具有類似目的的操作。

+0

所以我猜這種排除了double類型索引器的用法呢?而連續或模擬陣列的想法是不是起步? - 謝謝你的幫助托馬斯。 – Ben

+0

@Ben,這只是我的看法,並不意味着它是一個「非首發」;其他人可能在這個問題上有不同的意見。它不覺得我的權利,但如果你有一個很好的理由這樣做,你完全可以不理會我的意見...畢竟,語言允許它;) –