- PR -

文字列をequalsで判定する時

投稿者投稿内容
OTAKE
会議室デビュー日: 2008/02/08
投稿数: 18
投稿日時: 2008-02-12 00:19
引用:
そりゃ開発の現場では意思統一が必要でしょう。
会議室で意思統一する必要があるんですか?


会議室で意思統一は無理でしょうね。
スキルも何もかも違う人間が集まっているのだから。
ただ、会議室で話し合うことにより、それぞれの書き方のメリット/デメリットは分かるわけで、それぞれのプロジェクトでコーディング規約を定めるときの判断材料にはなるでしょう。
コーディング規約を定めるときに、その理由も教えたほうが説得力は増すでしょうし。

メリット/デメリットを考慮することもなく、「好みの問題だから」と議論を打ち切ろうとするのは、単なる思考停止だと思います。
本当にどうでもいいと思っているなら、書き込む必要も見る必要もないわけですし。
レオ
常連さん
会議室デビュー日: 2006/10/14
投稿数: 21
投稿日時: 2008-02-12 09:50
Javadocでは以下のようになっていますね。

引用:

equals

public boolean equals(Object anObject)

この文字列と指定されたオブジェクトを比較します。引数が null でなく、このオブジェクトと同じ文字シーケンスを表す String オブジェクトである場合にだけ、結果は true になります。

オーバーライド:
クラス Object 内の equals

パラメータ:
anObject - この String と比較されるオブジェクト
戻り値:
String が等しい場合は true、そうでない場合は false
関連項目:
compareTo(java.lang.String), equalsIgnoreCase(java.lang.String)

nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-02-12 12:38
引用:

かつのりさんの書き込み (2008-02-10 02:42) より:
自分は予めnullに対して無害化や例外のスローを行うので、
コード:
if(str.equals("hoge"))


で十分です。



自分も予めnullに対して無害化や例外のスローを行いますが
nullかどうかを気にしなくていい場合は
コード:
if("hoge".equals(str))


で十分ですし、また、nullを気にする場合でも
敢えてstrを前にする必要性がないと思うので、
おおむね"hoge"が前で構わないと思っています。

とはいえ、それほど拘るようなことでもないと思っていますね。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 12:50
引用:

nagiseさんの書き込み (2008-02-12 12:38) より:
自分も予めnullに対して無害化や例外のスローを行いますが
nullかどうかを気にしなくていい場合は
コード:
if("hoge".equals(str))


で十分ですし、また、nullを気にする場合でも
敢えてstrを前にする必要性がないと思うので、
おおむね"hoge"が前で構わないと思っています。



それは、矛盾する方法ですね。

「予めnullに対して無害化や例外のスロー」を行なうのであれば、
nullかどうかを気にしていますよね。

詳しく言うと、
「nullかどうかを気にしなくていい」かどうかを気にしているということは、
nullかどうかを気にしているということです。
ことぶきじーさん
会議室デビュー日: 2003/10/07
投稿数: 7
お住まい・勤務地: 東京23区内
投稿日時: 2008-02-12 13:23
A, Bどちらもよくないです。

可読性を重視し、かつ、Null例外を防止するため、JakartaのStringUtilsを使いましょう。

if (StringUtils.equals(testStr, "test"))

特にBは、現在、所属の現場で推奨していますが、コードレビューをする立場として、大変、読みづらくなっています。

日本語の流れとして、
・"test"がtestStrのとき
より
・testStrが"test"のとき
のほうがわかりやすいです。
たいてい日本語で記述される設計書と照らし合わせる面でも、日本語の流れのほうがわかりやすいです。

よって、Bは、やめたほうがよいです。
保守の仕事をすれば、わかると思います。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 13:59
引用:

ことぶきじーさんさんの書き込み (2008-02-12 13:23) より:
if (StringUtils.equals(testStr, "test"))



これは趣旨からは外れた答えだと思いますが、

以降は、まさにその通りだと思います。

たとえ、ケント・ベック氏がそうしろと言ったとしても(爆)

nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-02-12 15:37
引用:

あぶぽんさんの書き込み (2008-02-12 12:50) より:
それは、矛盾する方法ですね。

「予めnullに対して無害化や例外のスロー」を行なうのであれば、
nullかどうかを気にしていますよね。

詳しく言うと、
「nullかどうかを気にしなくていい」かどうかを気にしているということは、
nullかどうかを気にしているということです。



読み違えられているようなので、説明しておきます。

A. nullの場合にNullPointerExceptionをthrowしなくてはならないケース
B. nullの場合は単にfalseとして扱えばよいケース

があって、意図的に扱っているならなんら問題はない。

C. nullの考慮が漏れているケース

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

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

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

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

つまり、デフォルトの挙動で考えれば"hoge".equals(str)のほうが都合がよく、
かつ、とくに意識する場合のみ、nullチェックを行えばよい。
これを矛盾と勘違いする理由は「意識して意識しない」ことを想定しているからですね。
常に「意識して意識しない」のであれば、それこそどちらでもよい。
「意識しないで意識しない」ケースとの違いをご理解いただきたい。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-02-12 15:45
引用:

ことぶきじーさんさんの書き込み (2008-02-12 13:23) より:
日本語の流れとして、
・"test"がtestStrのとき
より
・testStrが"test"のとき
のほうがわかりやすいです。
たいてい日本語で記述される設計書と照らし合わせる面でも、日本語の流れのほうがわかりやすいです。



プログラムを逐次日本語訳しながら読んでいるうちはそうかもしれません。

でも、それは英語の特定の表現が日本語では分かりにくいから使わないほうがよい、
漢文でレ点がつく表現を避けたほうがよい、とかそういう話題になってしまう。
前提がちょっと違うのではないでしょうか。

プログラム言語が流暢でない人を前提に「分かりやすい」を論じるのは
非常に難しく、それこそ人によるでしょうから、画一的な答えは出ないでしょうね。

すくなくとも英語圏の人でそういう理由で「わかりにくい」という意見に
同意する人はいないでしょうし。
その方針でいくとJavaを日本語の構文に基づいた言語に直せ!という話になっちゃう。

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