- PR -

文字列をequalsで判定する時

投稿者投稿内容
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 16:22
引用:

nagiseさんの書き込み (2008-02-12 15:45) より:
プログラムを逐次日本語訳しながら読んでいるうちはそうかもしれません。

(中略)

その方針でいくとJavaを日本語の構文に基づいた言語に直せ!という話になっちゃう。



ことぶきじーさんは日本語でとおっしゃっていますが、
文章の流れも、設計書の項目順も、この場合、英語でも同じですよ。


日本語: 「答え」が「正解」なら、ニューヨークへ!

英語: If the answer is correct, you will go NY!
(より、自然には、If you answer this correctly,)

ケント・ベック氏は、何らかの理由があって、
あえて不自然な順番で検査を行なったのであって、
英語圏では日本と順番が逆だという事実はありません。


その理由が何であれ、
僕は、それが「トリッキー」だと主張しているのです。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 16:32
nagiseさんだけでなくそっち派の人に質問ですが、

ブール値の検査を、
コード:
if (hoge.isSleeping()) { // Hogeが眠っていたら
    hoge.getUp();        // Hogeを起こす
}


と書かずに、
コード:
if (true == hoge.isSleeping()) { // Hogeが眠っていたら
    hoge.getUp();        // Hogeを起こす
}


と書くのですか?

ふと、疑問に思ったので、質問です。。。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-02-12 17:02
引用:

あぶぽんさんの書き込み (2008-02-12 16:32) より:
nagiseさんだけでなくそっち派の人に質問ですが、

コード:

if (true == hoge.isSleeping()) { // Hogeが眠っていたら
hoge.getUp(); // Hogeを起こす
}


と書くのですか?


揚げ足取りにしてはつまらないですね。

必ずしも以下のように書かないのは何故ですか?
って聞くのと同じくらい。
コード:

if (hoge.isSleeping() == true) { // Hogeが眠っていたら
hoge.getUp(); // Hogeを起こす
}



[ メッセージ編集済み 編集者: Edosson 編集日時 2008-02-12 17:11 ]
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 17:31
引用:

nagiseさんの書き込み (2008-02-12 15:37) より:
A. nullの場合にNullPointerExceptionをthrowしなくてはならないケース
B. nullの場合は単にfalseとして扱えばよいケース
C. nullの考慮が漏れているケース



まず、この前提が違います。

X. valueがnullであることがプログラム・ミスの場合
Y. valueがnullであるときにエラー処理を行なう場合
Z. valueがnullであっても良い場合

Xの場合は、アサーションではじきます。
Yの場合は、エラー値を返すなり、例外をスローするなりのエラー処理を行ないます。
Zの場合は、nullのときの動作を決めて、その動作をするようにします。

Aは、Yにあたります。
Bは、Zの一種で、
「valueはnullであっても良くて、その場合はfalseとして扱う」ということです。
Cは、考慮が漏れているので、XYZのどれかを決めること。


引用:

の場合に、AとBのどっちに倒す?つまり、フェイルセーフにしようか、
ということを考えた場合の話になります。



その点は、
コーディング規約で回避することではないし、回避できないと思います。

「必ずnullをチェックすること!」というのと、
「必ず比較対照を左に書くこと!」というのは同じで、

いづれの場合もプログラマはミスを犯します。


引用:

str.equals("hoge")の場合、意図的にNullPointerを出したい場合、
そのままで例外がthrowされるのですが、それが意図された挙動かどうか
わからないので、最低限コメントでその挙動を記述する必要があります。



そういうことがあるので、例外処理を予めやっておくと言っているのです。

意図的にnullポインタ例外を送出したいのであれば、
予めやっておく例外処理の中に、その処理を記述します。


引用:

そして、if文が複雑になるようだと、修正の際にバグを盛り込むことを
防ぐために、明示的に先頭でnullのチェックをしてNullPointerをthrowするようにする。



理由はif文が複雑になるからではありません。
アサーションとエラー処理と本処理を切り分けるためです。


引用:

その場合、なんら問題はないわけですが、では、nullかどうかを
意識しない場合はどうなのか。というか、考慮外の場合はどうなのか。
とくにnullの場合について考えないケースは、多くの場合単にfalseであればよい。

つまり、デフォルトの挙動で考えれば"hoge".equals(str)のほうが都合がよく、
かつ、とくに意識する場合のみ、nullチェックを行えばよい。



考慮外の場合は、考慮することというのが基本です。


引用:

これを矛盾と勘違いする理由は「意識して意識しない」ことを想定しているからですね。
常に「意識して意識しない」のであれば、それこそどちらでもよい。
「意識しないで意識しない」ケースとの違いをご理解いただきたい。



その辺の話は別のレスで書きましたが、
相対的に直感的なのは自然言語の順であったり、設計書の項目順であったり
します。

コーディング規約で決められているから意識しないということは、
ないのではないかと思います。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 17:40
Edossonさん、

ということは、「"Hoge".equals(str)」と書く人と、
「0 == count」と書く人は別ということですか?

僕は、左辺に比較対照を置くという意味で、同一に扱って
いました。

揚げ足というか、実際、書くんじゃないんですか?

「true == flag」と。。。

rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-02-12 17:51
私自身はC#の人ですが、このスレッドは興味深く拝見しています。

あぶぽんさんの疑問については以下のスレッドが参考になるかもしれません。
if条件式の右辺と左辺

脱線でしたらすみませんm(_ _)m

[追加]
#boolの比較だから揚げ足に見えただけで、
#intやStringの比較であればいいのかと思ったんだけど、違うのかなぁ。
[/追加]

[ メッセージ編集済み 編集者: rain 編集日時 2008-02-12 18:07 ]
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 17:51
すみません。要点が抜けてました。

だって、気持ち悪いじゃないですか。
「hoge.isSleeping()」だと、左側が比較元ですから。。。

本来、こう書きたいのかと思ったのですが、

「true.isSleeping(hoge)」

無理なので、実際のところどうなのかと思って。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-02-12 17:57
引用:

あぶぽんさんの書き込み (2008-02-12 17:40) より:

揚げ足というか、


揚げ足ですよ。
引用:

ブール値の検査を、
コード:
if (hoge.isSleeping()) { // Hogeが眠っていたら
    hoge.getUp();        // Hogeを起こす
}


と書かずに、

(略)

と書くのですか?


これでは、「if (hoge.isSleeping()) {」と書くのは
「if (hoge.isSleeping() == true) {」と書くとの同じだが、
「if (true == hoge.isSleeping()) {」と書くとのとは違う、
と書いているのと同じでしょう。

違うというのであれば
「if (hoge.isSleeping()) {」と書くのはだめで、
必ず「if (hoge.isSleeping() == true) {」と書かなければならない、
ということになるのでは?

どっちにしても、つまらないですけどね。

スキルアップ/キャリアアップ(JOB@IT)