戻って、値の配列の算術平均を計算する別の例を使用してみましょう。
入力配列が空(またはnull)の場合、呼び出し元の要求を合理的に満たすことができますか?いいえ。オプションは何ですか?まあ、あなたはできます:
- エラーを示す/返す/投げる そのクラスのエラーに対するコードベースの規則を使用します。
- ゼロなどの値が返されることを文書化する
- 指定された無効な値が返されることを文書化する(例:NaN)
- マジック値が返されることを文書化する(例えば、型の最小値または最大値、または希望的に示す値)
- 結果が指定されていないことを宣言する
- アクションが未定義であることを宣言する
- 等
無効な入力が行われ、リクエストを完了できない場合は、エラーを返すと言います。彼らはあなたのプログラムの要件を理解するので、私は初日からハードエラーを意味します。結局のところ、あなたの機能は応答する立場にありません。操作が失敗する可能性がある場合(たとえば、ファイルをコピーする場合)、APIはそれらに対処できるエラーを与える必要があります。
そのため、不正なリクエストや失敗する可能性のあるリクエストをライブラリがどのように処理するかを定義できます。
コードがこれらのクラスのエラーを処理する方法に一貫性を持たせることは非常に重要です。
次のカテゴリは、ライブラリがナンセンスなリクエストを処理する方法を決定することです。あなたに似た例に背を取得-のファイルがパスに存在するか否かを判断する機能を使ってみましょう:bool FileExistsAtPath(String)
。クライアントが空の文字列を渡す場合、このシナリオをどのように処理しますか?に渡される空またはnull配列はvoid SaveDocuments(Array<Document>)
どうですか?ライブラリ/コードベースを決定し、一貫性を保つ。私はたまたまこれらのケースのエラーを考慮し、エラーとして(アサーションを介して)フラグを立てることにより、クライアントがナンセンスなリクエストを行うことを禁止しています。一部の人々は、そのアイデア/行動に強く抵抗します。このエラー検出は非常に役立ちます。プログラム内の問題を特定するのに非常に適しています。問題のあるプログラムの場所が適切です。プログラムは非常に明確で正確であり(コードベースの進化を考慮して)、何もしない関数内でサイクルを焼かないでください。この方法でコードはより小さく/きれいになり、通常、チェックは問題が発生する可能性のある場所にプッシュされます。