本記事では、オブジェクト指向設計において引数に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禁止をプロジェクトとして表明しておくべきです。
コメント