2009-04-21 4 views
2

私の問題を説明するのは難しいので、あまり明確でない場合は休憩してください。true/falseに等しく設定できないプロパティを編集しました

私は、ビューで編集できるいくつかのプロパティがあります。それらのほとんどはブーリアンです。これらのプロパティは、テスト環境を構成します(ソリューションを表示するように1つのプロパティを構成できるように)。

ここで問題となるのは、他のプロパティがfalseに設定されている場合、一部のプロパティをtrueに設定できないことです。何も間違ってはいけませんが、ただ役に立たないだけです。 1つのプロパティが正しいボタンを表示しないように構成され、別のプロパティが解決策を表示するように設定されているようなものです。私たちのシステムでは、正しいボタンをクリックできない場合、解決策は表示されません。

この種の問題に名前がありますか? このようなプロパティには名前があります(不変プロパティと同様)。 このようなストーリーを実装するためのベストプラクティスはありますか?私たちはビューでそれをハードコードすることができますが、私はむしろ汎用システムを持っています。

+0

これはどの言語ですか? –

+0

Flex-.NET-SQLServer –

答えて

2

あなたが探している言葉はの直交性です。設定値は、ではなくであり、独立して変更することはできません。

これらのプロパティの表示を処理する方法については、これを行うための完全な一般的な方法(この問題は、この一般的なコードコストを保証するものではありません)は、各コントロールに他のコントロールを参照する式を与えることです完全な式がtrue(またはfalse)と評価されると、コントロールはビュー内で無効になります。

コードが簡単なのは、isDisabled()メソッドを公開したコントロールで、これは必要に応じてオーバーライドできます。ここでは簡単なJavaの例を示します。この例では、Javaの匿名クラスを活用して苦労しています。当然

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()) ; 
    }; 

:それはそこにControlクラスは、boolean型に変換booleanValue()ゲッターで、すでにだ、とAutoDisabledControlコントロール-であることから、それはドロップイン置換制御用として使用することができることを前提としていビューの表示では、各コントロールのisDisabled()をチェックし、trueを返すものを無効にします。コントロールの値が変更されると、ビューが再表示されます。私は何らかのMVCパターンを想定しています。

+0

非常に興味深い。もちろん、ユーザーはどのコントロールを変更しなければならないかを知ることは難しい別のコントロールを再度有効にするには... –

+0

これをビューに静的テキストとして追加するか、AutoDisabledControlを変更して文字化理由を公開することができます。 – tpdi

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は、他のものから推測できるいくつかのパラメータを排除することができます。または、enumarationsを使用していくつかのパラメータを組み合わせることができます。

パラメータの値のスペースを調べて調べます。

+0

実際、私はその方向でも考えていました。しかしそれはそれほど単純ではありません。 Aが真であれば、Bは真かつ偽である可能性があります。 Aが偽ならば、Bは偽になるだけです。 Aがtrueに設定されている場合、Bがtrueになると、AがFalseに変更されたときに自動的にBを変更しますか?または、BがTrueのときにAがFalseになることができないというエラーを表示しますか? –

+0

"Aが真の場合、Bは真となる可能性があります.Aが偽の場合、Bは偽になります。この場合、Aが真であるときにインデントされたBを表示し、Aが偽のときはBを隠すか、灰色で表示する。 – TRiG

関連する問題