2010年6月12日土曜日

img0chの内部実装、コード規約と中心部編

しばらくあいてしまいましたが、img0chの内部について。今回はソースコードの暗黙的な規約と、img0chの中心となるImg0ch::Mapleを見ていこうかと思います。

perltidyとハンガリアン

img0chのソースコードは外部モジュールを除いて全てperltidyと呼ばれるコードフォーマッタを使って書き方を強制しています。ファイル数が大変多いので、tidy.plというスクリプトを使って半自動化しています。一回の実行で数分と結構時間がかかります。コードスタイルはPBP(Perl Best Practice)です。

そしてソースコードを見るとこんな書き方が見られます。
my ( $iClass, $iConfig ) = @_;
これはimg0ch独自の以下の暗黙のルールに基づいて書いていることによります。ややハンガリアン的です。
  • クラスメソッドの場合は第一引数に$iClass(Img0chの場合)か$zClass(Zerominの場合)とつける
  • Img0chで始まるパッケージ名のクラスは$iとつけて、次の文字は必ず大文字にする
  • Zerominで始まるパッケージ名のクラスは$zとつけて、次の文字は必ず大文字にする
これらのルールによってどのパッケージのクラスかわかるようになっています。Zeromin::BBSはImg0ch::BBSを継承するなど、Img0ch以下のクラスをZerominのクラスが継承するケースが多いので、$zBBSであればZeromin::BBS、$iBBSであればImg0ch::BBSのクラスであることが変数名から分かります。

全ての基底クラスImg0ch::Maple

元々はImg0ch::Kernelとつけるはずだったクラス名ですが(エイリアスとしてImg0ch::Kernelを使っています)、開発時のプロジェクト名がそのままついている唯一の例外です。

このクラスは以下の事柄を行います。いずれも他のクラスでは多用する機能のため、ほぼ全てのクラスが利用可能であるImg0ch::Mapleに集約しています。
  • レポジトリの管理
  • モジュールの読み込み
  • 文字コードの変換
  • I18N(国際化)
  • ファイルハンドルの取得
  • 例外の作成
  • HTMLエスケープ処理及び数値化のユーティリティ

レポジトリ

レポジトリ管理はImg0ch::Maple以下にレポジトリ管理用のストレージエンジンとなるクラスが有ります。あまりないと思いますが、新しいストレージエンジンを実装するならImg0ch::Maple::Simpleを見るとどう実装すればいいか分かります。

フォーマットとして以下のようになっています。単純なキーバリュー形式です。
I:P:E.66.type=bbs.rewrite
I:P:E.39.type=mobile.rewrite
I:P.type.bbs.upload.pre=26,37
実装上個別のファイルで保存し、かつイテレータがあるため、memcacheのような集中型のKVSを使ったレポジトリのストレージエンジンはありません。

本当はインターフェースがあればよかったのですが、Perl5は言語的にサポートしていないため、単体テストでカバーしています。

0 件のコメント:

コメントを投稿