Kox Blog

バグを知り、業務を知らば、システム危うからず

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  243  : 記事  0  : コメント  929  : トラックバック  35

ニュース

書庫

日記カテゴリ

リンク

if( 文字列定数.equals( 変数 ){
}
と
if( 変数.equals( 文字列定数 ){
}

書き方の違う2つの似たif文がありますが、
どちらが保守に強い書き方なのでしょうか。

2つの動作の大きな違いとして、
前者はNullPointerExceptionは発生しないが、
後者はNullPointerExceptionは発生する可能性があります。


前者の場合は、変数にたとえNullが入っていたとしても、処理を継続します。
実行時エラーは発生しません。(少なくともこの段階では))
Nullの場合はそもそも意図した処理をする必要がないため、
Nullであろうがなんだろうが気にしません。

後者の場合は、変数にNullが入ってきた場合の処理を考える必要があります。
NullPointerExceptionを投げられたら嫌ですもん。
ですから、通常Nullである可能性がある場合は、

if( 変数 != null && 変数.equals( 文字列定数 ) ){
}

と言ったような書き方をします。

上記のような書き方は、実はどちらもNullを考慮したつくりになっています。
Nullが入ってくることを許容したつくりですね。
その場合は確かに前者の方が優れているといえそうです。


次にNullを許容していない場合を考えてみます。
前者の場合は、Nullを許容してしまっているので、処理はされませんがエラーにもなりません。
実行時エラーを出さないのも大切ですが、
意図しない結果をエンドユーザに出力してしまうほうが問題です。
エラーとならないので、最終的な処理結果が意図していたものと違うかどうかが分からず
障害が発生した場合のエラー箇所の特定が困難になります。
#まあ言ってしまえば前者自体がバグなのですが。
後者の場合は、NullPointerExceptionを投げます。
例外を投げるので、エラー箇所を特定することも容易です。
ここより前の段階で何かしらの理由で変数にNullが含まれたことが明らかだからです。

?

結論として、どちらのif文を使用するかはケースバイケースと言うことになりますが、
状況によりどちらのケースが適切であるかを考えるよりも
Nullの許容有無に関わらず使用できる後者ほうが、保守に強いといえるかもしれません。

投稿日時 : 2007年7月12日 12:48

コメント

# re: if条件判定はどちらがよい? 2007/07/12 13:02 じゃんぬねっと
Equals メソッド使いますか? タイプセーフでないですが。

# re: if条件判定はどちらがよい? 2007/07/12 13:12 中博俊
NullPointerExceptionなんやからJavaでしょ>じゃんぬ

# re: if条件判定はどちらがよい? 2007/07/12 13:23 NyaRuRu
>タイプセーフでない

上のソースからは判定つかないような.
http://msdn2.microsoft.com/ja-jp/library/858x0yyx(VS.80).aspx

# re: if条件判定はどちらがよい? 2007/07/12 13:23 NyaRuRu
てか,Javaでしたか.失礼.

# re: if条件判定はどちらがよい? 2007/07/12 13:33 かつのり
自分は面倒なときには文字列定数.equals(変数)を使いますね。
確実に1ラインで安全なコードがかけるので便利ですが、
最近はStringUtilsなるクラスと比較用メソッドを用意することも多いです。


# re: if条件判定はどちらがよい? 2007/07/12 15:52 kox
エーと。Javaの話です。それしか知らないし。

このエントリで問題としてあげているのは、
「保守がしやすい」のは、どちらかと言うことです。
意図的に、使用方法をきちんと理解した上での
選択であれば問題ないと思っています。

で、保守にとって一番よいのは
障害時に迅速に対応できることです。

開発者の視点でみると、
コンパイル時に検知できる方がよいとなりますし、
アベンドなんてかっこ悪いしとなると思います。

しかしコンパイルが通るからといって、
テスト漏れがないとも言い切れません。
そしてエンドユーザの意図しない結果を返し、
それに気づかないまま処理が行われ、
取り返しのつかない事態が起こってしまうことの方が怖いのです。

取り返しのつかないような事態が起こるぐらいなら、
アベンドして怒られたほうが対策もしやすい。

そんな観点でこのエントリを書きました。

# re: if条件判定はどちらがよい? 2007/07/12 16:26 ひろえむ
私も一瞬「あれ?」って思ってしまった

.NETではタイプセーフじゃないのが有名な話だからついつい間違っちゃうんですよね(^^;

# if条件判定はどちらがよい? (その2) 2008/02/15 18:03 Kox Blog
if条件判定はどちらがよい? (その2)

# if条件判定はどちらがよい? (その2) 2008/02/15 18:05 Kox Blog
if条件判定はどちらがよい? (その2)

Post Feedback

タイトル
名前
Url:
コメント