perltidyとハンガリアン
img0chのソースコードは外部モジュールを除いて全てperltidyと呼ばれるコードフォーマッタを使って書き方を強制しています。ファイル数が大変多いので、tidy.plというスクリプトを使って半自動化しています。一回の実行で数分と結構時間がかかります。コードスタイルはPBP(Perl Best Practice)です。そしてソースコードを見るとこんな書き方が見られます。
my ( $iClass, $iConfig ) = @_;これはimg0ch独自の以下の暗黙のルールに基づいて書いていることによります。ややハンガリアン的です。
- クラスメソッドの場合は第一引数に$iClass(Img0chの場合)か$zClass(Zerominの場合)とつける
- Img0chで始まるパッケージ名のクラスは$iとつけて、次の文字は必ず大文字にする
- Zerominで始まるパッケージ名のクラスは$zとつけて、次の文字は必ず大文字にする
全ての基底クラス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 件のコメント:
コメントを投稿