2009-01-30 31 views
7

將我的xaml數據綁定到某些數據時,我經常使用屬性的「get」部分來執行某些邏輯。如給予列表總數或檢查結果的總和是否爲正數。邏輯獲得屬性的一部分。良好的做法?

例如:

public List<SomeClass> ListOfSomeClass{get;set;} 

public double SumOfSomeClass 
{ 
    get 
    { 
    return ListOfSomeClass.Sum(s => s.Totals); 
    } 
} 

public bool SumPositive 
{ 
    get 
    { 
    if(SumOfSomeClass >= 0) 
     return true; 
    else 
     return false; 
    } 
} 

這樣我可以綁定到SumPositive和SumOfSomeClass。這被認爲是良好的做法?即使它變得比這更復雜?或者最好是調用一個方法並返回結果?如何調用另一個類或甚至數據庫?

回答

14

屬性吸氣劑預計是快速和冪等的(即不應該在那裏執行破壞性行爲)。儘管遍歷內存中的對象集合是完全正確的,但我不會推薦在獲取集合部分進行任何類型的繁重工作。說到迭代,我仍然會緩存結果以節省幾毫秒。

+1

「保存幾毫秒」 - 納秒? – 2009-01-30 15:34:04

+1

冪等具有比這更廣泛的含義 - 它意味着通過反覆調用操作獲得相同的結果,而不是受到記憶狀態的影響。 http://en.wikipedia.org/wiki/Idempotent – 2009-01-30 15:44:39

1

我說是的,但嘗試存儲ListOfSomeClass.Sum(s => s.Totals)的私有變量de結果。特別是如果你多次使用它。

1

在getter/setter中有複雜的邏輯不是一個好習慣。我建議將複雜的邏輯移至單獨的方法(如GetSumOfXYZ()),並在屬性訪問器中使用memoization

您可以通過使用ObjectDataProvider來避免複雜的屬性 - 它允許您定義方法來提取一些數據。

1

我沒有看到任何直接的問題(除非列表非常大),但如果可能的話我會親自使用myInstance.SomeList.Sum()方法(.net> = 2.0)。

1

對於集合中字段或其他屬性的基本計算,可以在Get屬性中執行該操作。正如其他人所說,真正的邏輯不應該在吸氣劑中完成。

0

取決於......如果這是一個域實體,那麼我不會贊成在一個getter中有複雜的邏輯,尤其是不是一個setter。使用一種方法(對我)向實體的消費者發出正在執行操作的信號,而吸氣劑發出簡單的檢索信號。

現在,如果這個邏輯是在一個ViewModel中,那麼我認爲getter方面更容易理解。

0

我認爲在Getters和Setters中有一定的邏輯級別,否則你只是有一種複雜的方式來公開你的成員。

2

是的,除非它是一種可能會影響性能的操作。在這種情況下,你應該使用一個方法,而不是(因爲它是更直觀的最終用戶,一個方法可能是緩慢的,而屬性會很快)

1

請改變吸氣到這一點:

public bool SumPositive 
{ 
    get 
    { 
    return SumOfSomeClass >= 0; 
    } 
} 

你已經在使用布爾表達式,不需要明確地返回true或false

1

我喜歡你的命名約定,我完全同意在屬性獲取器中使用諸如你的例子之類的內容,如果你提供了一個API來使用具有約束力。

我不同意別人提出的關於將代碼移入方法的觀點,因爲它的計算量很大 - 這不是我所做過的區別,也沒有聽說其他人認爲在方法中暗示比物業慢。

我確實認爲屬性應該在被調用的對象上是無副作用的。要保證它們不會對更廣泛的環境產生影響是非常困難的 - 即使是相對較小的屬性也可能將數據拉入內存或至少更改處理器緩存或虛擬機狀態。

0

我會注意將任何邏輯放在屬性的Getter中。它做的越貴,危險越大。其他開發人員希望getter能夠立即返回值,就像從成員變量中獲取值一樣。我看到很多實例,開發人員在循環的每次迭代中都使用一個屬性,認爲他們只是獲取一個值,而該屬性實際上正在做很多工作。這可能是代碼執行中的一個主要放緩。