Serene Bach のクラス構造
- 2009.03.29 Sunday
- dev
Serene Bach は CPAN への依存性が比較的薄い構造になっています。
標準モジュールもあまり利用していなくて、例えば、CGI.pm も使っていません。
これはポリシーというより惰性に近いものがあります。「CGI.pm ぐらいは使えばいいのに」と私自身も思います。ちなみに Serene Bach で CGI.pm に相当するものは sb::Interface というクラスですが、独自に開発したものではなく、cgi-lib.pl をリファクタリングしたような形になっています。
Serene Bach 2.* (以下、SB2) からオブジェクト指向的なアプローチを取り入れて、Serene Bach 3 (以下、SB3) ではクラス構造を若干見直しました。
Serene Bach 2 のクラス構造
SB2 のクラス構造をツリーとして表すと、以下のようになります。
- sb
- sb::App
- sb::App::Admin
- sb::Admin::Bookmarklet
- sb::Admin::Help
- sb::Admin::List
- sb::Admin::Category
- sb::Admin::Entry
- sb::Admin::Amazon
- sb::Admin::Config
- sb::Admin::Editor
- sb::Admin::Upload
- sb::Admin::User
- sb::Admin::Profile
- sb::Admin::Link
- sb::Admin::Message
- sb::Admin::Status
- sb::Admin::Template
- sb::Admin::Trackback
- sb::Admin::Login
- sb::Admin::Preview
- sb::Admin::Rebuild
- sb::Admin::Refusal
- sb::Ping
- sb::App::Builder
- sb::App::Counter
- sb::App::Feed
- sb::App::Install
- sb::App::Main
- sb::App::Mobile
- sb::App::Rsd
- sb::App::Trackback
- sb::App::Xmlrpc
- sb::Aws
- sb::Receipt
- sb::App::Admin
- sb::Build
- sb::Config [*]
- sb::Content
- [#] sb::Content::Entry
- [#] sb::Content::Message
- [#] sb::Content::Profile
- [#] sb::Content::Trackback
- sb::Data
- sb::Data::Object
- sb::Data::Amazon
- sb::Data::Category
- sb::Data::Entry
- sb::Data::Image
- sb::Data::Link
- sb::Data::Message
- sb::Data::Plugin
- sb::Data::Session
- sb::Data::Template
- sb::Data::Trackback
- sb::Data::User
- sb::Data::Weblog
- sb::Driver [*]
- sb::Driver::Text
- sb::Interface [*]
- sb::Language [*]
- sb::Language::en
- sb::Language::ja
- sb::Lock
- sb::Mailer
- sb::Object
- sb::Plugin [*]
- sb::Session
- sb::TemplateManager
- sb::Text
- sb::Time
[*] がついたクラスは Singleton になっています。
当初、 Singleton という概念を知らずに実装していて、パッケージ毎に定義されたスタティックな変数を使うことによって Singleton を実現しています。
この実装のため、SB2 は mod_perl などプロセスが永続するような環境では正しく動作しません。
[#] がついたクラスは、上位クラスに対して直接的に継承していません。しかしながら、強く依存しているため、ツリー上に表記しています。
Serene Bach 3 のクラス構造
SB3 のクラス構造をツリーとして表すと、以下のようになります。
- sb::Object
- sb::SingleObject
- sb
- sb::Config
- sb::FastCGI
- sb::Language
- sb::RequestObject
- sb::Content::Feed
- sb::Content::Mobile
- sb::Interface
- sb::Local
- sb::Local::jp
- sb::Local::nz
- sb::Plugin
- sb::App
- sb::Admin::Editor
- sb::Admin::TemplateEditor
- sb::App::Admin
- sb::Admin::Help
- sb::Admin::List
- sb::Admin::CommentOption
- sb::Admin::Message
- sb::Admin::Trackback
- sb::Admin::Entry
- sb::Admin::Amazon
- sb::Admin::Category
- sb::Admin::Home
- sb::Admin::Quickpost
- sb::Admin::Upload
- sb::Admin::EntryList
- sb::Admin::Link
- sb::Admin::Template
- sb::Admin::User
- sb::Admin::Profile
- sb::Admin::CommentOption
- sb::Admin::Login
- sb::Admin::Preview
- sb::App::Builder
- sb::App::Counter
- sb::App::Feed
- sb::App::Install
- sb::App::Main
- sb::App::Receipt
- sb::App::Rsd
- sb::App::Upgrade
- sb::App::Xmlrpc
- sb::Admin::Editor
- sb::Build
- sb::Content
- [#] sb::Content::Cetgory
- [#] sb::Content::Common
- [#] sb::Content::Entry
- [#] sb::Content::List
- [#] sb::Content::Message
- [#] sb::Content::Profile
- [#] sb::Content::Trackback
- sb::Data
- sb::Data::Object
- sb::Data::Amazon
- sb::Data::Category
- sb::Data::Config
- sb::Data::Customdata
- sb::Data::Entry
- sb::Data::Image
- sb::Data::Link
- sb::Data::Message
- sb::Data::Plugin
- sb::Data::Session
- sb::Data::Template
- sb::Data::Trackback
- sb::Data::User
- sb::Data::Weblog
- sb::Driver
- sb::Driver::SqlBasea
- sb::Driver::Mysql
- sb::Driver::Sqlite
- sb::Driver::Text
- sb::Driver::TextOld
- sb::Driver::SqlBasea
- sb::File
- sb::File::Audio
- sb::File::Object [%]
- sb::File::Dir
- sb::File::Object [%]
- sb::File::Image
- sb::File::Object [%]
- sb::File::Uploader
- sb::File::Audio
- sb::File::Audio::Info
- sb::InitParser
- sb::LanguageBase
- sb::Language::en
- sb::Language::ja
- sb::Net
- sb::Net::Aws
- sb::Net::Mailer
- sb::Net::Ping
- sb::Session
- sb::Test
- sb::Text
- sb::Time
- sb::SingleObject
- sb::Template
- sb::Utils
- sb::File::MimeType
- sb::Text::Base
- sb::Text::autobreak
- sb::Text::autolink
- sb::Text::md5
- sb::Text::autobreak
SB3 では、ほとんどのクラスが sb::Object という基底クラスを継承するような構造になっています。
sb/Object.pm には Singleton を扱う sb::SingleObject / sb::RequestObject というクラスも含まれています。
SB3 では、これらのクラスを継承したクラスは Singleton として扱われます。これらのクラスは mod_perl / FCGI 環境下での動作も想定しています。
SingleObject と RequestObject では永続性が異なります。通常の CGI として動作させた場合には、両者の違いはありません。実は SB2 にもひっそりと sb::Object を移植しているのですが、現時点では利用されていません。
基本的に多重継承はしない構成にしていますが、例外的に [%] をつけた sb::File::Obect だけは多重継承をしています。あまり良い構成とは言えないので、今後 sb::File のクラス構成は変更するかもしれません。
スポンサーリンク