ykzts.com

CoffeeScriptのfunction式において明示的なreturn文を記述するべきであるか否か

著者: 山岸和利
更新: 編集履歴

という両者相反する内容の記事がございました。両論もっともな内容であり、また実行速度だけではなく思想も絡んでしまう非常に煩わしい問題であります。

はじめに筆者の立場を明確にしておきます。筆者は日本国内で働くウェブアプリケーション開発者です。主にウェブアプリケーションフレームワークとしてRuby on Railsを使用しており、それによりCoffeeScriptも日常的に使用し、そして記述しております。

筆者にとってのJavaScriptという言語は、プログラミングというものを深く学ばんと思わせる契機となった言語であり、深い愛着ととともにわずかながらも執着のようなものを抱いております。そのためJavaScriptを直接書かないために生まれたとも言える言語であるCoffeeScriptに対しては、いささか好ましかざる念を抱いております。よってこの記事は不平等な視点によって書かれているという点をあらかじめ認識していただきたく思います。

さて、多くの人は既にご存知のことかと思われますが、CoffeeScriptという言語はRubyやPythonといった言語に強い影響を受けた言語であります。このことは言語の記述による見た目からの類推だけではなく、CoffeeScriptの配布ページに出現する「Ruby Style」や「from Python」といった記載から容易に推察できるのではないでしょうか。前述した両記事の主題となっているfunction式内部で最後に評価され得る値を該当function式を実行した際に返す値とするCoffeScriptの仕様も、Rubyのメソッド定義が持つ同様の仕様から影響を受けたのです。

Rubyはメソッド定義に関するこの仕様は言語としての仕様としてあらかじめ用意されているものであるために、使用者はそこまで強い意識をする必要はありません。ですがCoffeeScriptは違います。CoffeeScriptはJavaScriptに変換されることを前提とした言語となってあるため、この仕様はあくまで最後に評価されるのではないかとCoffeeScriptの言語処理系によって判断される値が返されることとなります。このことは通常の使用で問題となることは少ないのですが、稀にではありますが問題となって身に振りかかることとなります。明示的なreturn文の記述を行うべきであるという内容の一つ目の記事もそうした稀な現象の一つになります。

稀な事象を気にかける必要は薄いとはいえ、複数人でのアプリケーション開発に際しては不測の事態となり、開発速度の遅延を招きかねないのではないでしょうか。よって自身一人による制御が困難である場合には明示的な値の返却が行われるようにreturn文を用いるようにしたほうが無難です。

蛇足ではありますがArrayオブジェクトのインスタンスの持つ組み込みメソッドであるpushcoffeeコマンドが通常使用するJavaScript言語処理系であるv8では確かに充分な速度での動作がなされます。ですが、IE 6からIE 8のような古いウェブブラウザーではそこまでの速度は期待できません。安易な回避が可能であるのならば、同様の記述を繰り返すこととなり、まことに恐縮ではありますが、避けておいたほうが無難です。

多くの人が使用しているのではないかと思われるjQueryも仕様としてfunction式がundefinedと返却されることを前提とした記述があります。自身が記述することとなる部分だけではなく、JavaScriptライブラリー (やフレームワーク) のことを全て考えるとなると煩わしさは膨大なものとなります。JavaScriptとRubyが違う言語であると正しく認識した上でCoffeeScriptを使用することが肝要なのではないでしょうか。

筆者自身の個人的な意見を最後に記載しますと、やはりCoffeeScriptを初めとするJavaScriptへと変換されることを前提とした言語を使うのではなく、始めからJavaScriptをそのままに書くことのほうが最良であると強く信じております。

しかしながらJavaScriptというこの言語は、非常に癖の強い言語であり、複数人によって一つのソースコードを記述する場合には、明確なコーディング規約をアプリケーション開発を開始する以前から定めておかなければ、早晩崩壊を迎えることとなります。一方のCoffeeScriptは言語仕様から、そうしたJavaScriptの癖と呼べるようなものを極端に排除しており、また自由な記述ができる余地も減じさせられております。その結果として複数人によるアプリケーション開発に際しても、ある程度の統一性が生まれます。途中参入者も手間が少なく参加できるというのはCoffeeScriptの大きな強みであると言えるのではないでしょうか。

とはいえ、筆者がCoffeeScriptを好きな言語であると言える日が来ることは間違いなくありませんが。

関連記事

数年前ならいざ知らず、現代のJavaScriptは充分に高速な動作が実現されている。無論C言語で記載されたいわゆるネイティブアプリケーションと比較すれば計算速度等では大きく劣ってしまう。だがしかし複雑な計算等を必要としない通常範囲のアプリケーションであればJavaScript (とHTMLとCSS) で記述がなされたアプリケーションの実行速度はネイティブアプリケーションと遜色ないものになると半ば強い確信を抱いている。ではJavaScriptで記述がなされているアプリケーションの動作が緩慢であるという認識がなぜ多くの場でなされているのか。それは単純な理由である、そのアプリケーションの作者が知識不足でDOM操作が冗長的なものとなっており無駄が多くなってしまっているからだ。

モダンな言語でHTML5を開発しよう! 俯瞰して理解するaltJSの比較 (前編 - TypeScript, CoffeeScript, Hexe) と題する記事があった。この記事は見出し中にある「HTML5を開発しよう」という言葉からして意味が通っていない。だが記事の内容から「HTML 5を始めとし、CSSやJavaScriptといったウェブ関連の技術を用いたアプリケーション作りをしよう」という意図であろうと類推することができる。しかしこの記事で問題なのはそのような重箱の隅を突くが如き枝葉末節な部分ではない。この記事の中で薦められているいわゆるaltJSと称される複数の言語たちではない、JavaScriptという言語はモダンな言語ではない、つまり近代的な言語ではないと断言してしまっていることである。 > ここ数年のHTML5やCSS3の劇的な進化に比べて、JavaScriptの言語としての進化は緩やかだったのではないでしょうか。HTML5の登場により、リッチなウェブサイト・コンテンツ・アプリケーションが求められる時代になったのに、それを制御する言語が未だレガシーなものであり、ニーズに追いついていないのが現状です。 先に引用した一文は前述した記事の第一段落に記された内容である。この短い一文の中に、事実誤認から来ているのであろう誤りが複数含まれてしまっている。このような記事は非常に度し難く、そして許すことができない。

はてなブックマークの人気エントリーをながめていたところJavaScriptでアニメーションを書く初歩の初歩のような記事が目にはいりました。初歩であればこそ、この記事で省かれているrequestAnimationFrameの話をするべきではないのかとも思いますが、それよりもわたしは元の記事に掲載されているコードがJavaScriptを用いて十ミリ秒の間隔を開けて複数の処理を何度もウェブブラウザーにさせてしまっていることが気になりました。また、いくつかの処理を完了させてから、setTimeoutを用いて任意の時間が経過するのを待ち、同様の処理を行うというかたちになっていますので、処理に時間がかかってしまえば、なめらかな描写は到底実現されないものとなってしまっています。