高卒文系Scala vol.17 - if式と三項演算子モデルの是非 -

Scala本の7章は制御構造について、です。7.1は、「if式」。

「式」ってのが重要で、「if文」とは違って必ず値を返します。

「第2回名古屋Scala勉強会にいってきた」 でも書きましたが、

elseを記述しなかった場合、条件式の評価結果に限らず無効値が返される事に注意。

println(if (true) "Hello!")
println(if (true) "Hello!" else "Bye!")
()
Hello!

Javaで多用される「if文」よりも、あまり使われないであろう三項演算子に似ていますが、

「if文」っぽくも使えます。

下記はどちらも同じ結果になりますが、「どちらが読みやすいか」は議論が分かれそうです。

この議論は、そのまま「三項演算子を使ってよいか」という議論と同等だと考えられます。

if文モデルで書いた場合
if (true) {
  println("zetta")
} else {
  println("1985")
}
三項演算子モデルで書いた場合
val msg = if (true) "zetta" else "1985"
println(msg)

「三項演算子を全く使わない」という意見をよく聞くのですが、僕は、「三項演算子」肯定派です。

よく「三項演算子は読みにくい」とか「ソースが修正しにくくなる」などと批判されますが、 これについては異議があります。

何故かというと、三項演算子を使ったコードで「修正しにくくなる」ケースを考えた場合、 それはソースコードの修正に留まらず、設計レベルでの修正が必要だと思うからです。

「if文」を使っていた場合に、設計レベルでの修正をせず、安易にソースコードの修正のみに留めてしまった場合、 その「if」を使っている「スコープの意図」が崩れ、スパゲッティコードへ一歩近づくのではないか、と。

そういう意図から、「三項演算子」は「スコープの意図」を読み手に伝える手段に成り得るのではないか、と思います。

一方、三項演算子を使ったコードを簡潔に書こうとすると、メソッドの抽出を強いられる、という理由もあります。 結果、自然とスコープの意図が分離されて、より読みやすいコードになります。 「ただの条件式や計算式が名前を持つ」という事は、可読性向上に繋がります。

以上の事から、「三項演算子を全く使わない」などと三項演算子のメリットをばっさり切り捨てるよりも、 「ifと三項演算子を適切に使い分ける」という双方のメリットを活かす方が建設的だと考えています。

・・・Scalaとは全く関係なくなってしまいました。

Scalaは、Javaの「if文」・「?:演算子」のように別れているわけではなく、 「if式」一つで双方の書き方ができるので「三項演算子(モデル)を全く使わない」規約はできにくいのでは、 と思いました。

実プロジェクトでのScalaのコード規約がどうなるか、興味があります。

このエントリーをはてなブックマークに追加
comments powered by Disqus