FizzBuzzのワンライナーは美しくない

Posted on Friday, April 17th, 2015 18:54:47

「FizzBuzz 書かせたらワンライナーで帰ってきた、技術力たけー!」って話を聞いて、違和感を感じたので書きます。

ワンライナーの目的

私は技術力もないし、LL を使いだして1ヶ月も経っていないのですが、ワンライナーの目的は理解できます(少なくとも、できているつもり)。ソースファイルを落とさずに済むことです。エディターを起動しなくてもコマンドライン上から実行できる、エイリアスで完結する、といった便利さがあります。

しかし、FizzBuzz は違うだろうと。他者に評価させるためのコードをワンライナーで完結させるなんて、全くもって美しくない。

何が美しくないのか?

コードが美しくない

ざっくりと良いコードの条件を挙げるとすれば、可読性と実行速度でしょう。現実問題、これらはトレードオフになることが多く、読みにくくても早ければ優秀だと言えるし、多少遅くても読みやすく触りやすければ優秀だと言えるでしょう。

FizzBuzz のワンライナーは、残念ながら両方満たしていません。改行があろうとなかろうと、生成されるオブジェクトコードの実行速度は変わりません。実行速度が変わらないのであれば、他者が最短時間で理解できるコードが良いコードです。

仮に評価する人が、その言語に習熟した人であれ、制御構造が直観的に表現されているコードの方が理解しやすいでしょう。実行してエラーが出たときに、ワンライナーのコードを解析するのと、ワンライナーでないコードを解析するのと、どちらが手早く済むかを考えれば、どちらが良いコードかは自明です。

思想が美しくない

何故プログラミング言語の開発者たちは、ワンライナーを書くためのコマンドラインオプションを準備したのでしょうか。なぜ Ruby に Perl のコマンドラインオプションを取り入れたのでしょうか。

ワンライナーを日常的に利用している人ならば、理解しているはずです。ワンライナーを書いたことがない私ですら想像できるのですから。冒頭の繰り返しになりますが、ソースファイルを落とさずに済ませるためですよね。その目的以外でワンライナーを書くのは、プログラミング言語の思想に反しています。

プログラミング言語の持つパワーは、適材適所で発揮させるべきです。プラスドライバーとマイナスドライバーが手元にあって、目の前でプラス溝のねじが緩んでいたら、プラスドライバーを使うはずです。「俺、マイナスドライバーでもプラス溝締められるから!」と言いながら、わざわざマイナスドライバーを使う人を見たら、普通は滑稽に思うものです。

FizzBuzz をワンライナーで書く理由

ワンライナーには、その LL が1処理を完結させるために、どれだけ少ない記述で済ませられるのかを誇示することができます。その言語を知らない人に、「この言語すげーんだぜ!」と紹介するために FizzBuzz を書いてみせるのは、悪くありません。ほら、Ruby すげーんだぜ!

自分がギークなことをアピールするために、「俺、こんな書き方もできるんだぜ!」と、あえてトリッキーなコードを書くのも面白いでしょう。俺、論理演算子の短絡評価理解してるんだぜ!

わざわざ書きませんが、短さを追求するのであれば、トークンをつめたり、’Fizz’ を :Fizz とシンボルで書いたり、他にもギークなやり方があるのでしょう。それはそれで面白いと思います。上記のコードで初めてワンライナー書いたけど、ちょっと面白かったし。

しかし、そういった目的でないのであれば、見やすく早く触りやすいコードを、プログラミング言語の機能を適切に利用した形で、プログラミングするのが、優秀なハッカーです。僕はそう思います(鉞回避対策)。ではでは。

Share

  • このエントリーをはてなブックマークに追加
  • Pocket
  • 0 follow us in feedly

Your Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です