C#リーダブルコード #13_都合が悪いケースはガードする

当サイトではアフィリエイト広告を利用しています。

リーダブルコード
Subway Station in Munich, Germany. Train coming in. Strong Motion Blur on Train and People, no recognizable Persons.

前回の「対象外の時はすぐに抜ける」というのと似たパターンとして,「都合の悪いケースはガードする」というお話をしていきたいと思います。

1.1   GOOD:都合が悪いケースはガードする

前述の早々にリターンするやり方でしたが,今回は,都合の悪い場合は,例外にしてしまうという考え方です。

例えばコンストラクタなんかは,値をリターンすることができないので,前述の早々にfalseを返却するということができなかったりします。そういうときや,処理を続行させたくない場合,または例外で受けたい場合は,次のように,例外を発生させます。

このコンストラクタはProductを引数で受けていますが,nullかもしれません。そういった場合は,コンストラクタで例外を発生させることで,productがnullの場合のインスタンスの生成は行われません。

//GOOD:都合が悪いケースはガードする
public ReadableCode(Product product)
{
    if (product == null)
    {
        throw new ArgumentNullException("product is null!");
    }

    _product = product; //①
    Console.WriteLine($"処理...{product.ProductName}");
}

そうすることで,①のように,productを受けて,privateな変数_productに値を入れるような処理がある場合は,_productがnullでインスタンスが生成されないことが保障されます。ですので,_productがnullかもしれないという,if文を使ったコーディングがこのクラスでは不要となります。

こういった感じで,こういった感じで,都合の悪いケースでは,インスタンスが生成されないようにすることで,クラス内のコーディングがシンプルに保つことがき,また,生成する側も,中途半端なインスタンスが生成されないことがわかるので,コーディングがしやすくなります。コンストラクタかどうかにかかわらず,都合の悪いケースでは例外にするというのは,非常にコードがシンプルになるので,検討してみてください。ただ,呼び出す側は,例外が発生するかもしれないことを加味したコーディングにする必要があります。要するに,呼び出し側が,受け止める必要のある個所に,catchキーワードを使って受け止める必要があります。