以下のソースの場合、どれが書き方としてすっきりすると思いますか?順位と理由をお答えください。

(仕様によって違うよーと言うのであればその理由も御願いします。)

※順位の書き方は
 3 > 1 > 2
と書いてください。
(3番が一番優れていると思う場合)


1)
public String run(String item) {
if (item == null) {
return null;
}

//なんか処理***

return 結果;
}
//**************************************

2)
public String run(String item) {

String 結果 = null;
if (item != null) {

//なんか処理***
}

return 結果;
}
//**************************************

3)
public String run(String item) {
if (item == null) {
throw new NullPointerException("Item is Null.");
}

//なんか処理***

return 結果;
}
//**************************************

回答の条件
  • 1人20回まで
  • 300 ptで終了
  • 登録:
  • 終了:2006/05/04 13:40:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答8件)

<前のツリー | すべて | 次のツリー>
仕様により変わる dev_zer02006/04/27 14:12:59ポイント4pt

1と3は

// なんか処理***

でitemにnullが入ることが仕様上ありえるのか、ありえないのかで変わると思われます。

itemにnullが入ることが仕様上存在し得る場合、例外をなげるべきではありませんし、

itemにnullが入ることが仕様上あり得ない場合、そのままリターンすべきではありません。


2は論外です。構造化プログラミングでは入口、出口が1つであるべきいう下りがありますが

今は1つの引数チェックだけですが、複数の引数チェックを行うとブロックが深くなりすぎて見にくくなります。

構造化プログラミングは原則であり、完全に適用すると逆に見づらくなる典型的な例です。


よって、私は

itemにnullが入ることが仕様上存在し得る場合

1 > 2 > 3

# 3は仕様上存在し得るにも関わらず、呼び元でtry/catchしなければいけないのが冗長です


itemにnullが入ることが仕様上存在し得ない場合

3 > 1 > 2

# 1, 2でもどこかで例外が発生するでしょうが、例外は出来るだけ早く検出すべきと考えます。

同意 yuki_n2006/04/27 17:30:10ポイント1pt

3に関しては、他と仕様が違うので比較できない。

1>2

3は別次元

dev_zer0様の意見に少し追加。(個人的意見ですが)

『なんか処理』が長くなると(100ステップとか)、

if文の開始と終了がどこなのか、判別し辛くなる。

まぁ、1関数内で100ステップとかなってくると、

また別の問題もあるかもしれませんが。。例えということで。

Re:仕様により変わる Paul2006/04/27 15:26:57ポイント2pt

String 結果 のスコープを狭くするという意味でも1 > 2だと思います。


3は論外です。IllegalArgumetExceptionなら分かるけど、

NullPointerExceptionはnullオブジェクトのpropertieを参照したとき用なので。


あと、例外と、値返しは基本的に意味が違うので1,2と3は比較になりません。

結果がnullを返してはまずい場合は、3だけが正解でそれ以外はバグです。


結果がnullを返しても良い場合 & itemにnullを代入しても良い場合は

1,2が正解で3はバグです。


それと、ver1.4以降なら

public String run(String item) {

assert item != null : "itemがnullでは困ります!";

//なんか処理

return 結果;

}

という書き方もあります。


//なんか処理

をどうしても実行してもらいたい場合はこのほうがお薦めです。

Re:仕様により変わる あーる2006/04/27 15:49:04

IllegalArgumentExceptionですか。なるほど!!

でも、引数が null と引数の値が想定外と分けたい場合は

NullPointerException を使う場合もあるので

論外は言いすぎな気がしますね。

例えば

java.lang.System.getProperty(String key, String def)

は、

key が null の場合は NullPointerException

key が 空 の場合は IllegalArgumentException

となっています。


でも、説明としては

IllegalArgumentException

の方が客観的にわかりやすいと言うのは、もっともだと思います。

そうすると、前提条件として引数をチェックしているというのがソースから読み取れますものね。

考慮が足らず、すみませんでした。 m(__)m

<前のツリー | すべて | 次のツリー>

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません