ObjectSquare [1999 年 7 月号]

[Happy Squeaking!!]


7. Squeak演習:Observerパターン

7.1  Dependencyメカニズム


パターンは、それが扱う問題のスケールや種類によっていくつかに分類することができます。

Smalltalkの世界では、Observerがパターンとして認識されるよりもはるか昔から、Observerの仕組みを実現していました。
1983年の"Smalltalk-80: The Language and Its Implementation"においてオブジェクト間の3種類の関係として以下のような定義がされています。

  1. インスタンス間の関係(インスタンス変数による通常の参照)
  2. クラス間の関係(クラスからスーパークラス、クラスからメタクラスへの関係)
  3. dependency(依存)関係(他のオブジェクトに自らを依存物として登録する関係)

3番目の関係がまさにObserverがSubjectを監視する関係を表しています。
異なるオブジェクト間での協調動作をスマートに行うやり方としてdependencyは考え出されたのです。
dependencyは主にMVCフレームワークにおいて、MからVに対して間接的に変更通知を行う際に使われていますが、適用範囲はなにもMVCに限る必要はありません。
dependencyメカニズムの基本実装は、Objectクラスで定義されています。これは、全てのオブジェクトが、ObserverにもSubjectにもなれるということを示しています。(Modelクラスでは、より効率的な実装としてdependencyメカニズムを提供しています)。

SmallTip: Smalltalkでは、Observerパターンの実装としてdependencyメカニズムが提供されている

ここでは基本的なObserverの実装として、MVCとは独立させて、dependencyの仕組みを試してみることにしましょう。

まずはObjectクラスをブラウズしてみます。


Objectクラスの"dependents access"メッセージカテゴリのブラウズ

まず、ObjectをSubjectとして考えましょう。
SubjectはObserverを登録、削除できなければなりません。
従って、メッセージカテゴリ "dependents access"には、Dependent(Observer)の登録、削除に関する操作が格納されています。(addDepentdent: 、removeDependent: など)

また、Subjectは、自分の状態変更を通知できる必要があります。
メッセージカテゴリ updatingには、通知用のメソッド changed:を見ることができます。

(Object >> updatingカテゴリ)

changed: aParameter 
        "…コメントは省略..."
        self dependents do: [:aDependent | aDependent update: aParameter]

依存物リスト(dependents)に登録された全てのDependent(Observer)に対してupdate: のメッセージを送るように実装されています。

次にObjectをObserverとして考えましょう。
Observerは、Subjectの変更通知を受け取る操作を持っていなければなりません。これが、changed内で送られていたupdate:になります。


Objectクラスの"updating"メッセージカテゴリのブラウズ

デフォルトではupdate:の中身は空になっています。Dependent(Observer)は、update: をオーバイライドして、適切な処理を実行します。

更新受け取り操作のupdate: は引数をとります。引数は何でもいいのですが、通常は、Subjectのどの属性が変化したのかを示す情報を渡します.
(Smalltalkの世界ではこれをAspect-側面と呼びます)。

SmallTip: 変更通知はchanged:メッセージを自身に送る
SmallTip: 変更の受け取りはupdate:メッセージ

© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next