プログラムをモジュール化する
1. 原則
プログラムはモジュール化せよ
- プログラムは機能や関心など適切な粒度で分割され、それぞれ適切なインターフェイスを備えたモジュールとして提供されなければならない
- 全く分割されない巨大なプログラムを書いてはいけない
2. 根拠
保守性
- モジュールが適切な粒度で分割されていれば、特定の機能に関する処理を理解しやすくなる
- モジュールが分割されておらず、あらゆる処理を内包している場合、処理を理解することは難しくなるし、不具合が発生した場合の原因調査に時間がかかることになる
再利用性
- 良くモジュール化されたプログラムは再利用しやすい
- 再利用しやすプログラムが蓄積されていれば都度ゼロからプログラムを書く必要はなくなるので、プログラマの生産性を高めることに繋がる
3. 指針
プログラムを適切な粒度で分割し、独立させる
- 関連性や概念、責務などに対応した適切で最小の粒度でプログラムを分割し、それぞれのプログラムを独立させる
- 分割され独立したプログラムをモジュールと呼ぶ
理解しやすい名前を付ける
- モジュール化したプログラムには適切な名前を付ける
- プログラムは何らかの意図に従って分割されたはずなので、その意図を明確に示す名前を付けなくてはならない
- 意図が伝わらない名前が付けられたモジュールは作成者以外の人間にはそれが何か分からない
適切なインターフェイスを持たせる
- モジュールには適切なインターフェイス(関数、メソッド、プロパティ)が必要である
- モジュールは何らかの概念を表現しているはずなので、その概念に対する操作をインターフェイスとして表現する
4. 注意
参考資料
Appendix-1 モジュールの定義
- 前提として、「モジュール」という用語の定義は言語や考え方によって多少のブレがある
- 本稿では「モジュール = 関連する関数やデータを集約し、再利用可能(インポート可能)にしたプログラム」説を採用している
- 「モジュールの機能」とは関数やメソッドを指す
- 例えば、Pythonであれば
.py
ファイルに関数を1つ以上含むものがモジュールという事になる(Pythonの用語としてのモジュールはここでは一旦忘れる)
# mymodule.py
def func1():
print("Yeah!!")
- また、JavaやC#のようなクラスベースの言語の場合は、クラスがモジュールとなる
// MyClass.java
public class MyClass {
public void yeah(){
System.out.println("Yeah!!");
}
}
- Pythonもクラスを定義できるが、「関連する関数やデータを集約し、再利用可能にしたプログラム」がモジュールである事を踏まえると、クラスもまたモジュールである
- ↓のように
.py
ファイルの中でクラスと関数が定義されている場合はmymodule.py
というモジュールの中で更にMyClass
というモジュールが定義されていると解釈する
# mymodule.py
class MyClass:
def yeah(self):
print("Yeah!!")
def func1():
print("Yeah!!")
- ↓のように関数が定義されておらず、インポートするだけで何らかの処理が実行される(副作用が発生する)タイプもモジュールと解釈する(ただし、モジュールとしてはあまり行儀のよいものではない)
# mymodule.py
print("Yeah!!")