Moose & Mouseの私家版クイックリファレンスシート(チートシート)を作ってみました。
PDF版とODT版の両方を置いておきます。
- Moose & Mouse QUICK REFERENCE (PDF)
- Moose & Mouse QUICK REFERENCE (ODT: OpenDocument Text for OpenOffice.org Writer)

OpenOffice.orgは無料で入手出来ますので、オレオレチートシートの元ネタとしてもお使いいただけるかも知れません。
そもそもMooseにはOliver GorwitsさんによるMoose Quick-Ref Cardというチートシートが昔からあります。これは奥深いMooseの世界が端的にまとめられた素晴らしいものです。ただ、幾つかオレオレ仕様にしたい点がありました。
そんな日々を送っていると、『Web制作の現場で使うjQueryデザイン入門』の付録にフルカラーのjQueryチートシートが付いていることを知りました。これに触発されて作り始めたという経緯があります。
当初はこの2倍くらいの量があったのですが、だったら流行りの「基本文法最速マスター」に悪のりしてしまおうとしたのが「Moose & Mouse基本文法最速マスター/The Fastest Way to Mastering Moose & Mouse」という副産物です。
ところで、上述のjQuery本はプログラマー向けというよりは意匠デザイナー向けの本であるので、カラフルなチートシートで間口を広く取るのは大正解だと思います。一方、今回作ったMoose & Mouseチートシートは白黒灰の3色かつ無味乾燥な作りになっているので、初学者向けのチートシートにはなっていません。カラフルでA4両面くらに日本語の説明文をふんだんに盛り込んだ初学者向けのシートも併せて作りたかったのですが、意匠センスが決定的に不足しているので断念しました。
Moose/Mouseの素敵なプログラミングを体験する人が増えることを期待していますので、ナウなヤングにバカウケなイけてるシートを公開してくださる偉い人の登場を心待ちにしています。
とはいえ今回のシートも多少は物を考えて書いたつもりです。苦心した点を以下に簡単にまとめておきます。
カカオ増量、砂糖減量
クイックリファレンスというのは、「読む」ものではなく「見る」ものだと考えています。従って、自然言語、つまり英語(や日本語)の説明文を極力省くことで、必要なコードスニペットだけが目に飛び込んでくるようになります。
私はクイックリファレンスをそれ自体で単独で完結させようとはせず、Mooseの基本的な構文を「最速マスター」の水準で理解できていることを前提として記述しました。
いくつかの例を元にもう少し詳しく説明します。
自明な箇所の解説は除いた
端的な例はextends @superclassesです。
見ての通りsuperclassesをextendするので、class inherits superclassesなどという説明文は不要ですね。自明な処理はコメントしないという鉄則を守らないと、コードを逐行で日本語訳して立派な「クラス仕様書」をこしらえるどこかの会社の轍を踏んでしまいます。
Moose Quick-Ref Cardでもあまりにも自明な解説文は省いていますが、しかしどちらかというと親切な記述になっているようにお見受けしました。多少間口を狭くした方がかえって利便性が増す可能性があるのではないだろうか、と思います。
コードで書けるものは極力コードで書く
他にも、Moose Quick-Ref Cardではメソッドモディファイヤーのコードリファレンスに渡ってくる引数について
aroundis passed($next_method, $self, @args).
と書かれていますが、これは以下のようにコードだけで書くこともできます。
around @methods => sub {
my ($next, $self, @args) = @_; ...
};
ついでにmy @return_values = $self->$next(@args); ...という記述も追加して、override/super()との違いが分かるようにもしました。
元々甘いMoose
いかにもそれっぽい理由付けを書きましたが、こうでもしないと内容をA4へ収めきれないという切実な問題が一番の理由だったりします。
ただし、Mooseのシュガー関数はそれ自体が「甘い」ので、さらなる砂糖を振り掛けなくても美味しくいただけるということが分かります。宣言的プログラミングが病み付きになる所以ですね。
痒いところに孫の手を
Any::Moose対応
クラスやロールのスケルトンなどでAny::Mooseを使った書き方にしています。
Any::Mooseの仕様が分かっていれば、シートに相当してMoose, Moose::Role, MooseX::Typesを生でuseする記述も書けると思います。というか、流石にuse Moose;することを知らないとMooseクラスは書けないと思います。
MooseX::Types前提
Moose::Util::TypeConstraintsではなくMooseX::Typesを使うことを前提にしています。
My::App::Types以下の名前空間に勝手に入ってくれたりするので、あれやこれや気を遣ったり、注意を促す文言を書くよりは、すっぱりMooseX::Typesを使った方が楽だと思ったからです。
勿論Any::Mooseに対応した書き方をしています。
ネイティブトレートのヘルパーメソッドを網羅
私家版チートシート作成の動機は、ひとえに名前空間が深いMoose::Meta::Attribute::Native::Trait::Arrayなどをperldocすると疲れることでした。
ということで、4段組のうちまるまる1段を使ってヘルパーメソッドの一覧を羅列しました。
absがアトリビュートの値を汚すこと(汚さないなら単にabs $obj->attr)sortがアトリビュートの値を汚さないこと(汚すならsort_in_place)
などという点で引っ掛かりそうだったので、相当する素のPerl構文も併記しています。
MooseX::*拡張モジュールに言及
モジュールの名前を羅列するだけでなく、空間が余ったので使い方をごく簡単に書きました。
use MooseX::Clone;なのかwith qw(MooseX::Clone);なのかと、拡張モジュールの呼び方をすぐ忘れてしまうからです。
そのモジュールで書けるようになる構文も、ほんの触りだけ記述しています。
hasオプションをカテゴライズしつつオレオレソート
これは「最速マスター」の意図としてもご紹介しましたが、hasのオプションをベタに羅列するのではなく、或る程度関連性のある内容を小分けにしています。
hakobe932さんによるKansai.pm #9でのMoose入門の発表「初めてのMoose」などでもネタにされるように、hasのオプションはかなり多いです。情報を鉄砲水のように浴びせられると心が折れてしまいかねないので、多少は考慮しました。
また、これは完全にオレオレルールなのですが、Mooseアトリビュートのオプション指定順についての私案の順番の通りに並べています。自分であんな記事を書いておきながら、まだ順番を手で覚えるまでには至っていないため、自分のためのアンチョコとして記述しています。
判型と組版
Moose Quick-Ref CardはA4縦で、上下方向に2つ折りにしてA5横両面で使うことを想定した組版となっています。私家版では以下のような点を考慮して変更しています。
A4横1片面1枚に収めた
キーボードの手前に空いているスペースはA4横の縦辺だったという理由ですが、「jQuery Cheat Sheet」など、色々なチートシートを見てもA4横が多かったので、この寸法を採用しました。
4段組にした
私は「机の天板に透明シートを敷いて、その下に資料を挟み込む」ということをしていません。トナーが裏移りするだとか、梅雨時にべたつきかねないだとかの理由によります。
従って、クリアファイルやアクリルケースに入れて使うことを想定していますが、場合によっては2つ折りや4つ折りで使うことも考えられます。さっと手にとって目を通せるという意味では、卒業式の答辞で手に持つような縦長の張扇型の方が好ましかったりするからです。
具体的にはオライリー刊『UMLデスクトップリファレンス』(A5変判)などのデスクトップリファレンスシリーズなどを想定しています。
日本IBM刊『エンタープライズ・システム体系/370便覧』(N:GX20-0406-00)という旧世紀の遺物を例示しようとしましたが、同僚以外に分かってもらえそうにありません。EBCDICのページだけコピーしてチートシートにしたことはいい思い出です......。
ということで、折っても見られるような均等4段組で割り付けることにしました。電車の中での読み易さなどを考慮してか、最近では毎日に続いて読売や朝日も偶数段で組版していますね。
などと書いてから実際に4つ折りにしてみると、左右のマージンの考慮が漏れていて、折り目を跨いでしまっていることが判明しました。機会があれば直しておきます......。
関係性を目で追えるようにした
ネタは以下のように割り付けています。
- 基本的な内容
- (題名)
- CLASSES
- ROLES
- METHOD MODIFIERS
- CONSTRUCTION AND DESTRUCTION
hasのオプション- ATTRIBUTE CONSTRUCTION OPTIONS
- 型と、場所が余ったので
MooseX::*- TYPE CONSTRAINTS & COERCIONS
- MooseX::* EXPANSION MODULES
- ネイティブトレートのヘルパーメソッド
- HELPER METHODS FROM NATIVE TRAITS
この構成は以下のようなシナリオを想定して意図しています。
- 1段目にあるクラスやロールのスケルトンで
hasがあり、hasのオプションが見たくなる。cf. ATTRIBUTE CONSTRUCTION OPTIONSとして飛び先を指示されるが、それはすぐ右の第2段にあるので、目で自然に追える。 - 2段目の
isaでcf. TYPE CONSTRAINTS AND COERCIONSとして飛び先を指示されるが、それはすぐ右の第3段にあるので、目で自然に追える。
ただ、流石にネイティブトレートは無理でした。それだけで第4段を占拠してしまっているので、handlesに関連する内容として飛ばそうと思っても、第3段の型とは相乗り出来ないためです。
コメントする