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

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

管理人
8:05 pm

OODの名著『アジャイルソフトウェア開発の奥義』を久しぶりに読み返しながら、少しずつ感想やら気付きやらをブログにまとめていっている。

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

今回はSOLIDの3つ目L。

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

Barbara Liskovによる原則の定義は以下の通り。

S型のオブジェクトo1の各々に、対応するT型のオブジェクトo2が1つ存在し、Tを使って定義されたプログラムPに対してo2の代わりにo1を使ってもPの振る舞いが変わらない場合、SはTの派生型であると言える。

『アジャイルソフトウェア開発の奥義』p.144の引用文から更に引用

わかりづらい…。UMLっぽい図にすると以下のようになる。

ボブおじさんは以下のようにまとめてくれている。

派生型はその基本型と置換可能でなければならない。

同書 p.144

10.3では、一見正しいように見えて実はLSPに不適合な例として長方形(Rectangle)と正方形(Square)の例が取り上げられている。数学的には、正方形は長方形の一種であり、「IS-A関係」が成り立つ正しい派生関係のようである。

しかし、うまくいかないケースとして以下のようなコードが提示されている。

void foo(Rectangle r) {
  r.setWidth(5);
  r.setHeight(4);
  assert(r.area() == 20);
}

rがSquareの場合、setHeight(4)によって幅も4となるため、面積のアサーションがエラーとなってしまう!

このような結果になってしまうのは、利用するクライアントがRectangleに期待する振る舞いの同等性が担保されていないからだ、と述べられる。

「モデルの正当性は立場によって異なり、立場抜きに正当性を証明することは意味をなさない」

同書 p/150

LSPに準じるには、単に「IS-A関係」を満たすだけでは不十分。クライアントの立場を考え、合理的に仮定される「振る舞い」を担保せねばならないということだ。そのためにはBertrand Meyerが提唱した「契約による設計」が有効であるとして、紹介されている。

次回はSOLIDの4つ目、依存関係逆転の原則(DIP)についてだ。

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