論文から直接引用:
オブザーバー パターンの正確な問題を説明するために、単純でありふれた例であるマウスのドラッグから始めます。Path
次の例では、オブジェクトのドラッグ操作中にマウスの動きをトレースし、画面に表示します。シンプルにするために、Scala クロージャーをオブザーバーとして使用します。
var path: Path = null
val moveObserver = { (event: MouseEvent) =>
path.lineTo(event.position)
draw(path)
}
control.addMouseDownObserver { event =>
path = new Path(event.position)
control.addMouseMoveObserver(moveObserver)
}
control.addMouseUpObserver { event =>
control.removeMouseMoveObserver(moveObserver)
path.close()
draw(path)
}
上記の例は、[25] で一般的に定義されているオブザーバー パターンを議論するように、重要なソフトウェア エンジニアリング原則の印象的なラインナップに違反しています。
副作用オブザーバーは副作用を助長します。オブザーバーはステートレスであるため、ドラッグの例のように、ステート マシンをシミュレートするために複数のオブザーバーが必要になることがよくあります。上記の変数など、関係するすべてのオブザーバーがアクセスできる状態を保存する必要がありますpath
。
カプセル化状態変数path
がオブザーバーのスコープをエスケープすると、オブザーバー パターンはカプセル化を破ります。
構成可能性複数のオブザーバーは、単一の関心事 (または複数、次のポイントを参照) を処理するオブジェクトの緩やかなコレクションを形成します。複数のオブザーバが異なる時点で異なる時期に設置されるため、たとえば、それらを簡単に処分することはできません。
懸念事項の分離上記のオブザーバーは、マウス パスをトレースするだけでなく、描画コマンドも呼び出します。より一般的には、同じコードの場所に 2 つの異なる関心事項を含めます。多くの場合、モデル ビュー コントローラー (MVC) [30] パターンのように、パスの構築と表示の関係を分離することが望ましいです。
スケーラビリティこの例では、パスが変更されたときにそれ自体がイベントを発行するパスのクラスを作成することで、関心の分離を実現できます。残念ながら、オブザーバー パターンのデータの一貫性は保証されません。たとえば、パスの境界を表す四角形など、元のパスの変更に依存する別のイベント公開オブジェクトを作成するとします。フレーム化されたパスを描画するために、パスとその境界の両方の変更をリッスンするオブザーバーも考えてください。このオブザーバーは、境界が既に更新されているかどうかを手動で判断する必要があり、更新されていない場合は描画操作を延期します。そうしないと、画面上のフレームが間違ったサイズで表示される可能性があります (グリッチ)。
均一性さまざまなオブザーバーをインストールする方法が異なると、コードの均一性が低下します。
抽象化この例では、低レベルの抽象化が行われています。これは、マウス イベント オブザーバーをインストールするための特定のメソッド以上のものを提供する、コントロール クラスの重量のあるインターフェイスに依存しています。したがって、正確なイベント ソースを抽象化することはできません。たとえば、エスケープ キーを押すか、タッチ スクリーンやグラフィック タブレットなどの別のポインター デバイスを使用して、ユーザーがドラッグ操作を中止できるようにすることができます。
リソース管理オブザーバーのライフタイムは、クライアントによって管理される必要があります。パフォーマンス上の理由から、ドラッグ操作中にのみマウス移動イベントを観察したいと考えています。したがって、マウス移動オブザーバーを明示的にインストールおよびアンインストールする必要があり、インストールのポイント (上記のコントロール) を覚えておく必要があります。
意味論的距離最終的に、この例は理解しにくいものです。なぜなら、制御フローが逆になっているため、ボイラープレート コードが多すぎて、プログラマーの意図と実際のコードとの間の意味論的距離が長くなるからです。
【25] E.ガンマ、R.ヘルム、R.ジョンソン、J.ブリシデス。デザイン パターン: 再利用可能なオブジェクト指向ソフトウェアの要素。Addison-Wesley Longman Publishing Co., Inc.、米国マサチューセッツ州ボストン、1995 年。ISBN 0-201-63361-2。