建物との対比によるオブジェクトの分類、アノテーションと再利用

アプリケーションでのオブジェクトの分類を、家を建てるときの部品の分類になぞらえて考えてみます。
家を建てるときに使う部品には、次のような5種類の部品が考えられます。

  1. 柱や梁のように加工して使う構造部品
  2. 窓枠やドアのように自作や加工が難しくそのまま使う部品
  3. 床板や瓦のようにほぼそのまま使う部品
  4. ネジくぎのように必要に応じて使う部品
  5. 家が完成したあとに置かれる家具などのモノやそこを使うヒト


「柱や梁のように加工して使う構造部品」は、設計図に現れて、家の骨格になる部品です。
規格化された角材を切ったりホゾ穴を掘ったり、設計図どおりに加工して使います。加工した部品は使う場所が決まり、他の場所で使うことはできません。
プログラムで言えば、ServletやActionなどにあたります。


「窓枠やドアのように自作や加工が難しくそのまま使う部品」はアセンブリとしてそのまま使う大きな部品です。
精度や強度が求められたり加工が難しかったりするので、既製品をそのまま使います。どの部品を使うかは設計の段階で決まっていて、その窓枠やドアにあわせて柱の位置を決めるように、設計自体に影響を与えます。既製品が使えず自作や加工が必要になるときには、予算や施工期間に大きな影響を与えることがあります。
プログラムで言えば、データベース接続やPDF出力などにあたります。


「床板や瓦のようにほぼそのまま使う部品」は、どこでどの部品を配置するかおおまかには決めるけど厳密な位置は施工段階でアドホックに決めるような部品です。
基本的に加工せずに使いますが、場所にあわせて加工することもあります。安く作るには加工の必要性が少なくなるようにします。こだわって加工が多く必要になると高くなります。
プログラムで言えば、GUI部品などにあたります。


「ネジくぎのように必要に応じて使う部品」は、とりあえず設計段階で想定はするはずですが、実際の図面には現れない小さな部品です。
使う場所なども特に決まっていないので、施工時に必要に応じて使います。どの長さのくぎを使うかも、現場で判断します。加工が必要になったり特別な部品が必要になったりすることもありますが、あまり作業に影響を与えません。
プログラムで言えば、StringやListなどにあたります。


最後の「家が完成したあとに置かれる家具などのモノやそこを使うヒト」は部品ではないのですが、これらのために家が建てられます。
どのようなヒトがどのように使い、どのような家具が置かれるかというのは、どのような家を建てるかにかかわります。ピアノを置くために床を補強する場合のように、設計方針に大きな影響を与えることもあります。
プログラムで言えば、DBのマッピングオブジェクトやActionFormなどにあたります。アプリケーション専用になるという点が建物の場合と異なりますが、適当な変換を行うことで別のアプリケーションともデータのやりとりが可能です。


この中で、2〜4は、粒度が違うだけで再利用可能な部品です。異なる家やアプリケーションで共通して使うことができます。
1は、元になる角材やActionなどはありますが、実際に使うために加工したものは、建物やアプリケーション専用で再利用されることはありません。5に関しても再利用は行いません。


このように分類したとき、アノテーションが付けられるのは、1と5にあたるクラスです。
2〜4にあたるような、再利用を考慮するクラスにアノテーションを記述することはあまりありません。
アプリケーション固有であるからこそ、その固有の情報をアノテーションとして付加するということもできます。そういう意味で、アノテーションがついたことによる再利用性の低下は、そもそも問題になりにくいのではないかと思います。
柱のホゾやホゾ穴に、どのように対応するかを「ろ八」とか「に六」とか墨で書いてありますが、あんな感じのものだと思います。墨書きを書いてしまえば他の場所で使いにくくなりますが、それ以前にホゾ穴あいてるからよそでは使えないよ、と。
柱を汚したくないなら別に対応図面があればわかるので、墨書きする必要もないのですが、柱に書いてあるほうが作業がやりやすくなります。
ドアや窓枠にはそんな墨書きをしませんが、それを受ける柱などに印をつけることがあります。ドアや窓枠の場合には、柱を組めば「その形」が現れるので、墨書きがなくても場所がわかります。
自動バインディングですね。