2017-04-21 12 views
-1

これは非常にばかげて聞こえるかもしれません。しかし、私が新しいapiを作成し始めるたびに、私はこの質問に固執しています。入力が間違った場合の戻り値

私は、入力を取り込み、データベースまたはファイルに書き込み、ブール変数のtrue/falseを返す作者を書いています。

ライターがtrueを返した場合、書き込みが成功したことを意味します。 ライターがfalseを返した場合、書き込みが失敗したことを意味します。

入力がnullまたは空の文字列だったとしましょう。その場合、ライターはfalseを返すか、Trueを返す必要がありますか?

明白な解決策の1つは、例外を投げることです(違法かもしれません)。しかし、例外をスローしたくない場合はどうすればよいですか?仮定すると、私はちょうどいくつかのログエントリを解析し、ファイルに書き込もうとしています。私がデータを書き込むたびに、私は真偽を期待しています。

+0

あなたは「偽」とみなすことができます。何も書き込まないのと同じです。 –

+0

あなたと、誤ったリターンの定義に依存しますが、それらが無効な入力である場合、例外をスローすることができます(そしてスローする必要があります)。 – AxelH

+3

問題に関する正しい情報の代わりに 'false'を返すことは、古いファイルAPIが悪いとみなされた理由の1つです。詳細はhttp://java7fs.wikia.com/wiki/Why_File_sucksをご覧ください。 – Pshemo

答えて

2

戻り値で何をしたいのか、そして入力を分かりやすく扱うことができるかによって異なります。

nullまたは空のStringが有効な入力でない場合、通常、APIのユーザーが契約を尊重しないために例外がスローされます。しかし、ロギングのようないくつかの事柄では、成功が重要ではないかもしれないが、あなたはそれを見落とし、何も書いておらず、真偽値を返すことを望むかもしれない。

これは、ブール値がユーザーに伝達する内容によって異なります。何かが書かれたことを明記しなければならない場合、正当な入力は正常に返され、失敗または誤った入力が返されます。入力の処理が成功したかどうかに関わらず、何が書かれたか、またはnull/emptyのようなケースが適切に処理された場合はtrueを返し、適切な入力を処理する実際の失敗の場合のみfalseを返します。 APIのユーザーは、戻り値falseで操作を再試行することもできますが、接続自体が破棄されるなど一時的な障害ではなく、入力自体に問題がある場合は失敗します。

本当の問題はブール値が2つの値を持つ可能性がありますが、2つ以上のシナリオがあることです。成功、失敗、間違った入力を示す値を返す方が良いでしょう。多くの古いAPIでは、(多くのコマンドラインプログラムのように)結果を示す整数の戻り値を見つけることがよくあります。 JavaではEnumを使用するのが理にかなっています。値はSUCCESS,FAILUREおよびINVALID_INPUTとなります。 APIのユーザーは、それぞれのケースの処理方法を決定できます。さらに、さまざまな障害モードなどの他のケースをカバーするように拡張できます。

ただし、ある時点では、これは単にチェック例外の代わりに似ています。結局のところ、正しい答えはAPIとそれをどのように使用すべきかによって決まり、議論は単なる技術的なものではなく、スタイルや好みの問題でもあります。

関連する問題