モジュール概念の定義法

ソフトウェア開発の手法として主流なのが分割して複合化するという考え方です。
どういう単位にして分割するか、分割したものを統合するための複合化をどうするかを決めるのがモジュールの概念です。
モジュールというと、ファイルやクラスのような物理的な単位を想像することが多いのですが、組織や作業、あるいは、もっと抽象的な関心などもモジュールとなりえます。

モジュールの有効性は、何もソフトウェア技術だけの話ではなく、工業製品や経済学の分野でも主流ですし、むしろ、先行していると言えるでしょう。たとえば、Design Rules, Vol. 1: The Power of Modularity は有名な経済学の本です。モジュールの価値の評価をする上での必読書です。

さて、ここではモジュールをどう作るかの発想を考えてみましょう。すでにソフトウェア技術には、クラスや関数、あるいは、DLLのような実行時のロード単位、パッケージ単位などが多く存在します。これらはそれぞれの目的で作られていて、たぶん、普通のソフトウェア技術者は、利用はするけれど、どうしてモジュールが設計されるかを考えることは少ないと思われます。

しかし、ソフトウェアアーキテクトとしては、こうしたモジュール概念を必要に応じて設計する能力を持ち合わせていなければなりません。抽象化の能力の一種だと思います。

たとえば、アスペクトというモジュールは、OOPのクラスに横断的な関心を束ねて1つのモジュールを見立てる定義です。それをプログラミング言語の構文に導入してAOPが開発され、アスペクトを発見し、分析し、設計や実装に関連づけるパラダイムが開発されました。この場合、アスペクトの概念の定義に、どうような属性を含めるかがモジュール設計の有効性を決定する意思決定です。

モジュール設計では、概念そのものを設計の対象とするよりも、ぞの概念の持つ属性を特徴抽出することから始めます。モジュールの属性としては、

  • 情報の隠ぺい: 可視性やアクセス制御を決める。private、publicなどが一般的。
  • カプセル化: 隠ぺいされる情報に対してアクセスする方法や、拡張法を与える。契約、インターフェイスなどが一般的。
  • 局所性: 影響範囲、定義のスコープを決める。
  • カップリング: モジュール間の関係性、独立性を減らす。

こうした属性を発見し、考慮することで、モジュールが持つ望ましい属性を定義して概念としてまとめ上げます。