SimpleBoxes

Serene Bach のクラス構造

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::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::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::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::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::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::Template
  • sb::Utils
  • sb::File::MimeType
  • sb::Text::Base
    • sb::Text::autobreak
      • sb::Text::autolink
    • sb::Text::md5

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 のクラス構成は変更するかもしれません。

関連記事

スポンサーリンク

<< 元喫煙者より :: ちょいメモ 2009.03.30 >>