2009-04-21 39 views
2

這很難解釋我的問題,所以給我一個休息,如果它不是很清楚。編輯屬性誰不能設置爲真/假同等

我有一些可以在視圖中編輯的十個屬性。他們大多數是布爾人。這些屬性配置測試環境(如可以配置一個屬性來顯示解決方案)。

現在,問題是如果其他設置爲false,則某些屬性不能設置爲true。沒有什麼會出問題的,但它是無用的。這就像一個屬性將被配置爲不顯示正確的按鈕,另一個顯示解決方案。在我們的系統中,如果您無法點擊正確的按鈕,那麼解決方案將永遠不會顯示。

這種問題有沒有名字? 這樣的屬性是否有名稱(就像存在不可變屬性一樣)? 是否有最佳實踐來實施這樣的故事?我們可以在視圖中對其進行硬編碼,但我寧願有一個通用系統。

+0

這是什麼語言? – 2009-04-21 09:32:18

+0

Flex-.NET-SQLServer – 2009-04-21 09:48:34

回答

2

您正在查找的單詞是正交性。設置是而不是正交,因爲它們不能獨立變化。

至於如何處理顯示這些屬性,完成通用的方式來做到這一點(和你的問題可能不保證這種泛型的編碼成本)將是給每個控件引用其他控件的表達式,其中如果完整表達式的計算結果爲true(或false),則控件在視圖中被禁用。

更容易編碼將暴露isDisabled()方法的控制,您可以根據需要重寫。下面是一個簡短的Java示例,它利用Java匿名類來完成艱苦的工作。它假定已經有一個Control級帶booleanValue()吸氣劑,它轉換成一個布爾值,並且,由於AutoDisabledControl是-控件,它可以作爲一個下拉更換了控制:

public class AutoDisabledControl extends Control { 
    public isDisabled() { return false ; } 
    } 

    ..... usage .... 
    // control1 is never disabled 
    final Control1 = new AutoDisabledControl() ; 
    // Control2 is disabled if control1 is false 
    final Control2 = new AutoDisabledControl() { 
    public isDisabled() { return control1.booleanValue() == false; } 
    }; 
    // conntrol 3 is enabled only if control1 and control2 are true 
    final Control1 = new AutoDisabledControl() { 
    public isDisabled() { return ! (
         control1.booleanValue() 
         && control2.booleanValue()) ; 
    }; 

自然在視圖的顯示中,它檢查每個控件的isDisabled(),並禁用那些返回true的控件;當控件的值改變時,視圖重新顯示。我假設某種MVC模式。

1

您可以使用int或long來存儲相關屬性,並在設置屬性以正確清除無效設置時使用位掩碼。這個int或long可以採用標記的枚舉形式。

[Flags]private enum BitValues 
{ 
    Bit1 = 1 << 0, //Inclusive 
    Bit2 = 1 << 1, //Exclusive to bit 3 and 4 
    Bit3 = 1 << 2, //Exclusive to bit 2 and 4 
    Bit4 = 1 << 3, //Exclusive to bit 2 and 3 
    ExclusiveBits = Bit2 | Bit3 | Bit4 //All exclusive bits 
} 

private BitValues enValues; 

public bool Bit1 
{ 
    get { return (enValues & BitValues.Bit1) == BitValues.Bit1; } 
    set 
    { 
    //Clear the bit 
    enValues = (enValues^BitValues.Bit1) & enValues; 

    //Set the bit 
    enValues = enValues | BitValues.Bit1; 
    } 
} 

public bool Bit2 
{ 
    get { return (enValues & BitValues.Bit2) == BitValues.Bit2; } 
    set 
    { 
    //Clear exclusive bits 
    enValues = (enValues^BitValues.ExclusiveBits) & enValues; 

    //Set bit 
    enValues = enValues | BitValues.Bit2; 
    } 
} 
1

你可以很好地解決你的問題。

嘗試以不同的方式思考 - 也許U可以消除一些參數,可以從其他參數中推斷出來,或者可以使用激勵將幾個參數合併爲一個參數。

調查你的參數的價值空間來找出它。

+0

的確,我也在朝這個方向思考。但並不那麼簡單。如果A是真的,那麼它可能是B可能是真的和假的。如果A是假的,那麼B只能是假的。如果將A設置爲true,則當A更改爲False時,是否自動更改B?或者你顯示一個錯誤,說明當B爲真時A不能是錯誤的... – 2009-04-21 10:51:50