クライアントがnullのチェックやnull例外のスローを気にする必要がないように、サービスがデフォルトのnullオブジェクトを返すか、null関連の例外をスローすることを推奨するNullオブジェクトデザインパターンについて学習しました。
問題は、私が理解している限り、クライアント/サービスの関係はインターフェースを介して行われるべきだということです。 「サービスがnullチェックを処理するため、クライアントが実行する必要がない」という情報は、インターフェースを介してどのように伝達できますか? C#では、インターフェイスは期待できるメソッドシグネチャを提供しますが、サービスがnullチェックを行うという事実は、インターフェイスを介して渡すことができない任意の情報の余分な部分のように見えます。
私の懸念は、インターフェイスがそのように指定する方法がなくても、クライアントがサービスがnullチェックを行うと想定している場合、これは「漏れやすい抽象化」につながる可能性があり、クライアントはサービスの特定の実装の詳細を当然のことと考えているため、結合します。それ自体に。
カプセル化の原則を破ることなく、サービスがnullチェックを行う必要がないことをクライアントが認識するための正しい方法は何ですか?
最良の方法は、参照型に「暗黙のnull」を持たない型システムを用意することです。つまり、すべての参照はデフォルトでnull可能ではなく、明示的に定義されている場合のみnull
を含めることができます。
これは、C#8では Nullable参照型 を使用するバージョンのコンパイラーでは不可能です。このようにして、クライアントは、返された参照値にnull
を含めることができるかどうかを判断し、それに応じてそれを処理できます。
古いバージョンのC#では、似たようなものは難しいでしょう。私が知っている唯一のオプションは、すべての参照がnull可能ではないという規則を設定することであり、nullを返す唯一の方法は Option monad を使用することです。そして、コードのレビュー中または静的分析ツールを使用してこれを実施します。