失敗時にtrue
戻らない場合、成功時に戻る理由はまったくありませんfalse
。クライアントコードはどのように見えるべきですか?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
この場合、呼び出し元はとにかくtry-catchブロックを必要としますが、次のように書くことができます:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
そのため、true
戻り値は呼び出し元にとって完全に無関係です。メソッドをそのままにしてくださいvoid
。
一般に、フェイルモードを設計するには3つの方法があります。
- true / falseを返します
- 使用
void
、スロー(チェック済み)例外
- 中間結果オブジェクトを返します。
戻るtrue
/false
これは、いくつかの古い、主にCスタイルのAPIで使用されます。欠点は明白であり、何が悪かったのかわかりません。PHPはこれを非常に頻繁に行い、次のようなコードを導きます。
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
マルチスレッドコンテキストでは、これはさらに悪化します。
(チェック済み)例外をスローする
これは良い方法です。ある時点で、失敗が予想されます。Javaはこれをソケットで行います。基本的な前提は、呼び出しは成功するはずですが、特定の操作が失敗する可能性があることは誰もが知っています。その中にソケット接続があります。そのため、呼び出し元は障害の処理を強制されます。呼び出し元が実際に障害を処理することを確認し、呼び出し元に障害に対処するためのエレガントな方法を提供するため、素晴らしいデザインです。
結果オブジェクトを返す
これは、これを処理するもう1つの優れた方法です。解析や、単に検証が必要なものによく使用されます。
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
呼び出し元にとっても、すてきできれいなロジック。
2番目のケースを使用するタイミングと3番目のケースを使用するタイミングについては、少し議論があります。一部の人々は、例外は例外的であるべきであり、例外の可能性を念頭に置いて設計すべきではないと考え、ほとんどの場合、3番目のオプションを使用します。いいね しかし、Javaで例外をチェックしたため、例外を使用しない理由はありません。呼び出しが成功する(ソケットを使用するなど)という基本的な仮定がある場合は、チェック済みの調査を使用しますが、失敗する可能性があります。しかし、これについてはさまざまな意見があります。
あなたの場合、私はvoid
+で行きException
ます。ファイルのアップロードが成功することを期待しますが、そうでない場合は例外です。ただし、呼び出し側はその失敗モードを処理する必要があり、発生したエラーの種類を適切に記述する例外を返すことができます。