モジュール化(とインタフェース)
まとまりの良い単位を取り出す(モジュール化)
ソフトウェア開発においては,次のようなモジュール化の考え方が非常に重要です.
- 「もの」に注目し,ものに対する「操作」をインタフェースと考える
- インタフェースがなるべく小さくなるように
- 同じモジュールの中に,いろいろな概念が入り込まないように
モジュール?
ある機能を実現するための関数群や,データの集合などを,他のものとは独立して閉じた形で扱えるように構成することを「モジュール化」と呼びます.
構造をつかまえる
モジュール化を行うために,まずは全体の流れを書いてみましょう.
- ものと操作の洗い出しで決めた言葉を使って,フローチャートや状態遷移図を書いてみます.
- この際,まだ洗い出されていない言葉が出てきたら,再度,洗い出しからやり直します.
ものや操作の依存関係の把握
- ものの間の依存関係をグラフ化し,
- 一つのものをクラスや構造体で表してみます
- 最終的に,プログラミング言語の言葉(型とか関数とか)になればOKです.
「もの」や「操作」からプログラムへ
例えば,次のように考えると良いかもしれません.
- 概念はオブジェクト(やクラス)になります.
- ある概念のある一つの実体は変数,
- 実体の集まりは配列になります.
- 操作や処理は関数で表せます.
- 何に対する操作で,
- どんな情報が必要で,
- 何が返されるのか
- 変化は,状態が変わることを意味し,関数で表します.
- 状態は変数に記憶し,その値は数値で表します.
モジュール化の利点
超単純な例として,大量のデータを(ネットワークを通じて)データベースから読み込み,それをソーティングして画面に出力する,という問題を考えます.
これを実現するには,データベースからデータを読み込み,適当な手法とパラメータを用いてソーティングアルゴリズムを開始し,得られた結果を画面に表示する,という手順が必要なので,プログラムとしては,大きく
- データ読み込みモジュール
- アルゴリズム本体のモジュール
- 結果表示モジュール
という3つの単位に分けることができます.これらの処理単位ごとに分けてスクリプトを準備しておけば,プログラム開発やデバッグは個別に行うことができます.
ソーティングアルゴリズムが何種類も考えられる場合には,データ読み込みと結果表示のモジュールはそのままで,「アルゴリズム本体」モジュールだけを差し替えればいいことになります.このように,上手くモジュール分けされたプログラムであれば,他のユーザが作成したモジュールでも簡単に自分のプログラムに組み込み可能となります.
関数(操作),変数(もの)の隠ぺいと公開(インタフェース決め)
モジュール化を考える上で大事なことは,単に「同様の処理で関連している関数群をまとめる」ことだけではなく,処理されるデータや関数を,
- そのモジュールの中だけで扱われるもの,と
- 外側や上位のモジュールともやり取りを行わなければならないもの
に分けることです.
前者のモジュール内だけで扱う関数(メソッド),変数(プロパティ)は,例えばモジュール・パターンを使った記述方法などを利用して内部に隠します.
また,後者の「外部とのやり取りを必要とする関数,変数」は,最小限に抑えておくことが重要です.これがインタフェースに相当します.
モジュールとインタフェースを適切に定めておけば,隠された機能の変更は,その影響をモジュール内部だけに抑えらるので修正が容易です.モジュールを丸ごと入れ替えるのも簡単です.
さらに,他人の作ったモジュールでも,外側からアクセスする関数の動作や変数(インタフェース)にだけ気をつければ,問題なく使用できます.
以上のように,「何を公開して何を隠ぺいするか」といったインタフェースの設計は,(プログラムの修正・変更なども考慮した)プログラミング全体の設計に関わりますので,よく考える必要があります.