良いコンポーネント設計とは?

良いコンポーネント設計とは何か? 現在の自分の考えを整理しておきます。

  1. インタフェースと実装が分離されていること。
  2. インタフェースの仕様が明確に定義されていること。
  3. 異なる関心事が同居していないこと。
  4. コンポーネント間が疎結合であること。
  5. コンポーネント間の依存関係が循環しないこと。
  6. 抽象度の高いコンポーネントが抽象度の低いコンポーネントに依存しないこと。
  7. 特定のフレームワークやライブラリに強く依存しないこと。
  8. デプロイなどの面倒な手間をかけずに動作確認ができること。
  9. 設定ファイルが不要または簡潔であること。
  10. 単体テストが簡単に書けること。

これらの条件は以下の目標を満たすためにあります。

  • 目的に合った品質の高いソフトウェアを作ること。
  • トータルコストを安く抑えること。
  • わかりやすく、開発・保守が容易であること。

で、何でこんなことをあらためて書いたかというと、EJB3SeasarEJB3 対応にちょっと違和感を感じたから。

http://d.hatena.ne.jp/higayasuo/20060101

僕はその辺のところにとやかくいう立場ではないし、今後の市場がどう動くのか予測できないし、必要な機能がサポートされれば特に問題はないのですが...

  • Annotation はうまく使うと 2 を高めることができそう。
  • でも乱用すると、3、6、7 に悪影響を与えそう。
    例えば、SessionBean を implements するのと @Stateless って書くのってそんなに違うのかなぁ? (EoD という観点ではかなり改善すると思うけど)

Seasar に関しては、EJB3 対応した場合、感覚的に「だったら素直に EJB3 使えばいいじゃん」ってならないかちょっと心配。