Software Engineering Lecture 6/29

Software Engineering Lecture 6/29

先週の復習

オブジェクトの並列実行

UML では、概念モデルで現実世界に対応したオブジェクトの静的な 関係を表し、相互作用図( シーケンス図 , 協調図)により、時系列 に対応したユースケースの具体的な記述を行う。そして、個々のオ ブジェクトの振る舞いは、状態図で表現する。

これらのモデルは、ある意味でオブジェクトの並列実行を仮定している。 しかし、オブジェクト指向プログラムを普通の逐次型プログラム言語で 記述する時には、なんらかの方法で並列実行をシミュレーションしなくては ならない。そのためには以下のような方法がある。

実際には、最初の方法が一番簡単な実現方法だといえるだろう。 しかし、入出 力処理がともなう場合には、プロセスを分割するかスレッドを使う必要がある。 さらに、スケジューラオブジェクトのプログラムはプロセスモデルを複雑に してしまうことが多い。

問1

この三つの方法の利点と欠点について考察してみよ。



MVC

Graphical User Interface を含むプログラムでは、その表示され るもの(View) と、それが表しているObject (Model) というように わけてプログラムする方法がある。View と Model とは同期を取る 必要があり、それを担当するControllerというObjectが担当する。 これを、Model-View-Controller (MVC) という。



MVC は、Phigs などでも採用されていて、GUIや3D Visualのプログラムでは 良く使われる手法である。しかし、Controller が複雑になることが多く、 View と Model とで同じような構造体を用意しなければならないなど、不都合な 点も多い。

問2

CardPlay のモジュールにおいて MVC がどのように使われているかを、 協調図を用いて表せ。

ソフトウェア・パターン

MVC や、Thread などはソフトウェア・パターンと呼ばれるものの一部 である。

GRASPパターン (汎用責務割り当てパターン)
パターン名 説明
Expert 一般的には何に責務を持たせるべきか

情報エキスパート、すなわち責務を遂行するために必要な情報を持っている クラスに責務を割り当てる

Creator 生成の責務は何に持たせるべきか

以下のどれかの条件が真である場合に、クラスAのインスタンスを生成する 責務をクラスBに割り当てる

  1. BがAを含む
  2. BがAを集約する
  3. BがAの初期化データを持っている
  4. BがAを記録する
  5. BがAを密接に使用する
Controller システムイベントを処理する責務は何に持たせるべきか

システムイベントメッセージを処理する責務は、以下のどれかを表す クラスに割り当てる

  1. ビジネスまたは組織全体を表すクラス(ファサードのコントローラ)
  2. 「システム」全体を表すクラス(ファサードのコントローラ)
  3. 問題領域において仕事を実行する動きのある何かを表すクラス(役割のコントローラ)
  4. ユースケースを表現する人工的なクラス(これはPure Fabricatoin) (ユースケースの コントローラ)
Low Coupling (疎結合性) 依存性を弱め、再利用性を高めるにはどのようにすればよいか

結合性を疎に保つように責務を割り当てる

High Cohesion (高凝集性) 複雑さを管理しやすくするにはどのようにすればよいか

凝集性を高く保つように責務を割り当てる

Polymorhphism ( 多相性 ) 型によって振る舞いが変化する場合には、何に責務を持たせるべきか

選択肢や振る舞いが型(クラス)によって変化する場合は、多相的操作を 用い、振る舞いの変化する型にその振る舞いのための責務を割り当てる

Pure Fabrication (純粋架空物 ) 追い詰められてはいても、高凝集性、疎結合性、再利用性を損ないたくない 場合には何に責務をもたせればよいか

高凝集性、疎結合性、再利用性を促進するために、問題領域を いっさい表現しない人工的なクラスを作り、高度に凝集された責務を そのクラスに割り当てる

Indirection (間接化) 直接的な結合性を避けるには何に責務を持たせるべきか

他のコンポーネントまたはサービス間に介在する媒介オブジェクトに 責務を割り当て、コンポーネントやサービスが直接に結合されない ようにする

Don't Talk to Strangers (未知の存在には話かけない (デルメルの法則)) 間接オブジェクトの構造を把握しないで済ませるには何に責務をもたせるべきか

責務をクライアントの直接オブジェクトに割り当て間接オブジェクトと協調 させる。これにより、クライアントが間接オブジェクトを把握する必要が なくなる。メソッド内でメッセージを送れるのは以下に示すオブジェクト に対してだけである。

  1. thisオブジェクト(またはself)
  2. そのメソッドのパラメータ
  3. selfの属性
  4. selfの属性である集合の要素
  5. そのメソッド内で生成されたオブジェクト

宿題

今回の問題を kono@ie.u-ryukyu.ac.jp まで、来週までにメールで送ること。 Subject には、

   Report on Software Engineering Lecture 6/29 
を付けること。