- - PR -
文字列をequalsで判定する時
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-02-14 10:57
nagiseさん、
追記です。
君子豹変かも知れませんが、 こなれた文章を提示されたら寝返るかも知れないですよ。 そもそも、設計書の書き方がOO的でないのかも知れないですから。 僕もちょっと考えてみましたが、簡単な例では表しきれないですね。 「"Hoge"と同じものを探し…」とかだと、まだ詰めが甘いですね。 A派に突っ込まれます。。。 | ||||||||||||||||
|
投稿日時: 2008-02-14 10:58
うーん。どうだったかな。普段、自然に漢字を書いているけど書き順は意識したことがない。どういう書き順で書いてる?と問われても書き順を思い出せないような感じ。無意識に、なんとなく書いてるから。 それでも、がんばって、自分のコーディング順序を思い出してみよう。 まず、事前条件を最初に書くということはしないですね。ロジックが組み上がってから、事前条件を付加する。 だから、最初に書くのは if(str.equals("hoge") ... ここで考える。えっと str が null の場合は…。 (分岐1) str が null だとまずいなあ。よし事前条件を追加しよう。 if(str == null) { // return or throw Exception } if(str.equals("hoge")) { //メソッドの目的コード } とするか、もしくは、事前条件の短縮記述として… if(str != null) { if(str.equals("hoge")) { //メソッドの目的コード } } //return or throws Exception さらに短くして、 if(str != null && str.equals("hoge")) { //メソッドの目的コード } // return or throws Exception と書くことも多い。 (分岐2) str が null でも問題ないよな。 if("hoge".equals(str)) { //メソッドの目的コード } こうしたほうが楽チンだ。 ……こんな流れで私はコード書いてると思う。まず、str.equals("hoge") と書いて、str が null を許容するか許容しないかによって、事前条件を追加するか、"hoge".equals(str) に書き換えるかのどちらかをしている。 分かりやすく書くと以上のような流れだと思うけど、実際は慣れちゃっているから、str.equals("hoge") を書き始める前に手がとまって null について考えてると思う。そして、 事前条件 + str.equals("hoge") か "hoge".equals(str) のどちらかで一気に書いてる。
なので、どちらかといえば、str.equals("hoge") と打ち込んでからということになると思う。あくまでも、どちらかといえばだけどね。慣れちゃえば、書き始める前に null について考えるようになるから、あとから書き換えるというのは減ってくると思う。
そういう話だったのですか…。それじゃあ、私と意見が合わないわけだ。私は、null チェックを忘れるべきじゃないと思ってる。null チェックを忘れる可能性があるのなら、絶対に str.equals("hoge") がいい。null でも問題ないという確認をしたうえでしか、"hoge".equals(str) とは書かないので。
ごめんなさい。私は、nagise さんの主張をはじめから読み違えていたようです。当初の nagise さんの意見に同意です、というのは撤回します。null について考慮せずとも、"hoge".equals(str) が安全だなんて私は認められない。 | ||||||||||||||||
|
投稿日時: 2008-02-14 11:03
ジョークにつっこむのも無粋ですが、これって無害じゃなくて有害のような。 # そこまで含めてジョークだったらすみません | ||||||||||||||||
|
投稿日時: 2008-02-14 11:18
もちろん、含めてでしょう(笑) さらに無粋な解説をつけると、 『無害化』というのは、4ページで、かつのりさんが おっしゃった言葉です。 その後、僕はその意見に『無害化』の定義も確かめず、 同意してます。。。 「いつから『無害化」が、アサーションとエラー処理になったんだ?」 って突っ込まれたら、痛いです(>_<) | ||||||||||||||||
|
投稿日時: 2008-02-14 11:43
「終わっている」と考えられた場所を教えていただいてありがとうございます。
既にご自身で気づかれているように、nullを許容する前提ではお話されていないということでよろしいですね。 nullを許容する前提での無害化は、カーニーさんのジョークにある通りになると思います。(以降、この無害化をジョーク無害化と呼びます。かつのりさんのおっしゃるところの無害化とイコールかどうかわかりませんので) つまり、nullを許容する場合の記述は、
先のこの投稿に書いたように(1)と(2)が選択肢となります。 この場合もあぶぽんさんは(1)のような書き方がよいとお考えである、 という認識でよいですか? (1)の書き方が駄目とは言わないまでも、私は可読性の観点から(2)がよいと考えています。 (2)がよいと思う理由はカーニーさんの書かれた内容に同感です。加えるなら、ジョーク無害化を行うことは有害になる可能性があります。それは無害化処理とequalsでの比較処理の距離が離れた場合です。 equalsでの比較処理だけを見たら、strがnullだと例外が発生しそうに見えるのに、実際には例外は発生しない。nullに対してどのように扱いたいのかが一目ではわからなくなります。このジョーク無害化と(3)の組合せを使うくらいなら、明らかに(2)の方がましでしょう。 後は、(1)と(2)の可読性をどう捉えるかの問題なので、そこはこれ以上は主張しません。 人の主観によりさまざまでしょうから。
いえ、特にないと思います。 ただし、nullを許可する場合には、アサーションもエラー処理もないですよね。 なので、nullを許可する前提とnullを許可しない前提は区別して考える必要があると思います。 | ||||||||||||||||
|
投稿日時: 2008-02-14 12:42
よ、よねKENさん。。。A派だったんじゃ。。。他人のこと言えないですけど(*^_^*)
(あ、B派って書かれてますね。。。なんとなく論調がA派だったので。。。失礼m(__)m)
既に話しているつもりでしたが。。。 6ページです。
11ページです。
でも、よねKENさんのおっしゃりたいことは分かります。 NULLを許容する:NULLであるときは偽(または真)とする 場合の処理を書くときに、 (偽)の場合の例: 「if (str != null && str.equals("Hoge"))」 と書く必要がありますが、 それについては、短所ではなく長所であると言いました。 それなのに、 カーニーさんがおっしゃった、 「"hoge".equals(str)は単にコードを短くするため」 というのを否定しているということですよね? それは、今、言いますが、 1.許容しない場合は、A派もB派もアサーションもしくはエラー処理をしますね。 だから、コードは同じ長さです。 2.許容する場合は、A派もB派もアサーションもしくはエラー処理をしないですね。 B派のほうがコードが短いというのは認めます。 しかし、それは短所ではなく長所です というのが主張です。 だから、コードの長さの話はもう終わっているということです。 付け加えるなら、 11ページ:未記入さん
この「//nullでもいいよ」というコメントは、 2の場合で(nullは偽)だから必要なのではないですか? 2の場合で(nullは真)なら、言うまでもなく。。。ですね。 | ||||||||||||||||
|
投稿日時: 2008-02-14 13:05
2の場合は、(ご自身がそうするかどうかは別にして)B派のスタイルも"あり"という考えということですね。 全面的にA派スタイルしかありえないよっていうスタンスかと思っていたので誤解していたようです。
私は「//nullでもいいよ」というようなコメントは不要だと思います。 ただし、あぶぽんさんの事例にようにコーディング規約でB派スタイルが義務付けられている場合は、実装者が自分の書いたコードの意味を理解していない可能性があるので、その限りではないかもしれませんが。 | ||||||||||||||||
|
投稿日時: 2008-02-14 13:15
名前が出ていたので。
無害化とは空文字列の代入を意味しています。 単純に比較のみの目的であれば不要とかと思いますが、 開発の現場では前後に別の処理もあったりしますので、 空文字列を代入しています。 俗に言うNull Objectパターンに近いと思います。 例えばWEBシステムを作っていたとします。 よくある大半のWEBの画面の項目との入出力では、 空文字列とnullを明示的に区別しなければいけないケースって、 そんなに多くないのではと思います。 そんな場合、予め無害化を行っておくと処理が簡潔になります。 |