![]() |
[1999 年 7 月号] |
[Happy Squeaking!!]
次はCounterモデルを外部から操作するためのコントローラを作成していくことにします。
まず、抽象クラスControllerクラスの定義をみてみましょう。
Controller definition. "print it"
Object subclass: #Controller instanceVariableNames: 'model view sensor lastActivityTime ' classVariableNames: 'MinActivityLapse ' poolDictionaries: '' category: 'Interface-Framework'
となっています。重要なのはmodelとviewとsensorの各属性です。
コントローラはmodelとviewの変数によってモデルとビューの両方を参照できます。("SqueakでのMVC"の図を参照のこと)。Modelへの参照は、コントローラがモデルに更新の動作を起こさせるために必要です。また、viewへの参照はコントローラ側からモデルを経由しないでビューの再表示をさせる場合に使われます。(典型的にはウィンドウのリサイズなどです。この時はモデルそのものとは無関係に表示をドラッグにあわせて変えなければなりません)。
一方sensorは、OSから渡されるイベントを捕らえるために使用されます。全てのコントローラは、イベントをキャッチするためのセンサを持つことになります。センサに問い合わせることによって、今どのような入力イベントが起こっているかを知ることができます。センサからはキーボードに関するイベントや、マウスに関するイベントを取得できます。(どのようなイベントが取得できるかに興味のある方は、InputSensorクラスをブラウズしてみてください。実際にはこのクラスのインスタンスがsensor変数にセットされることになります)。
さて、Modelの場合と同様、このControllerから直にサブクラス化して、Counter用のコントローラを定義したいところですが、ここではもう少し高レベルで扱いやすいStandardSystemControllerから継承することにします。StandardSystemControllerは、Squeakにウィンドウとして表示されるアプリケーションのためのコントローラとしての機能を持っています。MVCで作成されたSqueakのウィンドウはむしろ生のControllerでなく、こちらのStandardSystremControllerの方を使用しています。
ここではStandardSystremControllerの詳しい説明については、省略します。フレームワークを使う側はその細部について全てを知っている必要はありません。各ブラウザ用に実装されているApplet用のClassLoaderや、SecurityManagerの細かな実装を把握していなくともAppletを使ったアプリケーションが作成できるのと同じことです。 |
Counter用のコントローラはできるだけシンプルなものを目指します。ユーザからの入力は、主にキーからのものとマウスからのものが考えられますが、もっとも基本的な、キーからのイベントを受け付けて処理するコントローラにします。u(up)のキーで増加、d(down)のキーで減少という仕様にしましょう。
クラス定義は以下のようになります。
StandardSystemController subclass: #CounterKeyboardController instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'MVC tutorial'
操作としては以下の一つを定義するだけです。
(CounterKeyboardController >> control activityカテゴリ)
controlActivity | key | super controlActivity. key := self sensor keyboard. key == $u ifTrue: [self model increase]. key == $d ifTrue: [self model decrease].
controlActivityは、コントローラがアクティブと判断されたとき(通常は、カーソルがそのコントローラの管理するビュー上でクリックされた時など)に自動的に起動されます。
OSからVM経由でコントローラに制御権が渡されていく、スケジューリングの仕組みについては、もちろんSqueakで実装されていますが、今回はMVCの基本に集中してもらうためあえて説明を避けます。 |
controlActivityメソッドのソースをコメントつきで解説すると以下のようになります。
controlActivity | key | super controlActivity. "センサからキーボードについてのイベントを取得" key := self sensor keyboard. "キーの値が$u(up)の場合はmodelに増加のリクエスト" key == $u ifTrue: [self model increase]. "キーの値が$d(down)の場合はmodelに減少のリクエスト" key == $d ifTrue: [self model decrease].
最初のsuper controlActivityは、uかdのキーが入力された以外のユーザからの入力のハンドリングを適切に行うために必要です。具体的には、マウスで、ウィンドウのタイトルバーの最小化ボタンを押したときや、リサイズを行うためドラッグした時の処理などをスーパークラス(StandardSystemController)のcontrolActivityで適切に行っているのです。
以上でCounter用コントローラの実装は終わりです。
ソースは以下のようになります。
FileIn: CounterKeyboardController.st (<=Click)
© 1999-2001 OGIS-RI Co., Ltd. |
|