
ソフトウェア設計の目標として大事になるのは、もちろん仕様どおりきちんと動くということが最低目標ですが、次に大事になるのが下記の指標です。
- 保守性
- 再利用性
今までは、「実行効率」とかも求められましたが、現在はハードウェアのスペックが格段に向上して、ソフトウェアの寿命も延びているのでそこまで重要な指標ではなくなってきつつあります。
保守性、再利用性を高めるには?
ソースコードの実装段階で、保守性、再利用性を高める方法としては、大きく下記の三つに分かれるでしょう。
- ソースコードの重複を排除する。
- 部品の独立性を高める。
- 依存関係を循環させない
それぞれ、見て生きましょう。
1.ソースコードの重複を排除する。
特に、「保守性」に関係します。ソースコードが重複していることによるデメリットは下記です。
- ソースの量が多くなり、テストや、機能の理解が大変になる。
- ソースコードの修正漏れが発生しやすくなる。
実情としては…
既存のプログラムに影響を与えないように、ソースコードを丸ごとコピーをして、一部分だけ修正して別機能化するというプログラミング手法を取っている方や、プロジェクトが結構あります。
確かに、プログラマーがそのシステムについて熟知しているという状況はまれですし、むしろそんなことは少ないのでリスク回避のために、そのようにするというは理解できます。
重複排除の実現方法は?
オブジェクト指向のクラス設計においては、下記の手法が取れるでしょう。
呼び出し側のプログラムを共通化する「ポリモーフィズム」
詳しくは、下記の記事で解説しています。
クラスのメソッドや、フィールドを共通して外だしする「継承」
詳しくは、下記の記事で解説しています。
2.部品の独立性を高める。
「部品の独立性を高める」というのは、「ソースを分割する」ということです。
部品の独立性を高めることによるメリットは下記です。
- 数万、数十万行レベルで書かれた大規模ソフトウェアが理解しやすくなる。
- ソースコードを修正する場合に、変更箇所の特定が容易になる。
- 独立した部品を他のソフトウェアに再利用することが容易になる。
ソースの分割方法
ではソースを分割するというのは具体的にどのようにすればいいのでしょうか。
それは、単にサブシステムや、さらにその中の機能ごとに分割するだけでは不十分です。
主に分割するために考えられる用語としては、「凝縮度」と「結合度」があります。
凝縮度
個々の部品の機能のまとまりの度合いを指します。これが「強い」ほど良い設計とされています。
クラス(機能)としての意味的なまとまりを強めることで理解のしやすさにつながります。
結合度
部品間の結びつきの度合いを指します。これが「弱い」ほど良い設計とされています。
クラス(部品)間でのつながりが弱ければ弱いほど、クラス間の情報のやり取りが少なくなります。
要は、「個々の部品の中は固めて、部品間は、結びつきを弱める」というのが良い設計になります。
イメージとしては下記が参考になります。
なお、クラスの独立性を高めるための具体的なコツに関しては下記の記事で解説しています。
3.依存関係を循環させないこと。
「依存関係を循環させる」とはどういうことでしょうか。
図にすると下記のようになります。
クラスが、他のクラスに依存しているという関係がループしているということです。
このデメリットは下記です。
- 利用や、再利用したりしたい場合に、余計なクラスまで用意しなければならくなる。
- 修正する場合にも、影響がないか確認する必要がある。
できるだけ、クラスを作成する場合は、循環になっていないかチェックするようにしましょう。
この記事へのコメントはありません。