【オブジェクト指向設計】引数にnullは使用しない

本記事では、オブジェクト指向設計において引数にnullは使用しないというテーマで書きます。

引数のnull禁止については↓の書籍に明記されています。ぼくがものすごく参考にしている書籍の1つです。

・nullを渡さない/nullを返さない

現場で役立つシステム設計の原則 第5章 アプリケーション機能を組み立てる P. 166

引数としてnullを渡さないようにすることに関しては、完全に同意します。引数のnull禁止をプロジェクトとして表明しておくべきです

目次

引数null禁止のメリット

パラメータチェックをしなくてよい

public void FuncSample(string a)
{
    if (a == null)
    {
        throw new ArgumentException();
    }

    // 処理が続く
}

上記コードにおいて、引数null禁止としておくと、パラメータチェックをする必要がありません。契約による設計でnull 禁止を表明しているからです。

パラメータチェックのコードをなくすと、余計なコードが減ります。

多くのプロジェクトで、「このnullチェックめんどくさい。あんまり意味ないし。」と思いながらnullチェック処理を書いていませんか?引数null禁止をプロジェクトでルール付けしてはどうでしょうか?

コードがシンプルになる

場合によっては、引数のnullが意味のあるものになるかもしれません。

public void FuncSample(string a)
{
    if (a == null)
    {
        // 引数がnullのときの処理を書く

        return;
    }

    // 引数がnull出ないときの処理を書く
}

引数がnullのときは特別なロジックを実行します。

ところが、引数null で特別なロジックを実行するメソッドは滅多に出現しません。なので、第3者がコードを見ると見落としがちです。引数nullに意味を持たせるとコードが非常にわかりにくくなります。

引数null禁止を表明することで、null 禁止の特別なロジックを考えることなくなり、コードがシンプルになります。

Null許容型を引数にするのもやめたほうがよい

C#8.0 以降は、string型にnullを代入することが禁止となりました。nullを代入したい場合は、null許容型としてstring? と宣言しなくてはいけません。

public void FuncSample(string? a)
{
    if (a == null)
    {
        // 引数がnullのときの処理を書く

        return;
    }

    // 引数がnull出ないときの処理を書く
}

引数をNull許容型として定義することで、コードを読む人に、

引数nullで別の処理があるかも。

と思わせることができるかもしれません。引数nullの処理をメソッドのコメントに記載しておくとより伝わります。

しかし、それでも、引数のNull許容型もやらないほうがよいです

約3年、C# でオブジェクト指向を意識しながらコードを書いていました。引数にNull許容型を使うことは1回もありませんでした。

引数のNull許容型を使いたくなったときは、別の手段を使って回避できるかもしれません。

戻り値にNull許容型を使うことはOKと思います。↓の記事を参考にしてみてください。

まとめ

オブジェクト指向設計において引数にnullは使用しないというテーマで書きました。

引数のnull禁止をプロジェクトとして表明しておくべきです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次