とあるプログラマーの技術ブログ
books

【読書記録】アジャイルソフトウェア開発の奥義(5) ソフトウェアを腐敗させないためのSOLID原則 O

管理人
5:01 pm

ちょっと間が空いてしまったが、前回に続きSOLID原則。

第9章 オープン・クローズドの原則(OCP)

オープン・クローズドの原則とは以下である。

ソフトウェアの構成要素(クラス、モジュール、関数など)は拡張に対して開いて(オープン:Open)いて、修正に対して閉じて(クローズド:Closed)いなければならない。

『アジャイルソフトウェア開発の奥義』p.128

開いている、閉じているという表現がわかりづらいけれど、アプリケーションの仕様変更に際して、新たな振る舞い(を実装する要素)を追加することでその変更に対応できるということが、拡張に対して開いているということである。そして、そのように振る舞いを拡張したとしても、「そのモジュールのソースコードやバイナリコードはまったく影響を受けない」ことが、修正に対して閉じていることだと書かれている。

一見すると矛盾したこの二つの属性を実現する鍵は抽象にある。インタフェース(抽象)と実装(具象)を分離し切り離すことができれば、実装をすげ替えることによって振る舞いを拡張できる、ということだ。その具体的な手段としてStrategyパターンとTemplate Methodパターンについて言及されている(この二つは後に14章でセットで紹介される)。

実際にはこれらのパターンを使って振る舞いを拡張したとしても、ソースコードがまったく影響を受けないことはない。p.130の図9-2は以下のように捉えるとよいだろう(モジュールを表す箱を追加した)。

Clientは要求するインタフェースをClient Interfaceとして自身の属するモジュール内に定義する。その実装は別のモジュールとして提供され、図の例だとServerが該当する。Clientに対してServerという具体的な実装を与えるのは第三者のモジュールの役目であり、候補としてはMainプログラムやDIコンテナとなるだろう。

こうすることで、Client Moduleにおいて、振る舞いの追加という仕様変更に際してソースコードやバイナリは影響を受けなくなる。これが拡張に対して開いていて、修正に対して閉じているということだ。

もちろん仕様変更の内容が、Client Interfaceの定義済みのメソッドに影響を与えるような内容(メソッドの追加、引数の変更など)だった場合、Clientへの影響は回避できないし、その影響はインタフェースを実装するServerモジュールへも波及する。これは、Clientの方がより上位のモジュールだということだ。

ということから、どんな変更に対して設計を閉じたいのかを設計者が選択せねばならない(以下引用)。

どんなに「閉じた(Closed)」モジュールであっても、閉じることのできない変更が必ずあるのだ。つまり、すべてのケースに適用できる自然なモデルなど存在しないのだ!
あらゆる変更に対して完璧に閉じることが不可能なら、戦略的に閉じるしかない。つまり、設計する人がどういった種類の変更に対して自分の設計を閉じたいのかを選択する必要がある。

同書 p.135

次は第10章 リスコフの置換原則(LSP)。

Books
%d人のブロガーが「いいね」をつけました。