!!! まとまりの良い単位を取り出す(モジュール化) * ものに注目し,ものに対する操作をインタフェースと考える * インタフェースがなるべく小さくなるように * 同じモジュールの中に,いろいろな概念が入り込まないように ソフトウェア開発においては,上記のようなモジュール化の考え方が非常に重要です. !!! モジュール? ある機能を実現するための関数群や,データの集合などを,'''他のものとは独立して閉じた形で扱えるように構成する''' ことを「モジュール化」と呼びます. !! モジュール化の利点 超単純な例として,大量のデータがファイルで与えられ,それをソーティングして出力する,という問題を考えます. これを実現するには,ファイルを読み込み,適当な手法とパラメータを用いてソーティングアルゴリズムを開始し,得られた結果を画面表示する,という手順が必要なので,プログラムとしては,大きく * データファイル読み込みモジュール * アルゴリズム本体のモジュール * 結果表示モジュール という3つの単位に分けることができます.これらの'''処理単位ごとに分割'''したソースファイルを準備すれば,プログラム開発やデバッグは'''個別に行うことができます'''. ソーティングアルゴリズムが何種類も考えられる場合には,データ読み込みと結果表示のモジュールはそのままで,「アルゴリズム本体」モジュールだけを差し替えればいいことになります.このように,((color green 上手くモジュール分けされたプログラムであれば,他のユーザが作成したモジュールでも簡単に自分のプログラムに組み込み可能))となります. !! 関数,変数の隠ぺいと公開(インタフェース決め) モジュール化を考える上で大事なことは,単に「同様の処理で関連している関数群をまとめる」ことだけではなく,処理されるデータや関数を, * そのモジュール内だけで扱われるもの,と * 外側や上位のモジュールともやり取りを行わなければならないもの に分けることです. 前者のモジュール内だけで扱う関数,変数は,例えば static 修飾子などを使用してモジュール内部に隠します. また,後者の「外部とのやり取りを必要とする関数,変数」は,'''最小限に抑えておく'''ことが重要です.これが'''インタフェース'''に相当します. ((color green モジュールとインタフェースを適切に定めておけば)),隠された機能の変更は,その影響をモジュール内部だけに抑えらるので修正が容易です.モジュールを丸ごと入れ替えるのも簡単です. さらに,他人の作ったモジュールでも,((color green 外側からアクセスする関数の動作や変数(インタフェース)にだけ気をつければ)),問題なく使用できます. 以上のように,「何を公開して何を隠ぺいするか」といったインタフェースの設計は,(プログラムの修正・変更なども考慮した)プログラミング全体の設計に関わりますので,よく考える必要があります. ! 参考 * [[家の設計]]と[[ソフトウェアの設計]] !!! (復習)ポーカーゲームのモジュール モジュール化の例として,ソフトウェア構成論で学んだ * [山モジュールの設計@|http://wiki.cis.iwate-u.ac.jp/~wiki/prog.cgi?山モジュール] * [カードモジュールの設計@|http://wiki.cis.iwate-u.ac.jp/~wiki/prog.cgi?カードモジュール] * [手札モジュールの設計@|http://wiki.cis.iwate-u.ac.jp/~wiki/prog.cgi?手札モジュール] * [ゲームモジュールの設計@|http://wiki.cis.iwate-u.ac.jp/~wiki/prog.cgi?ゲームモジュール] を見直してみましょう. それぞれ * 機能 * 独立性 * (インタフェースの)設計 があります.