JX |
モデル - ビュー - コントローラーModel-View-Controller |
コードは別々に書かれたとしても、メンテナンスや理解し易く再利用可能なモジュールとなる。 モデル/ビュー/コントローラー[ Model-View-Controller ] は、OOP として結合されるとき、非常に効果的に作用します。モデル/ビュー/コントローラーが、これらを達成するためのパラダイムを提供します。 基本的な考え方として、コードを3つのパーツへ分解します:
他のオブジェクトから Model を引き離すことによって、システムに依存せず、他のプログラムからでも再利用可能である。実際の問題として、View と Controller は、しばしば強く結び付くことがある。それは、ある特定の View は、時としてある特別な操作を行うように設計されるからである。
関数呼び出しよりも、むしろメッセージを使うことによって、 Model と その他のオブジェクトとの本当の意味での分離を達成する。JCore では、JBroadcaster によって扱われる。メッセージは、ある特定のオブジェクトに限らず、Model から、リスニングしている全てのオブジェクトへ伝達される。 Model が"この一部分が変わりました"と言うメッセージを送った時、View がそれを受け取り、 それに従い自身を更新・再描画する。.
メッセージは、又、単一 Model のマルチ View を表示する場合の問題も解決してくれる。直接的なフンクション・コールを行う場合、Model
は全ての View について知っていなければならない。 メッセージについて、全ての
View は JBroadcaster を経由することだけで Model をリスニングする。
JBroadcaster* sender; ListenTo(sender);送り主がメッセージを送信して、レシーバーの Receive() ファンクションが呼び出されれる。このファンクションは、次の様に宣言され使用される:
class MyReceiver : virtual public JBroadcaster
{
protected:
virtual void Receive(JBroadcaster* sender, const Message& message);
private:
MySender* itsSender; // このポインタを得るのは、あなたの使用目的によります
};
void
MyReceiver::Receive
(
JBroadcaster* sender,
const Message& message
)
{
if (sender == itsSender &&
message.Is(MySender::kMyMessage))
{
// 何かの処理を行なうdo something
}
// もし自らのメッセージが不要な場合、
// 基幹(ベース)クラスに渡さなければならない。
}
メッセージはそれ自身がオブジェクトであり、それゆえにレシーバーが使うための、データとファンクションを含むことができる。簡単な例として、ここでは、MyMessage
がどのように宣言されているかを示す:
class MySender : virtual public JBroadcaster
{
public:
static const JCharacter* kMyMessage;
class MyMessage : public JBroadcaster::Message
{
public:
MyMessage()
:
JBroadcaster::Message(kMyMessage)
{ };
};
}
const JCharacter* MySender::kMyMessage = "MySender::MyMessage";
ReceiveGoingAway() は、リスニングしているあるオブジェクトが抹消(delete)されたとき呼ばれる。(コネクションが自動的に終了したのであれば、StopListening() を呼び出す必要はありません。)
匿名 ftp. により JX を使うために必要とされる全ての情報を入手することができます。