- PR -

文字列をequalsで判定する時

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

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

# そちら派とこちら派じゃ区別が付かなくなるので、今後、
# 未記入さんにならって、
# そちら派=A派、こちら派=B派としましょうか



AとBが入れ替わっているっぽいですね。。。
もともと僕が取り違えていたのか。。。

替えちゃいましょう。

 A派:str.equals("Hoge")
 B派:"Hoge".equals(str)

因みに僕は、

 A派:count == 9
 B派:9 == count

も、同様と考えて発言しています。

僕は、A派です。

B派の主張が間違っているとは思いませんが、
どちらかと聞かれたら断固A派です。

B派が間違っているのではなく、
断然、A派が良いという主張です。

# A派の意見に「気持ち悪い」というのがありますが、
# B派からみるとA派は「気持ち悪い」のだろうか?

良い悪いにかかわらず、
B派はトリッキーだということを自ら認めてくれるといいと思います。


メタファーで云うと、

「倒置法は悪くはないがトリッキーである」

だから、

「みんなが読み書きする文章で倒置法を使われると戸惑う」

ということです。

「みんな」というのは幼稚園児から老人まで、また、様々な教育レベルの人を
含むということです。

実際には、プログラマのレベルも様々な訳ですから。


「倒置法」とは、B派のメタファーです。
 ↑
これを認めないのですよね。B派は。。。

「自然言語の順序とプログラミング言語の順序は違う」
と言われたら、往生します
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-13 09:58
引用:

さいくろうさんの書き込み (2008-02-13 01:31) より:
気持ち悪い気持ち悪い、そればっかりいってるけどよ、
なんか、小学生の鶴亀算の名人が、中学にあがってから習う
連立二元一次方程式の解法を使うのをいやがる、ってな話を思い出したわ。



気分の良くないメタファーですが、
僕はそうは思わないですね。

むしろ、

 鶴亀算でできることを連立二元一次方程式でやることはないだろう

 鶴亀算:A派
 連立二元一次方程式:B派

と思いますよ。

# 無関係ですが、
# 連立二元一次方程式という言葉は初耳か、もう忘れてます。
# 鶴亀算って言葉も、僕は34歳ですが、もっと年配の方が使われて
# いるのを聞いただけで自分では使いません。
# 単に「文章問題」と言っていたと思います。
#
# ちなみに「メタファー」というのはアジャイルのプラクティスの
# ひとつですね。
# 隠喩(いんゆ)、暗喩(あんゆ)、つまり、「たとえ」ですね。

ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-02-13 10:00
初心者に教えるという文脈では、オブジェクトがそのインスタンスメソッドを呼び出すという形として、Stringオブジェクトがvarなら、

var.equals("literal")

しかありえません。

そして雑談として、現場のプロは"literal".equals(var)と書くこともあるよと話し、そのメリットとデメリットを説明するでしょう。でも、混乱させるおそれがあるので、この話をするのは、equals()メソッドの使い方に十分慣れてからになるでしょう。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-13 10:15
引用:

さいくろうさんの書き込み (2008-02-13 02:58) より:
引用:

未記入さんの書き込み (2008-02-13 02:00) より:
これを言っちゃうと、全てのコードが信用できないってことになりますよ。
例えば、for (int i = 0; i < 9; i++) で、「ループを9回まわしていることは分かるが、それが作り手の意図なのかはわからない(本当はi <= 9で10回まわしたいのかもしれない)」と言うことも主張できるわけで。


なんか趣旨変わってない?
そもそも「作り手の意図」なんか必要なのか?
書いてあることをそのまま信用すればいい、んでしょうが。



僕は作り手の意図は大事だと思います。

コードというのは意図を表している訳で、単なる記号と捉えると、
人間には理解し難いものになります。

1.「for (int i = 0; i < 9; i++)」

というのは、意図が良く伝わりますが、

2.「for (int i = 0; i <= 8; i++)」

では、8回ループしているのかと勘違いする可能性が大きくなると、
僕は思いますが、

「2でも9回ループしていることが直感的に分かるよ」

と言われたら、またまた、往生します。。。


forループの話は関係ないですが、

equalsに話を戻しても、「作り手の意図」が不要だということは
ないかと思いますよ。

「strが"Hoge"であるか?」を検査したいというのが、
僕の意図でもあり、A派の意図でもあると思います。

B派も同じはずだと思うのですが、
まさか、「"Hoge"がstrであるか?」を検査したいということでは
ないですよね?

そういう前提で「気持ち悪い」論を展開している訳です。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-13 10:29
引用:

rancoさんの書き込み (2008-02-13 10:00) より:
初心者に教えるという文脈では、
(中略)
var.equals("literal")

しかありえません。



それがそうでもないので、ほんとに往生しますわ(こればっか。。。)

「前のプロジェクトではB派でやってました。どうして、A派なんですか?」

と聞いてくる訳です。

で、

「気持ち悪くないのか?」

と聞くと、

「なぜ、気持ち悪いのですか?」

と返してくる。

もちろん、新人なので、インスタンスの何たるかも知らないのですが、
どうやら、B派が「流行り」で「クール」なのだそうで。。。

僕なんかが、ケント・ベック氏の理論を聞いても、
「なるほど、そういう考えもあるんだね」程度にしか思わないのですが、

アジャイル(XPのみ?)をやるには、B派に入信しなければならない
と思ってしまうマネージャがどこかしこにいるようで。

※ 暇だったのでいっぱい書き込んでしまいました。。。
※ 初心者の方も萎縮せずに自由に意見を書き込んでくださいね。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-02-13 10:34
引用:

未記入さんの書き込み (2008-02-13 02:00) より:
引用:
「プログラム的に許容しないことは一目でわかるが、それが作り手の意図なのかはわからない」


メリットが一つ減ったとしても、コードの読みやすさとバグ検出のしやすさだけでも、十分メリットはあるのですが、少し反論を。
これを言っちゃうと、全てのコードが信用できないってことになりますよ。
例えば、for (int i = 0; i < 9; i++) で、「ループを9回まわしていることは分かるが、それが作り手の意図なのかはわからない(本当はi <= 9で10回まわしたいのかもしれない)」と言うことも主張できるわけで。



まず、プログラムは作り手が意図した動作をさせるべく、記述するものだという点を
ご理解いただきたい。当然、仕様というものがあれば、その仕様を満たすように
しようという意図を反映したコードになる。

そして、プログラムとしての挙動というのは、意図には関係なく、ただ純然と、記述どおりに動く。
ここまでは、プログラムをやっている人間なら痛いほど分かっていることと思います。

さて、仕事でプログラムをやっていると、他人のソースなどもよく見ることになるわけですが、
そのなかで頻繁に見かけるミスというものがあります。
そのひとつに、文字列のequals比較の際のnullの考慮漏れです。
for文の条件判断の誤りも比較的多く見かけるミス。境界値バグという奴ですね。

findbugsといったバグパターン検出ではこのnullの考慮漏れもチェックできます。
そういったツールが存在するぐらいに頻繁にミスがされているということでもあります。
意図どおりか?を疑うと確かにすべてのコードが信用できませんが、
よくある間違いのパターンだけに、特にその箇所が意図どおりかを強く疑うということです。

すでに何度も出ているけどnullかどうかは冒頭でチェックするのが通常なので、
狙ってNullPointerExceptionが発生するようにしているのかどうかといわれると
大抵の場合は単なる考慮漏れといえる。
そういう意味でも、「ありえないコード」の型なのですよ。
nullチェック抜きに存在するstr.equals("hoge")は。

引用:

そもそも一般的には、リテラルやマジックナンバーを直接使うコード自体が好ましくないので、"hoge".equals(str)なんて使う機会の方が少ないのでしょうね。



簡単のためにこう書いていますが、通常はstatic finalな定数とかでしょうね。

引用:

rancoさんの書き込み (2008-02-13 10:00) より:
初心者に教えるという文脈では、オブジェクトがそのインスタンスメソッドを呼び出すという形として、Stringオブジェクトがvarなら、

var.equals("literal")

しかありえません。



"literal"がStringオブジェクトであることを理解しない前提でいえば正しいと思います。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-02-13 10:59
今更で申し訳ないのですが、unibonさんの意見が少し理解できた気がします。
両者はコードで書くと、以下のような違いがあるのだと思います。

コード:
// 普通は条件判定までに testStr が null の可能性を排除する
if (testStr.equals("test")) {
    // testStrはnullではない
} else {
    // testStrはnullではない
}



コード:
// testStr が null の可能性を排除しなくてもよい
if ("test".equals(testStr)) {
    // testStrはnullではない
} else {
    // testStrはnullかもしれない
}



この違いがわかっているのであれば、どっちで組んでも構わないのだと思います。
ただ、違いを意識せずに安易な気持ちで使った場合、
後者のほうが、問題が起こったときにちょっとだけわかりにくいのだと思います。

# そういえば VisualStudio で "test". までタイプしたときにも
# 候補の一覧が出てくれるようになったのは、いつの頃だったか...
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-02-13 11:16
引用:

あぶぽんさんの書き込み (2008-02-13 09:37) より:

AとBが入れ替わっているっぽいですね。。。
もともと僕が取り違えていたのか。。。

替えちゃいましょう。

 A派:str.equals("Hoge")
 B派:"Hoge".equals(str)


AとかBじゃ、いつまた入れ替わるかわかりませんよ。
それよりも、固執派、ドライ派ってのはどうですか。
引用:

# A派の意見に「気持ち悪い」というのがありますが、
# B派からみるとA派は「気持ち悪い」のだろうか?


さあ?
少なくとも私はどうでもいいです。
引用:

良い悪いにかかわらず、
B派はトリッキーだということを自ら認めてくれるといいと思います。

「みんなが読み書きする文章で倒置法を使われると戸惑う」

ということです。


だから、んなもんは主観の問題だと何度言えば(ry
引用:

「倒置法」とは、B派のメタファーです。
 ↑
これを認めないのですよね。B派は。。。


誰です? 教えてください。
引用:

「自然言語の順序とプログラミング言語の順序は違う」
と言われたら、往生します


既出ですね。

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