依赖布尔属性

时间:2009-07-02 05:31:02

标签: c#

假设我有一个具有两个布尔属性的对象:

public bool AdvancedMode{ get; set; }
public bool DumpDiagnostics{ get; set; }

域规则规定除非AdvancedMode也为真,否则不允许使用DumpDiagnostics。因此,在整个代码中,您可能会看到如下语句:

if( options.AdvancedMode && options.DumpDiagnostics ){ ... }

这样做的问题是很容易忘记添加checkAdvancedMode并意外检查DumpDiagnostics。

if( options.DumpDiagnostics ) // Oh no!

因此我可以想到两种解决方案:

选项1:当AdvancedMode为true时,DumpDiagnostics仅返回true。

public bool DumpDiagnostics
{ 
    get{ return AdvancedMode && _dumpDiagnostics; }
    set{ _dumpDiagnostics = value; }
}

选项2:反映我正在寻找的条件的新属性

public bool CanDumpDiagnostics{ get{ return AdvancedMode && DumpDiagnostics; } }

问题:哪个更好?

选项#1看起来非常简单,不容易出错。关于是否可以转储诊断,总有一个权威。但是,它确实改变了集合 - >获取语​​义,你可以在其中分配DumpDiagnostics = true,然后是if(DumpDiagnostics),返回false。

选项#2很好,因为它隔离了逻辑并清楚说明目的是什么。我看到的最大缺点是,只检查DumpDiagnostics而不是使用新的CanDumpDiagnostics属性仍然很容易。

P.S。我知道这是一个尴尬的标题,但无法提出更精确的东西,随意修改。

4 个答案:

答案 0 :(得分:4)

或者,选择选项3 ...将两个布尔值转换为枚举:

public enum Mode
{
    Normal,
    Advanced,
    AdvancedWithDiagnostics
}

(名称更适合您正在做的事情)

<强>附录
如果你想真正“高级”,你甚至可以使用以下内容:

public enum Mode
{
    Normal = 0,
    Advanced = 1,
    AdvancedWithDiagnostics = 3
}

并使用以下属性(再次,选择比我更好的命名!):

public Mode SelectedMode { get; set; }
public bool AdvancedMode { get { return (SelectedMode & 1) != 0; } }
public bool DumpDiagnostics { get { return (SelectedMode & 2) != 0; } }

答案 1 :(得分:3)

选项2对我来说更有意义。我不喜欢可以设置但不“抓住”的属性。我打算建议在setter中抛出异常,但后来记得你必须在AdvancedMode的setter中抛出异常,以防被重置为false。 / p>

我会将DumpDiagnostics重命名为类似DiagnosticDumpRequested的内容,以便更清楚地表明它不会被尊重。

答案 2 :(得分:0)

获取和设置状态的域规则是什么?换句话说,在我看来,DumpDiagnostics的“set”函数也应该设置AdvancedMode。如果这是真的,那么只需使用选项1,您只需要检查代码的其余部分是否设置了DumpDiagnostics。

答案 3 :(得分:0)

选项1具有误导性。 DumpDiagnostics不应该等于AdvancedMode&amp;&amp; DumpDiagnostics。我会选择2