- - PR -
文字列をequalsで判定する時
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-02-12 18:14
結局主観の問題ですか。
私は、そもそも「あくまで変数が比較元(そして主体)」というのが、 手続き型言語の遺産だと考えています。 変数は、あくまでも状態を保存する、システムの従属物です。 システムの個性を表すのは、ロジックとそして定数ですよ。 だからこそ、ロジックとリテラルをカプセル化できることが、 オブジェクト指向言語の画期的な点なのです。 せっかくのオブジェクトを、リテラルのようにしか扱えないなんて、 もったいないですよ。
こうだったらかけますね。 Boolean tempTrue = new Boolean( true ); if (tempTrue.eqpals(hoge.isSleeping())) { ... } <追記> わざわざ、んなことしなくても。orz if (Boolean.TRUE.eqpals(hoge.isSleeping())) { ... } [ メッセージ編集済み 編集者: Edosson 編集日時 2008-02-12 18:27 ] | ||||||||||||||||||||
|
投稿日時: 2008-02-12 18:19
私のほうで誤解していましたね。 主語と目的語が入れ替わっているケースになるのか。 日米とかは関係ないですね。 ケント・ベックって誰だろうとおもったらXPの人ですか。 私は権威主義じゃないので誰でも構わないのですが、 個人的には「不自然な順」という主張はあんまり賛成できないなぁ。 数学の方程式と同じですからね。 ケント・ベック氏は数学界に対しても、定数は右に置けと文句を言ってます?
なるほど、あぶぽんさんは
と書くのですね。
まず、この理解が違います。 とりあえず、コーディング規約の話はしていないし、あぶぽんさんと同じく 私もヒューマンエラーが起こると考えていますから、解決できると思っていません。 デフォルトではnull時は等価ではないを期待するし、 NullPointerExceptionを期待するなら投げればいい、という話をしているだけ。 その際に定数を手前に置いたからといって妨げにはならないし、 「習慣として」定数を手前に置いたほうがどちらかというとメリットが あるんじゃないの?程度の話です。 | ||||||||||||||||||||
|
投稿日時: 2008-02-12 18:23
僕もC#を使っています。 特に言語に依存した話題ではないと捉えています。
ありがとうございます。参考になりました。 代入演算子と間違えるのを防ぐというところから、 未初期化オブジェクトのメソッドを呼ぶのを防ぐというふうに 変わってきたのですね。
脱線で有り得るはずがありません。 ありがとうございます。 | ||||||||||||||||||||
|
投稿日時: 2008-02-12 18:26
意味不明なこと書いてるなあ、と思った。
なるほど、B派の人は「比較対象を必ず左に書く」と勘違いしているから、上記のような意味不明な問いが出てくるのですね。 "test".equals() が便利なのは、String インスタンスが存在していることが保証されるからでしょう。プリミティブ型である true と比較するのであれば、インスタンスの存在保証は不要だから比較対象を左に書く必要はない。 hoge.isSleeping() が boolean ではなく Boolean を返す、そして気まぐれに null を返してしまうかもよ?って仕様なら、 if(Boolean.TRUE.equals(hoge.isSleeping())) { } と書くんじゃないかな。"test".equals() を便利に活用している人達は。私も null 値との文字列比較で false が返れば十分なときには、"test".equals() を使いますね。楽チンだから。 | ||||||||||||||||||||
|
投稿日時: 2008-02-12 18:44
nagiseさん、
こちらにも誤解がありました。 nagiseさんの意見は『if条件式の右辺と左辺』のときのログと合わせて 理解しました。 たしかに、その場合、問題になってきません。 問題になってくるのはこれがコーディング規約として現れたときです。 なぜ、それを規約とするのかという理由が、 危険であると判断したためです。 その方法(規約)で、問題が解決するというような意見が聞かれること があったからです。 アサーションとエラー処理と本処理を分けて考えられているのであれば、 なんら問題はありません。 失礼な点がございましたことをお詫びします。 | ||||||||||||||||||||
|
投稿日時: 2008-02-12 19:13
問題はそちらではなく、 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派としましょうか | ||||||||||||||||||||
|
投稿日時: 2008-02-12 19:26
ちょっとだけ、追記です。 この文脈の「気持ち悪い」は、A派の気持ちを表しています。
ええ、ごもっともですが、言う相手が違うかと。。。 自己紹介も何もしていないので仕方ないですが、 僕は働き始めて十数年、オブジェクト指向一本の人ですので、 逆に手続き型には詳しくありません。 しかし、もったいないとは思いませんが、この場合は。
すみません。揚げ足とらせてください。 それをトリッキーというのです(冗談) | ||||||||||||||||||||
|
投稿日時: 2008-02-12 19:28
どちらも同じものを表しているんですから、 自然かトリッキーかなど、どうでもいいことです。 さらにいわせていただければ、棚でも袋でも複数あった方が潰しが利きます。 節操なし? 上等ですよ。
まだ続くんですか? |