ここで作っているWikiシステム(WikiEngineまたはWikiソフトウェアと呼ばれるもの)。
目次 †
関連 †
クラス構造 †
Actor †
リクエスト送信。PageNameとかUsecaseNameとかStepNameとかViewNameとか含む。
→fw/Web→fw/Wiki→Usecase
X †
フレームワーク/WikiEngineの実装。
X/Usecase[?] †
プラグイン。
コントロールクラス。
WikiEngineから呼ばれる。リクエスト毎に別クラス。
MediaWikiの'Action'、PukiWikiの'cmd'にあたるものと一対一対応。
検索:フレームワーク 検索:WikiEngine
WikiEngine周辺のタグ †
ArrayWikiEngineとは †
→User
X/User[?] †
利用者。
ページを扱うクラス。Userが扱うページを特に「利用者ページ」と呼んでおく。権限情報が書かれているので特殊。
データはページ化されているので、このクラスが無くても読み/書きできる。書くのは利用者。
存在意義が薄い。ただ利用者ページにデータアクセスするラッパーでしかない。
- 鍵←UserID
現在作成中のWikiEngineフレームワーク。
→Page
X/Page[?] †
Wikiのデータを保存するもの。
利用者が手作業で書く。どういう記法を使うかでデータアクセス時の反応が違う。
属性を持つ。
URIでプラグインを呼んだときは仮のページ。その場合でも流れは同じ。
キーワード:WikiEngine
キーワード:Wiki OR ウィキ
→ Pages/Name
→ PageElement(記法に書かれると呼ばれる)
利用者から与えられたデータをページ化して保存するもの。
利用者からの要求に応じてページを切ったり貼ったりしてから見せる。
参考 †
- 永続化
- FlyweightFactoryでインスタンス生成
- コンストラクターは非公開
X/Pages/Name[?] †
ページ名。ValueObjectにするのが自然。
Page.rename(new Name(...)) ページ名を変更するときはNameインスタンスを作り直す。 ページ名変更時にやることがあるならrename()でできる。
思い付き †
X/Pages/Property[?] †
ページ/属性。
属性/継承を行なう。
X/Pages/ShadowProperty[?] †
ページ/裏。
X/永続化[?] †
ページ以外も永続化。
データストアにはファイルシステム(flat files)使用。
- Page←PageName
- PageProperty←PageName
- Session←SessionID
X/Element[?] †
ページの構成要素。
記法から生成したオブジェクト。各種記法や一続きのプレーンテキスト部分などが1つのオブジェクトになる。
ElementがElementの集約にもなる。ネスト構造。
→PageElements
X/Elements[?]/… †
PageElementのサブクラス。プラグインはNotations系/Semantics系/DynamicNotations系/Plains系。
X/Elements/Notations[?]系 †
記法を統一する抽象クラス。
X/Elements/DynamicNotations[?]系 †
例えば自動リンク。
記法はあるが決まっていないもの。
X/Elements/Semantics[?]系 †
検索でスコアを上げる記法。
数詞やカラーコードなど。
X/Elements/Plains[?]系 †
ただのテキスト。
X/Plugins/... †
いろいろなプラグイン型。
実装 †
その他のクラス †
URLクエリーに置くデータ †
URLに付けるデータはネット上で共通のもののみ。
個人領域のデータ、状況に左右されるデータは置かない。
URLはどれもパーマリンクにすること。
というわけで、
- 検索/クエリー
…はURLクエリーに含める。
「次」や「前」という表現は使わない †
新/旧、大/小などにする。
ソート順が分かる表現に。
やること †
データ変換 †
テキスト→オブジェクト→HTML
オブジェクト→永続オブジェクト
もしWikiFormatやプラグインをまったく使えないWikiEngineを作ったら…
テキストを記録するだけ。
ファイル名とテキストを与えると記録、ファイル名のみならテキストを出力。
これにプラグイン独自のデータと処理を加えて、プラグインごとに違うHTML出力ができるようにする。
中心はプラグインを作るためのAPI。
アカウント †
利用者
派閥 †
派閥[?]
負荷軽減 †
→負荷[?]
編集後の更新処理を分割。
設計 †
"WikiEngine"というクラスについて。
ウィキエンジンを表すクラス。
名前が決まり次第、クラス名も変更。
- ユースケースをモデルに入れる。
- ログインページの次はHTTP_REFERERにあるページ。
- ファイルはFlyweightであるべき。
- オブジェクトモデル上ではinclude.incのような機能を考慮しない。
include.incのような機能はデータコピーで実現。 - アクセスログはページの属性。
- 利用者はページにある情報を元に作られる。
- ページが他のページインスタンス宛に編集クエリーを作る。
- 検索はプラグイン化する。
名称 †
クラス間のつながり †
検索時、オブジェクト間のつながり †
ページがHTML出力する時、オブジェクト間のつながり †
Decoratorパターン。
ページとプラグイン †
ページもプラグインもDecoratorパターンを構成する。
モデルはページ中心 †
- ページ中心
- MVCのVとCは決まりきっている
Mはページとページに関連するクラス。プラグインにはあるかも知れないし無いかも知れない。
Cはフレームワークと各プラグインにある。
フレームワークが持つVのクラスは1つだけ。それ以外にはプラグインが独自に持つかも知れない。 - 要点はプラグインの拡張性(可能性)
オブジェクトの生成 †
- クラス名とインスタンスの対応はFlyweightFactoryが決める。
コード †
プロトタイピング[?]の実装。
擬似言語 †
[フレームワーク/Webアプリケーションから呼ばれて…]
- セッションデータを受け取る。
- クエリーを処理する。
- HTMLを返す。
Perl †
code*:362
あとはX::Pageの永続化を。
プロトタイプではFlyweightFactoryを実装しない。
X::Pageのインスタンスは1つか2つでいい。