アルトのメモ帳

主にプログラミングとか

Java Silver・Goldに出てくる、明らかに使わない文法について

Java Silver・Goldといったプログラミング言語の試験には、コーディング規約でよく禁止されているものや、普通に推奨されない書き方、絶対に誰も使わないであろう書き方が数多く存在する。例えば、

double discount = person.isMan ? 1 : 0.8

のような三項演算子とか(時々コーディング規約で禁止されてて、こういう簡単な例でも割と議論になる)

if (i == 0) a = 0;

のようにif文の{}を省略するとか(普通に推奨されない)

 

int b = a++ + a + a-- - a-- + ++a;

のようにパズルみたいなものとか(絶対誰もこんなのやらないだろうけどJava Silverで見た)

 

三項演算子はともかく、他2つのような議論の余地無しで非推奨みたいなものは、実際こういう書き方をする気にもならないし、レビューで持ってこられたら問答無用で返す。だから、コーディングするだけなら覚える必要はない三項演算子に関しても別に使わなくても自分で書くぶんには支障は無い。(個人的にはQiitaのこの記事と同じ考え方で、読みやすい単純なものなら使ったほうが良いとは思っているが)

じゃあ学ぶ必要がないかと言われると、そういうわけでもないと思っている。

一番分かりやすい例だと、「他の人が全員使わないとは限らない」ということ。三項演算子なんかはよく既存のコードの中で使われているし、1行のif文とかも稀に出てくる。そういうのが出てきたときに読めないのは問題だとは思う。

あと無駄に複雑な書き方を読むのも、世の中if文やfor文が8重くらいにネストされているクソコードなんかも存在するので(筆者は古いコードの中で割と最近読んだことがある)、そういうのを読むための肩慣らしと思えばいい……のか? いややっぱ良くないわ、パズルコードは擁護できない。

あとは、何故かコンパイルが通ってしまってエラーに気付かない、というのを防ぐこともできるかもしれない。具体例は思い浮かばない。

 

ちなみに、JUnitカバレッジで、

if (user.isAdmin) {

    break;

}

みたいなものが何故かカバレッジが通らない、ということがあって、調べてみるとコンパイルの時に

if (user.isAdmin) break;

と書き換えられてるのが原因、みたいなのを見たことがある。「if文を一行で書くと拡張性ゴミだしみんな読むときに違和感を覚えるだけで短い以外の利点が無い」というのを知っていると、なるほどね、と納得できた。まあ役に立った事例かどうかは微妙だけど。

 

というわけで、クソコードの種でも、少なくとも読めるようにはしておこうね、という話でした。レビューする時も「こういう理由だからダメ」って言えるし。