2013-01-02 53 views
2

可以說我有類型爲String的兩個屬性的類屬性如何定義依賴一個彼此

  1. PROP1
  2. PROP2

並有下列限制

  1. 如果Prop2值爲「Test2」,則Prop1不能等於「Test1」
  2. PROP2不能等於「Test22」如果PROP1值爲「TEST11」
  3. 設置爲prop1 =「Test111」如果PROP2 =「Test222」

什麼是定義其值的屬性的最佳方法是互相依賴的,而且在一個屬性中所做的更改應該觸發另一個屬性的setter屬性?

+0

我想這應該得到'家庭作業'標籤 - 如果它仍然在? @Paul>我想你會需要一些「ifs」,然後在試圖設置「Test1」或「Test22」時拋出異常(或什麼都不做)。 – Laoujin

+2

@Laoujin作業標籤已被[棄用](http://meta.stackexchange.com/q/147100/189763)。 –

回答

0

你負責編碼的「邏輯」,你也許需要在屬性setter(一種驗證)

我會使用規範圖案提取驗證邏輯,並使其可測試以及

http://devlicio.us/blogs/jeff_perrin/archive/2006/12/13/the-specification-pattern.aspx

+0

我實際上正在尋找一種機制,可以指定依賴於特定屬性值(比如s1)的屬性(比如說d1,d2,d3),並且只要s1的值更改了設置者的d1,d2 ,d3會自動調用。 –

4

您需要在屬性設置器中添加驗證。

string prop1; 
    string prop2; 

    string Prop1 
    { 
     get { return prop1;} 
     set 
     { 
     if (!(Prop2 == "Test2" && value == "Test1")) 
     { 
      Prop1 = value; 
      } 
     ... Add other condition here 
     } 
    } 

    string Prop2 
    { 
     get { return prop1;} 
     set 
     { 
     // set Prop2 based on Prop1 
     } 
    } 
+0

我認爲你錯過了練習的要點:問題在於,如果不能單獨進行更改,只能同時更改兩個屬性,才能使對象處於狀態。 – dasblinkenlight

+0

@dasblinkenlight,如果沒有。的國家和轉型很大,在我看來,國家設計模式是要走的路。如果國家/轉型較少,它可以與少數制定者一起工作。如果有一些動作僅在初始化期間有效,我使用標誌來區分新的/初始化的狀態。無論如何,如果/其他梯子不可讀且容易出錯。 – Tilak

0

你可以在每個屬性的setters中實現這個邏輯,但我會質疑這一點。

在對象上使用Validate方法可能會更好,該方法將檢查這些屬性的狀態,或讓另一個對象負責執行驗證,並返回錯誤或根據需要更改對象。

3

你有很多的選擇,在這裏:

  • 使這兩個屬性爲只讀,並補充說,同時將他們兩個的方法。
  • 使這兩個屬性都是可讀寫的,讓它們在未一致設置時引發異常,並添加一個同時設置它們的方法。
  • 使這兩個屬性都是可讀寫的,並添加一個方法,讓您暫時關閉驗證。製作一個「後衛」,在銷燬時重新開啓驗證,並在using聲明中使用後衛。
  • 將事務性語義添加到對象中:注意環境事務,在事務處於「進行中」時將未決集存儲在隊列中,並在事務提交時立即應用所有更改。