通るか通らないか | 江木町の牛舎

江木町の牛舎

~ 田舎者プログラマの日常 ~

元ネタは Java ですが、コーディングの問題なので共通ネタにしてみました。
間違いあったら教えてください。


とあるメソッドの処理なんですが

private void メソッド(){

 String errMSG = "";

 処理1

 errMSG = "本日は晴天なり";

 処理2

 if (errMSG.equals("") && 変数1 != null &&
   インスタンス1.プロパティ1 == 1 || インスタンス1.プロパティ1 == 2) {

   処理3

 }

}

前提条件が色々とあるんですが、それ書いちゃうとわかっちゃうので
そこら辺はちょっと内緒にして問題です。

さて、上記の 処理3 は通過するでしょうか?

今日たまたま仕事で出てきました。

ヒントは "本日は晴天なり" でしょうか。(嘘です)


この部分だけ切り取るとわかりやすいなぁ...


ひかからないかなぁ(^▽^;)



何のためらいも無く指摘できた人は素晴らしいです。
尊敬します。
僕にプログラミングを教えて下さい。

僕はちょっと悩みました。


まぁ、正解は 通る なんですが。


いわゆる インデント・改行に惑わされる というやつですね。
最初まともに引っかかって ここは絶対通らない と思い込んでしまいました。
だって && 条件の errMSG.equals("") は100%成立しませんから

通らないとおかしいので、きっとそういうことだろうという目で見たらわかりましたが。

 if (errMSG.equals("") && 変数1 != null &&
   インスタンス1.プロパティ1 == 1 || インスタンス1.プロパティ1 == 2) {

ちょっと編集してみるとこうなります。(僕はこの書き方が好き

if(errMSG.equals("")
&& 変数1 != null
&& インスタンス1.プロパティ1 == 1
|| インスタンス1.プロパティ1 == 2){

ということで、インスタンス1.プロパティ1 == 2 が独立した条件になっています。
他の条件がどうだろうが、この条件が成立したら通ってしまうバグです。

正しく動作させるならば

 if (errMSG.equals("") && 変数1 != null &&
   (インスタンス1.プロパティ1 == 1 || インスタンス1.プロパティ1 == 2)) {

でしょうか

どうも、元々

 if (errMSG.equals("") && 変数1 != null && インスタンス1.プロパティ1 == 1){

こうなっていた条件を修正したみたいなんですが、安易です。
きっと僕もやってしまうでしょう。

気をつけなければ。



しかし、この修正をした人が一手に手がけているシステムって...

いいんだろうか このカウボーイの集まり