(1) Open for extension
(2) Closed for modification
Robert.C.Martin舉了一個Shape的例子來說明問題。關鍵的思想是,如果我們預測到了變化,就可以設計一個抽象來隔離它。但是無論模塊是如何得"封閉",都會存在一些無法對之封閉得變化。這需要設計人員對於他設計得模塊應該對那種變化封閉作出選擇,他必須猜測出最有可能發生變化的種類。然後構造抽象來隔離。這種預測能力需要經驗的積累!! 並且通常情況下都會猜測錯誤,怎麼辦,Martin給我們指出了一條道路:
(1)只受一次愚弄
我們願意被第一顆子彈擊中,然後我們會確保自己不再被同一支槍發射的任何子彈擊中
(2) 刺激變化:
第一顆子彈來的越早、越快對我們越有利:首先編寫測試,使用很短的迭代週期,儘早、經常的把軟件展示給客戶
OCP是面向對象設計的核心所在,遵循這個原則可以帶來巨大的好處,但是肆意的抽象同樣不是一個好注意,拒絕不成熟的抽象和抽象本身一樣重要!!!