ソフトウェア工学 知能情報学部 新田直也
オブジェクト指向以降の流れ オブジェクト指向は生産性,再利用性,保守性をある程度向上させた. プログラミングパラダイムとして誕生したオブジェクト指向は,その後分析,設計方法論として発展する.(基本的にはウォーターフォールモデルに基づく.) その中で,表記法だけでも統一しようということでUMLが誕生する. 一方で,実規模ソフトウェアの設計に適用されていく中でオブジェクト指向技術はさらに発展してきた. 設計のパターンを抽出,分類 → デザインパターン アプリケーションの典型的な骨組みを再利用 → フレームワーク オブジェクト指向は開発プロセスモデルそのものも変えた. スパイラルモデル,アジャイル(agile)開発,DevOps
デザインパターンとフレームワーク オブジェクト指向を実規模ソフトウェアの設計に適用されていく中で発展してきた技術. オブジェクト指向ソフトウェアの設計(複数クラスによる協調)には一定のパターンが見られることが知られていた.それらのパターンに名前をつけカタログ化したものがデザインパターン(design pattern)である. 一方,多くのアプリケーションで基本設計の部分は似通っている.基本設計を表すソースコードを多くのアプリケーションで使いまわしできるよう取り出したものがフレームワーク(framework)である. パターンが形式であるのに対し,フレームワークは実際のソースコードであることに注意すること.
デザインパターンの誕生 デザインパターンは,E. Gamma, R. Helm, R. Johnson, J. Vlissides らによって1995年に提唱される.この4人は GoF (Gang of Four)と呼ばれている. MVCアーキテクチャなど,設計にいくつかのパターンが存在することは広く開発者に(暗黙に)了解されていた. デザインパターンは,Alexander の建築設計におけるパターンに関する議論を土台としている. 「それぞれのパターンは我々の身のまわりで何回も起きる問題,および,それぞれの問題に対する解法のポイントを記述している.そこで我々は,これらの解法を何万回でも使うことができる.同じ問題に対する同じ解法を何度も何度も最初から考え直さずに済むというわけだ」
デザインパターンの要素 現在,23種類のデザインパターンが知られている. 各パターンは次の4つの基本的な要素を有している. パターン名: パターンの名前 問題: パターンが適用される問題 解法: パターンの実際の構成 結果: パターンを用いることによる結果 23個のパターンは以下の3グループに分類される. 生成に関するパターン: 5個 構造に関するパターン: 7個 振る舞いに関するパターン: 11個
MVCアーキテクチャ SmallTalkのコミュニティで古くから使われていた. MVCは,Model/View/Controllerの略.これらはユーザインタフェースを構成する3つの(抽象)クラスの名前である. MVCでは,Observer,Composite,Strategy などさまざまなパターンが使われていた. View Controller Model 表示 入力 アプリケーション ロジック ユーザインタフェース データを保持
Observerパターン(1) Model と View の間のパターンである. Observers (Views) 表示の更新 データの要求,変更 d[0][0] = 20.4 d[0][1] = 27.4 : Subject (Model)
Observerパターン(2) 問題: 論理的な情報はSubjectが保持し,外観に関する情報は各Observerが有する. Observerの具象クラス(表クラス,棒グラフクラス,円グラフクラスなど)も複数存在している. Observerの具象クラスは自分に対応しているSubjectの具象クラスを知っている.
Observerパターン(3) 不適切な解法1: → 複数種ある Subject に対応できない.
Observerパターン(4) 不適切な解法2: → これでは具象Subject の状態を取得できない. ConcreteSubject1 → ConcreteObserver1, ConcreteObserver2 ConcreteSubject2 → ConcreteObserver3 → これでは具象Subject の状態を取得できない.
Observerパターン(5) 解法:
Observerパターン(6) パターンとして整理しておくと…
Observerパターン(7) シーケンス図による表現 anotherObject : ConcreteObject aSubject : ConcreteSubject aObject : ConcreteObject setState() Notify() Update() GetState() Update() GetState()
Factory Methodパターン 問題:抽象アプリケーションはドキュメントを生成し保持するが,具体的なドキュメントのクラスを知らないため,自身ではドキュメントをインスタンス化できない. 解法: フレームワーク側 アプリケーション側
Compositeパターン 問題:オブジェクトを集約を用いて木構造に組み立てる際,個々のオブジェクトとそれらを合成したものを一様に扱いたい. 例: コンテナ AWTのコンポーネントとコンテナ トップレベル コンポーネント 中間コンポーネント アトミック コンポーネント
Compositeパターン 解法: アトミックコンポーネント コンテナ
まとめ デザインパターンはオブジェクト指向ソフトウェアの設計に出現するパターンをカタログ化したもの. 熟練者のノウハウが凝縮されている. 現在では「共通言語」になりつつある. オブジェクト指向を用いて設計する上での指針になる. 産業界の方が学術界より進んでいる? パターンの背景にある論理は何か? メタパターン マルチパラダイムデザイン