【问题标题】:Guard clause for properties that are possibly forgotten to be assigned a value可能忘记赋值的属性的保护子句
【发布时间】:2015-09-25 04:50:42
【问题描述】:

我们有一条消息正在传递给一个方法。

class Message
{
    public int     TransactionId    { get; set; }
    public bool    IsCredit         { get; set; } // Debit when false
    public decimal Amount           { get; set; }
}

class ServiceBus
{
    public IService TheService { get; set; }

    public void SomethingHappen()
    {       
        var message = new Message
        {
            TransactionId = 7,
            Amount        = 6
            // forgot to assign IsCredit
        };
        TheService.DoSomething(message);
    }
}

class Service
{
    public void DoSomething(Message message)
    {
        // Before proceeding with anything else, wanted to put 
        // a guard clause if something was not assigned, e.g., IsCredit             
    }
}

无法检查是否忘记为 IsCredit 分配价值,因为未分配的布尔值默认为 false,这意味着它是借方,IsCredit = false; 的分配无法检测为未分配,因为它指示借方。

所以我建议使用以 1 开头的DrCrFlag

public enum DrCrFlag 
{
    Debit  = 1,
    Credit = 2
}

这样,DoSomething 方法可以有一个 guard clause 来检查是否忘记分配消息的 IsCredit 属性,只需检查枚举是否为零。

public void DoSomething(Message message)
{
    // Before proceeding with anything else, wanted to put 
    // a guard clause if something was forgotten to be assigned, e.g., IsCredit             
    if (message.DrCrFlag == 0) throw new ArgumentException("DrCrFlag is unassigned");
}

但是,那些依赖布尔属性的客户端应用程序可能会破坏数据协定。所以将布尔值更改为 DrCrFlag 是不可能的。

然后我建议使用可为空的布尔值,这也可能会破坏现有的客户端应用程序,但他们更欢迎将布尔值更改为可为空的布尔值,而不是将布尔值更改为枚举。

这可以实现:

class Message
{
    public int     TransactionId    { get; set; }
    public bool?   IsCredit         { get; set; } // Debit when false
    public decimal Amount           { get; set; }
}

public void DoSomething(Message message)
{
    // Before proceeding with anything else, wanted to put 
    // a guard clause if something was forgotten to be assigned, e.g., IsCredit             
    if (message.IsCredit == null) throw new ArgumentException("IsCredit is unassigned");
}

这是防止未分配变量的正确方法吗?

所有操作都应该验证传递给它的值吗?

【问题讨论】:

    标签: c# enums guard-clause


    【解决方案1】:

    另一种方法是声明类型为bool? 的私有成员mIsCredit。然后在你的 getter 中,你可以检查私有变量的值,如果它是null,则抛出异常。这样您的公共财产将保持bool 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2011-03-11
      • 2023-03-13
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多