メソッドに渡されるメッセージがあります。
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
}
}
割り当てられていないブール値のデフォルトは false であるため、IsCredit に値が割り当てられていることを忘れていたかどうかを確認できません。これは借方であることを意味しIsCredit = false;
ます。
そこで、値 1 で始まるDrCrFlagを使用することを提案しました。
public enum DrCrFlag
{
Debit = 1,
Credit = 2
}
そのようにして、DoSomething メソッドは、列挙型がゼロかどうかを確認するだけで、メッセージの 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 に変更することはできません。
したがって、既存のクライアントアプリを壊す可能性のあるnull可能なブール値を使用することを提案しましたが、ブール値を列挙型に変更するよりも、ブール値をnull可能なブール値に変更することを歓迎します。
これは実装できます:
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");
}
これは、割り当てられていない変数を防ぐ正しい方法ですか?
すべてのアクションは、渡される値を検証する必要がありますか?