- - PR -
文字列をequalsで判定する時
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-02-13 09:37
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派は。。。 「自然言語の順序とプログラミング言語の順序は違う」 と言われたら、往生します | ||||||||||||||||||||
|
投稿日時: 2008-02-13 09:58
気分の良くないメタファーですが、 僕はそうは思わないですね。 むしろ、 鶴亀算でできることを連立二元一次方程式でやることはないだろう 鶴亀算:A派 連立二元一次方程式:B派 と思いますよ。 # 無関係ですが、 # 連立二元一次方程式という言葉は初耳か、もう忘れてます。 # 鶴亀算って言葉も、僕は34歳ですが、もっと年配の方が使われて # いるのを聞いただけで自分では使いません。 # 単に「文章問題」と言っていたと思います。 # # ちなみに「メタファー」というのはアジャイルのプラクティスの # ひとつですね。 # 隠喩(いんゆ)、暗喩(あんゆ)、つまり、「たとえ」ですね。 | ||||||||||||||||||||
|
投稿日時: 2008-02-13 10:00
初心者に教えるという文脈では、オブジェクトがそのインスタンスメソッドを呼び出すという形として、Stringオブジェクトがvarなら、
var.equals("literal") しかありえません。 そして雑談として、現場のプロは"literal".equals(var)と書くこともあるよと話し、そのメリットとデメリットを説明するでしょう。でも、混乱させるおそれがあるので、この話をするのは、equals()メソッドの使い方に十分慣れてからになるでしょう。 | ||||||||||||||||||||
|
投稿日時: 2008-02-13 10:15
僕は作り手の意図は大事だと思います。 コードというのは意図を表している訳で、単なる記号と捉えると、 人間には理解し難いものになります。 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であるか?」を検査したいということでは ないですよね? そういう前提で「気持ち悪い」論を展開している訳です。 | ||||||||||||||||||||
|
投稿日時: 2008-02-13 10:29
それがそうでもないので、ほんとに往生しますわ(こればっか。。。) 「前のプロジェクトではB派でやってました。どうして、A派なんですか?」 と聞いてくる訳です。 で、 「気持ち悪くないのか?」 と聞くと、 「なぜ、気持ち悪いのですか?」 と返してくる。 もちろん、新人なので、インスタンスの何たるかも知らないのですが、 どうやら、B派が「流行り」で「クール」なのだそうで。。。 僕なんかが、ケント・ベック氏の理論を聞いても、 「なるほど、そういう考えもあるんだね」程度にしか思わないのですが、 アジャイル(XPのみ?)をやるには、B派に入信しなければならない と思ってしまうマネージャがどこかしこにいるようで。 ※ 暇だったのでいっぱい書き込んでしまいました。。。 ※ 初心者の方も萎縮せずに自由に意見を書き込んでくださいね。 | ||||||||||||||||||||
|
投稿日時: 2008-02-13 10:34
まず、プログラムは作り手が意図した動作をさせるべく、記述するものだという点を ご理解いただきたい。当然、仕様というものがあれば、その仕様を満たすように しようという意図を反映したコードになる。 そして、プログラムとしての挙動というのは、意図には関係なく、ただ純然と、記述どおりに動く。 ここまでは、プログラムをやっている人間なら痛いほど分かっていることと思います。 さて、仕事でプログラムをやっていると、他人のソースなどもよく見ることになるわけですが、 そのなかで頻繁に見かけるミスというものがあります。 そのひとつに、文字列のequals比較の際のnullの考慮漏れです。 for文の条件判断の誤りも比較的多く見かけるミス。境界値バグという奴ですね。 findbugsといったバグパターン検出ではこのnullの考慮漏れもチェックできます。 そういったツールが存在するぐらいに頻繁にミスがされているということでもあります。 意図どおりか?を疑うと確かにすべてのコードが信用できませんが、 よくある間違いのパターンだけに、特にその箇所が意図どおりかを強く疑うということです。 すでに何度も出ているけどnullかどうかは冒頭でチェックするのが通常なので、 狙ってNullPointerExceptionが発生するようにしているのかどうかといわれると 大抵の場合は単なる考慮漏れといえる。 そういう意味でも、「ありえないコード」の型なのですよ。 nullチェック抜きに存在するstr.equals("hoge")は。
簡単のためにこう書いていますが、通常はstatic finalな定数とかでしょうね。
"literal"がStringオブジェクトであることを理解しない前提でいえば正しいと思います。 | ||||||||||||||||||||
|
投稿日時: 2008-02-13 10:59
今更で申し訳ないのですが、unibonさんの意見が少し理解できた気がします。
両者はコードで書くと、以下のような違いがあるのだと思います。
この違いがわかっているのであれば、どっちで組んでも構わないのだと思います。 ただ、違いを意識せずに安易な気持ちで使った場合、 後者のほうが、問題が起こったときにちょっとだけわかりにくいのだと思います。 # そういえば VisualStudio で "test". までタイプしたときにも # 候補の一覧が出てくれるようになったのは、いつの頃だったか... | ||||||||||||||||||||
|
投稿日時: 2008-02-13 11:16
AとかBじゃ、いつまた入れ替わるかわかりませんよ。 それよりも、固執派、ドライ派ってのはどうですか。
さあ? 少なくとも私はどうでもいいです。
だから、んなもんは主観の問題だと何度言えば(ry
誰です? 教えてください。
既出ですね。 |