修正可能なシステムの裏づけを考えてきて、さっき、オブジェクト指向の(エンティティ)クラス抽出の手法として、ER図の正規化を利用しましたけど、結局、
・コンピューターは人がやる業務(プロセス)を代わりにやっている
・業務は、会社のリソースと、過去にやった業務をもとに、実行していく
という性格がある以上、
・業務プロセスと、
・リソース+過去にやったイベント(業務)=エンティティ
にわかれて、業務プロセスが、エンティティを操作して、必要な結果(出力)を得る、そのために必要な入力はどこからか得るという構図は、絶対的にかわらないわけです。
そうなってくると、問題は、
・業務プロセスとエンティティをどうやって明確化していくか?
・それを、どうコンピューター上に表現するか?
ということに、帰結してくるわけです。
そこで、MVCというフレームワークにおいては、
・Viewの部分で、業務プロセスに必要なデータを入力し、
業務プロセスを実行するイベントを、クリックなどで表現し、
コントローラーに起動をかける
・コントローラーによって、業務プロセスに対応するイベント
を受け取り、
・コントローラーが、エンティティを処理して、
結果をView(画面、帳票)にかえしてもいいし、
・コントローラーが、さらにWebサービス
(サービスは業務プロセスに当たる)を呼び出す、
つまり、業務プロセス処理を委譲してもいい
・でも、最終的には、業務プロセス処理は、
リソースや過去のプロセスの処理結果である、エンティティを利用する。
この部分がモデルに相当する。
って言うことになると思うし、この場合、
プロセスを出してくる手法が、
オブジェクト指向の場合、アクティビティ図からユースケース図
構造化分析の場合、DFDとなり、
エンティティは、
DOAのER図・・を導く、正規化手法ということになる。
オブジェクト指向の場合、エンティティでとめるのでなく、クラスにしないといけない。
クラスはもちろん、
・1業務プロセスを1クラスとして
メソッドは、executeとか、doとかrunとか
・1エンティティを1クラスとし、
メソッドは、CRUDとか、PutGet
というまとめかたもできる。
ただし、エンティティ内に、業務プロセスをメソッドとして入れることも出来る
(受注クラスに受注票出力とか、受注キャンセルとか入れることも出来る)
この場合、業務プロセスを、どこのクラスに入れるかの基準は、
Aさんが、なになにを、なんとかする
という形になっている業務プロセスは、Aさん=>コンピューターに業務委譲
することになるので、
コンピューターが、エンティティ「なになに」をプロセス「なんとか」する
という形になる。
したがって、この場合、目的語にあたる「なになに」のエンティティに、
プロセス「なんとか」を入れることになる。
一方、
ランプが点灯する
のような、主語、述語しかない場合は、主語のクラスに述語のプロセスを
入れることがふつう。
結論をまとめると、
オブジェクト指向とDOA,構造化分析は、結局、
・業務プロセスによる
・エンティティの利用法
に収束する。
クライアントサーバ、MVCやSOA、Webサービスなど、さまざまな実装法の話が出ては消えているが、これは、プロセスは何段にでもできるので、
・プロセスをどこにおくのか、
・何段に設定するのか、
・エンティティはどこにおくのか
という話に収束する。
ということは、修正可能なシステムということは、
修正箇所を、
・業務プロセスとエンティティに明確に分けられ、
・不用意に他のエンティティやプロセスへの影響を与えない
ようにすれば、よさそうだ。
この、「他のエンティティやプロセスへの影響を与えない」という、独立性の問題と、参照制約などの一貫性の問題がある。これらはDBでは確立しているが、それをオブジェクト指向で実現できないと、オブジェクト指向で修正可能なシステムを実現することは難しくなってしまう。
幸いにも、実は簡単にこれは実現できる(エンティティオブジェクトの一貫性と、業務プロセスからの独立性をオブジェクト指向の基本的な性質を利用して記述できる)が、あまりにも長い話になったので、またいつか、書くことにします。