【发布时间】: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