メソッドが定められた振る舞いを行うことができない場合、例外によって失敗を報告すべきである。エラーコードの戻り値はたやすく無視されるし、エラーコードのチェックや伝播は正常系のコードを汚染し、中核となるロジックをわかりづらくする。
しかし、例外を通常の制御構造として使用してはいけない。このことは、publicメソッドを提供する際には、通常の使用で例外が投げられる確率をできるだけ減らさなければならない、ということでもある。
そのため、メソッドの事前条件が満たされるかテストするメソッドを別に提供し、例外を避けられるようにするのがよい(プログラマーが事前条件のテストを忘れれば例外が飛ぶが、これは正しい挙動である)。
internal static class Program
{
public static void Main()
{
var worker = new DoesWorkThatMightFail();
if (!worker.TryDoWork())
{
WriteLine("Fail");
}
WriteLine("Success");
}
}
public class DoesWorkThatMightFail
{
public bool TryDoWork()
{
if (!TestConditions())
return false;
Work();
return true;
}
public void DoWork()
{
Work();
}
/// <summary>
/// 事前条件のテスト
/// </summary>
/// <returns></returns>
private bool TestConditions()
{
return true;
}
private void Work()
{
}
}