- PR -

文字列をequalsで判定する時

投稿者投稿内容
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-02-12 18:14
引用:

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

だって、気持ち悪いじゃないですか。


結局主観の問題ですか。
引用:

「hoge.isSleeping()」だと、左側が比較元ですから。。。


私は、そもそも「あくまで変数が比較元(そして主体)」というのが、
手続き型言語の遺産だと考えています。
変数は、あくまでも状態を保存する、システムの従属物です。
システムの個性を表すのは、ロジックとそして定数ですよ。
だからこそ、ロジックとリテラルをカプセル化できることが、
オブジェクト指向言語の画期的な点なのです。
せっかくのオブジェクトを、リテラルのようにしか扱えないなんて、
もったいないですよ。
引用:

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

「true.isSleeping(hoge)」


こうだったらかけますね。

Boolean tempTrue = new Boolean( true );
if (tempTrue.eqpals(hoge.isSleeping())) { ... }

<追記>
わざわざ、んなことしなくても。orz
if (Boolean.TRUE.eqpals(hoge.isSleeping())) { ... }

[ メッセージ編集済み 編集者: Edosson 編集日時 2008-02-12 18:27 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-02-12 18:19
引用:

あぶぽんさんの書き込み (2008-02-12 16:22) より:
ケント・ベック氏は、何らかの理由があって、
あえて不自然な順番で検査を行なったのであって、
英語圏では日本と順番が逆だという事実はありません。



私のほうで誤解していましたね。
主語と目的語が入れ替わっているケースになるのか。
日米とかは関係ないですね。

ケント・ベックって誰だろうとおもったらXPの人ですか。
私は権威主義じゃないので誰でも構わないのですが、
個人的には「不自然な順」という主張はあんまり賛成できないなぁ。

数学の方程式と同じですからね。
ケント・ベック氏は数学界に対しても、定数は右に置けと文句を言ってます?

引用:

あぶぽんさんの書き込み (2008-02-12 16:32) より:
コード:
if (true == hoge.isSleeping()) { // Hogeが眠っていたら
    hoge.getUp();        // Hogeを起こす
}


と書くのですか?



なるほど、あぶぽんさんは
コード:
if (hoge.isSleeping() == true) { // Hogeが眠っていたら
    hoge.getUp();        // Hogeを起こす
}


と書くのですね。

引用:

あぶぽんさんの書き込み (2008-02-12 17:31) より:
まず、この前提が違います。


まず、この理解が違います。
とりあえず、コーディング規約の話はしていないし、あぶぽんさんと同じく
私もヒューマンエラーが起こると考えていますから、解決できると思っていません。

デフォルトではnull時は等価ではないを期待するし、
NullPointerExceptionを期待するなら投げればいい、という話をしているだけ。
その際に定数を手前に置いたからといって妨げにはならないし、
「習慣として」定数を手前に置いたほうがどちらかというとメリットが
あるんじゃないの?程度の話です。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 18:23
引用:

rainさんの書き込み (2008-02-12 17:51) より:
私自身はC#の人ですが、このスレッドは興味深く拝見しています。



僕もC#を使っています。
特に言語に依存した話題ではないと捉えています。


引用:

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



ありがとうございます。参考になりました。

代入演算子と間違えるのを防ぐというところから、
未初期化オブジェクトのメソッドを呼ぶのを防ぐというふうに
変わってきたのですね。


引用:

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



脱線で有り得るはずがありません。
ありがとうございます。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-02-12 18:26
引用:

そっち派の人に質問ですが、ブール値の検査を、if (hoge.isSleeping()) { } と書かずに、if (true == hoge.isSleeping()) { } と書くのですか?


意味不明なこと書いてるなあ、と思った。

引用:

「必ず比較対照を左に書くこと!」というのは同じで、


なるほど、B派の人は「比較対象を必ず左に書く」と勘違いしているから、上記のような意味不明な問いが出てくるのですね。

"test".equals() が便利なのは、String インスタンスが存在していることが保証されるからでしょう。プリミティブ型である true と比較するのであれば、インスタンスの存在保証は不要だから比較対象を左に書く必要はない。

hoge.isSleeping() が boolean ではなく Boolean を返す、そして気まぐれに null を返してしまうかもよ?って仕様なら、

if(Boolean.TRUE.equals(hoge.isSleeping())) { } と書くんじゃないかな。"test".equals() を便利に活用している人達は。私も null 値との文字列比較で false が返れば十分なときには、"test".equals() を使いますね。楽チンだから。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 18:44
nagiseさん、

こちらにも誤解がありました。

nagiseさんの意見は『if条件式の右辺と左辺』のときのログと合わせて
理解しました。

たしかに、その場合、問題になってきません。

問題になってくるのはこれがコーディング規約として現れたときです。

なぜ、それを規約とするのかという理由が、
危険であると判断したためです。

その方法(規約)で、問題が解決するというような意見が聞かれること
があったからです。

アサーションとエラー処理と本処理を分けて考えられているのであれば、
なんら問題はありません。

失礼な点がございましたことをお詫びします。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 19:13
引用:

Edossonさんの書き込み (2008-02-12 17:57) より:
(中略)
どっちにしても、つまらないですけどね。



問題はそちらではなく、

 If Hoge is sleeping,
 (Hogeが眠っていたら、)
 「if (hoge.isSleeping()) {」

 左:Hoge
 右:眠っている

ですが、逆にすると、

 If the sleeping man is Hoge,
 (眠っているのがHogeなら)
 「if (???) {」

 右:眠っている
 左:Hoge

???の部分が聞きたかったのです。

おそらく、仕様書には「Hogeが眠っていたら」と書かれていたのだろうと
推測します。

なぜなら、SleepingManというクラスではなく、
Hogeというクラスが作られてる訳ですから。


しかし、シンプルに答えると、
そちら派も「if (hoge.isSleeping()) {」と書くということですね。


それで、だから何かというと、
「if (hoge.equals("Sleeping")) {」というのが自然であると、
僕には思えるし、

逆はトリッキーだと思うわけです。


トリッキーだから禁止ということではなく、
こちら派のメリットを挙げているのです。


# そちら派とこちら派じゃ区別が付かなくなるので、今後、
# 未記入さんにならって、
# そちら派=A派、こちら派=B派としましょうか
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 19:26
引用:

Edossonさんの書き込み (2008-02-12 18:14) より:
引用:

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

だって、気持ち悪いじゃないですか。


結局主観の問題ですか。



ちょっとだけ、追記です。
この文脈の「気持ち悪い」は、A派の気持ちを表しています。

引用:

私は、そもそも「あくまで変数が比較元(そして主体)」というのが、
(中略)
もったいないですよ。



ええ、ごもっともですが、言う相手が違うかと。。。
自己紹介も何もしていないので仕方ないですが、
僕は働き始めて十数年、オブジェクト指向一本の人ですので、
逆に手続き型には詳しくありません。

しかし、もったいないとは思いませんが、この場合は。


引用:

こうだったらかけますね。

Boolean tempTrue = new Boolean( true );
if (tempTrue.eqpals(hoge.isSleeping())) { ... }

<追記>
わざわざ、んなことしなくても。orz
if (Boolean.TRUE.eqpals(hoge.isSleeping())) { ... }



すみません。揚げ足とらせてください。
それをトリッキーというのです(冗談)
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-02-12 19:28
引用:

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

「if (hoge.equals("Sleeping")) {」というのが自然であると、
僕には思えるし、

逆はトリッキーだと思うわけです。


どちらも同じものを表しているんですから、
自然かトリッキーかなど、どうでもいいことです。

さらにいわせていただければ、棚でも袋でも複数あった方が潰しが利きます。
節操なし? 上等ですよ。
引用:

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


まだ続くんですか?

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