読書記録 C#実践開発手法 第2部-第6章

大幅に遅れましたが、個人用なので問題なしです。

本日は第2部第6章の開放と閉鎖の法則の説明になります。

定義

開放と閉鎖の法則(OCP)には2パターンの定義があるそうです。
一つはMeyer(契約による設計を提唱した方です)によるもので

ソフトウェアエンティティは拡張に対して開いていて、変更に対して閉じていなければならない。

というものになります。この「拡張に対して開いていて」と「変更に対して閉じている」の両方を詳細しているのが
次のMartin(アジャイルマニフェストの提唱者の一人)の定義になります。
Martinの定義によると、
拡張に対して開いているは、モジュールの振る舞いを拡張できることを意味しており
変更に対して閉じているは、モジュールの振る舞いを拡張しても、モジュールのソースや
バイナリに変更が生じないこと。
であるそうです。

ただし2つの例外があるそうで、バグの修正と、クライアント側が認識できない変更は許されるそうです。

方法

OCPの定義の次は、どのようにしてOCPを実現するかの説明に移ります。

変更に対して閉じているようにするためには、やはりクラスはインタフェースで依存させておいて、ある程度の変更に耐えうるようにするのが良いようです。
クラス間を疎結合に保つことで、変更に対して閉じている状態を維持できます。

拡張に対して開いているようにするためには、拡張ポイントを各クラスに設ける必要があるそうです。
この拡張ポイントを実装する手段として、仮想メソッドや抽象メソッド、インタフェースの継承があるそうです。
ここでは3つの方法を挙げましたが、この本で推奨しているのはインタフェースの継承でした。
仮想メソッドや抽象メソッドでは、どうしてもサブクラスが元のクラスの実装に依存することになり、元のクラスの変更が難しくなります。
可能な限り継承よりも合成を優先して、継承階層は浅く保つのが良いようです。

適用

OCPを実装で表現するためには、インタフェースの合成や継承を活用しつつ、場合によっては実装の継承などを利用することを説明しました。
次は、どの程度これを実際のソフトウェアに実現するのかの説明になります。
これらの拡張ポイントをすべてのクラスに適用することも可能ではあると思いますが、現実的ではありません。

OCPを適用する場所を決定するためには、あらかじめ将来変更しうるクラスを予測することが重要になります。
この予測に活用できるのが、アジャイル開発におけるユーザストーリの選択です。
ユーザストーリの選択時に、将来の形をイメージする(もしくはチーム内で予測を合わせておく)ことで予測されるバリエーションの情報が得られます。

これで拡張ポイントを決定し、実装を進めていきます。
OCPの実現のためには、インタフェースへの依存が重要になりますので、インタフェースは安定していることが最重要になります。

このようにして適切にOCPを適用してソフトウェアを柔軟に開発していきます。

おわりに

以上が第6章の説明になります。
読書記録に締め切りを設けることで、(今回は超過しましたが)やはり焦燥感のようなものが芽生えていつもよりも進みが早く感じます。
次回の更新は5/18を予定しています。