Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

enchant.jsはモジュール化するといいと思う

enchant.jsをもっと簡単に使えるようにしようという話が大変興味深かったので、1ユーザとして思うところを。
なお私は業務ではenchant.jsを使わないし、プライベートでもここ数カ月ほぼ触っていないので、最近の変更はあまり追えていないかもしれないです。あと書き終えて気づきましたが「より簡単に使うための展望」というよりは「それなりの規模のJSフレームワークに求めること」という感じになっています。

プラグイン機構の現状と課題

enchant.jsの「プラグイン実装」は「サブクラス実装」とほぼ同義です。クラスを継承して、各メソッドで継承元のメソッドを読んで、それから自分のやりたいことを書く。この方法だと各プラグインがスーパークラスの変更に追随しなければならないし、特にスーパークラスのちょっとした挙動を(追加ではなく)変更したいというときにコピペが発生します。
自分の例では、util.enchant.jsのMutableText.setTextに中寄せを追加したときにコピペが発生しました。このためMutableText.setTextにバグフィクスが入ってもプラグインには反映されません。

まぁ実際このやり方で困るかというと、現状困らないのですよね。OSSだしコピペでわりと問題ないし、拡張元をオレオレ改造してしまうということも十分に可能です。ただforkが乱発するということはそれだけenchant.js自体へのフィードバックが鈍くなって、OSSとしての恩恵が比較的享受しにくい構造になっているんじゃないかと思っています。

各標準クラスにtemplate methodなりstrategyなりを導入して上書きの必要性を最小限に抑えるというのが最も簡単な解ですが、これは各クラスの努力であってフレームワークとしての努力は他にありそうな気がします(アイデアなし)。機能追加はイベントリスナなり継承元メソッド呼び出しなりで簡単に実装できるんですけどね。他のフレームワークではどういった解決がされているんでしょうか。

モジュール化による可読化の向上と単体テストの簡易化

早い話がrequire.js導入すればいいんじゃないかという。はい、多分に自分の趣味が入ってます。でも可読性向上とテスト可能性の向上はけっこう大きなメリットだと思います。

まず可読性ですが、今のenchant.jsを読みやすいと思う人は限定的ではないかと思います。JavaScript4,121行ですよ。それなりに苦労したrequire.jsのほぼ2倍。各プラットフォーム対応がちょこちょこと入っているのも複雑さを増しています。
もちろんCoffeeScriptなり(詳しくないけど)Haxeなりを導入してしまえばより短い行数で同等の機能を導入できると思いますが、そうするとコントリビュートのハードルが上がるので教育用プロダクトとしては採用しにくいと思うんですよね。ので、折衷案のひとつとしてモジュール化。これなら単なる変数代入なのでわかりやすい。イベントの管理、アセットのロード、シーンの管理……という粒度でモジュール化を施し、リリース時にはr.jsでひとまとめに。リリース時にはrequire.jsへの依存も必要ないです。


次にテスト可能性ですが……正直今のenchant.jsがどうテストされているのかよくわかっていません。READMEにはPCからタブレット、スマートフォンまで様々な環境が載っていますが、これらでの動作をどう保証しているんでしょう。
たぶんenchant.jsを利用した他プロジェクトのテストをもって間接的に保証しているんだろうと推測してはいるのですが……。仮にそうだとすると、そのプロジェクトの寿命がテストの寿命になり、enchant.jsを使うようなモバイルゲーム系プロジェクトがそんなに長生きするとは思えない*1のでなんか大変そうだなという。
外部プロジェクトのテストなりコミュニティからのフィードバックなりはもちろん期待していいのですが、フレームワークとしての品質保証・品質定義の手段も持ってるべきなんじゃないかと。そしてそのためにモジュール化はかなり有効な手段だと思います。パーツ単位での品質調査が可能になりますし、また各コンポーネント間の依存関係もすっきりできます。ブログを拝見する限りではハードウェアの用意は問題無さそうなので、モジュール化さえ終わればQUnitなりJasminなりを使って割と簡単に達成できそうです。


とりあえず以上2点が簡単に使うために有効な改善点かと思います。プログラム初心者に対する簡単さとはかなり遠いですが、ちょっと踏み込んで使いたいひと・仕事で使いたい人の心理障壁を下げて簡単に使えるようにする話にはなるかと思います。できれば(デバッグだけではなく)テストを支援する機能もあると人に薦めやすいのですが、自分であまりいい実装例が思いつかないんですよね……。

追記

version 0.5.1でモジュール化されました。テストケースも整理されて素晴らしいです。ぐっと人に勧めやすくなりました。

*1:私の本業がパッケージ開発なので、それに比べて、という意味