ひがやすを技術ブログ

電通国際情報サービスのプログラマ

コントロール分析

コントロール分析、いろいろなフィードバックを元に
考え直しました。
id:marrowさんやid:akonさんの考えを取り込んでます。


以前は、バウンダリに属するコントロールを1つにまとめ、
エンティティに関連するロジックはDaoにまとめ、
シナリオ分析を通じて、共通的なロジックがあったら
共通ロジックに抽出するという方法で、割とオーソドックスな
方法だと思うのですが、最初にクラスを抽出するところが
人によってまちまちな結果になって混乱する場合もあるようです。
特に共通ロジックのところが。
で、考え直しました。


最初に抽出されているコントロールは、Whatをあらわしています。
次に必要なのは、どのようにして(How)実現するかです。
Howはユーザ機能で表します。
FDDではユーザ機能は、<オブジェクト><結果><アクション>で
あらわしますが、VO(〜を〜する)となにが違うのか良く分かってません。
これまでと同様にVOで表すで良いだろうと思ってます。


いよいよ、コントロールをユーザ機能に分解します。
ユーザ機能は、これ以上分割することのできないアトミックな
ものになるまで分解します。
そうすると、ユーザ機能は、アトミックなものとアトミックなものの
フロー制御をするものに分かれるでしょう。


コントロールのユーザ機能への分解は、シナリオごとに行います。
シナリオは、

  • しなければいけない
  • ならばできること
  • 例外

のケースについて分析します。
これがおわるとコントロールのすべてのユーザ機能(Responsibility)が
洗い出されたことになります。


次にResponsibilityをクラス(interface)に割り当てていきます。
コントロール層のクラスは次のように分類されます。

  • 業務ロジック(*Logic)
  • 補助ロジック(*Support)
  • Dao(*Dao)

業務ロジックはバウンダリごとに作成します。*の部分はバウンダリ
表す名前が入ります。
Daoはエンティティごとに作成します。*の部分はエンティティを
表す名前が入ります。
永続化に関係ないけど、エンティティに関係するロジックも
Daoに含めた方がいいと思ってます。
Daoを使う側からすると永続的かどうかは関係ないためです。
業務ロジックにもDaoにも含まれないResponsibilityは
補助ロジックになります。*の部分は、VOのO(目的語)を
表す名前が入ります。


ResponsibilityをClassに割り当てると同時にClassにCollaboratorも
割り当てます。
例えば、Responsibility aaaがbbbを呼び出していて、
aaaがFooクラスに割り当てられ、bbbがBarクラスに割り当てられた場合は、
FooのCollaboratorにBarを割り当てます。


依存関係は次のようになります。
バウンダリ層が呼び出していいのは業務ロジックだけです。
業務ロジックが呼び出していいのは補助ロジックとDaoです。
補助ロジックは他のロジックに依存しません。
が呼び出していいのは補助ロジックとDaoです。
Daoも他のロジックに依存しません。


先にクラスを抽出するのではなく、ユーザ機能を洗い出してから、
役割に応じてクラスを割り当てるようにしたということですね。
なんか、FDDCRCがいりみだれてますが、まぁいいか。