さっきの形式的な共通化と意味的な共通化の話。まとめると、
業務に結びついている部分を共通化する場合(自衛隊と一般公務員の給与計算の共通化など)を
意味的な共通化と、ここではよぶ。
これは、アルゴリズムを共通化しているようなものである。
業務とは関係ない、計算システムへの落とし込みを共通化する場合(画面はStrutsでなど)を
形式的な共通化と、ここでは呼ぶ。
これは、アルゴリズムの実装を共通化しているようなものである。
で、ここで、形式的な共通化を利用する場合(フレームワークなどもそう)、意味部分を考えないため、意味部分の情報を捨象して、共通化を行う。
具体的には、Strutsの画面などで、各画面、それぞれ違いがあるけど、これを共通的にしないといけないので、ActionFormという中に入れている。
VO(バリューオブジェクト)、カオル姫方式のハッシュマップに値をいれるのや、XMLで引数をわたすのや、HTTPの引数としてのURLエンコーディングや、InterStageのCBMMsgとか・・・挙げるとキリがないので、この辺でやめるけど、引数をなにかにいれるのが、これになる。
プロセスのほうもそうで、Strutsの場合もActionに入れたりするけど、こちらのほうは、Javaだとリフレクションを使えばいいし、Cだと、関数をポインタにいれて、そいつを起動するなどできるので、引数のようにあえて共通化する変数・クラスとかは作らないけど、おんなじように、意味部分(給与計算とか受注とか)を捨象して、共通化する。
これにより、画面やDBなど、実装部分は、形式的に操作できる。
この結果、形式的な共通化により、意味が見えなくなることになる。
引数をハッシュマップで渡してしまうと、引数の値は、わからない。
共通のVOクラスを継承したものを引数とする場合、わたってきたクラスは、(VOを継承していることは分かるけど)実際に、どのクラスで、変数(フィールド)は何なのか、はわからない
この場合は、共通の形式→意味変換が必要になる。
具体的に言うと、
public void exec(HashMap arg)
と共通化され、引数がハッシュマップに入っていて、その属性と値が知りたいのなら
String[] argKeyList = (String[])(arg.keySet().toString(new String[0]));
でハッシュマップのキーを取得。あとは、arg.get(argKeyList[i]);
みたいな感じで、それぞれの値を得る。
引数が、あるクラスに入っている場合、Javaなら、かならず、Objectは継承しているはずなので、
arg.getClass()で、クラスを取得でき、クラスのgetName()で、クラス名、
クラスのgetField()でフィールドを取得し、そのフィールドに対して、getName()で、フィールド名
みたいな感じで、それぞれの値を得る。
こういった、共通手続きで、意味的情報が取得できることはありがたいが、これらの情報は、動かしてみないと入手できないこともある。なので、共通化するときは、このような機能の有無にかかわらず、ドキュメントを残しておく必要がある(けど、ドキュメントも共通化すれば、もっと効率が上がるのよね)