簡介
在面向對象編程領域中, 開閉原則規定“ 軟體中的對象(類,模組,函式等等)應該對於擴展是開放的,但是對於修改是封閉的”,這意味著一個實體是允許在不改變它的原始碼的前提下變更它的行為。該特性在產品化的環境中是特別有價值的,在這種環境中,改變原始碼需要代碼審查,單元測試以及諸如此類的用以確保產品使用質量的過程。遵循這種原則的代碼在擴展時並不發生改變,因此無需上述的過程。
開閉原則的命名被套用在兩種方式上。這兩種方式都使用了繼承來解決明顯的困境,但是它們的目的,技術以及結果是不同的。
梅耶開閉原則
伯特蘭·邁耶一般被認為是最早提出 開閉原則這一術語的人,在他1988年發行的《 面向對象軟體構造》中給出。這一想法認為一旦完成,一個類的實現只應該因錯誤而修改,新的或者改變的特性應該通過新建不同的類實現。新建的類可以通過繼承的方式來重用原類的代碼。衍生的子類可以或不可以擁有和原類相同的接口。
梅耶的定義提倡實現繼承。具體實現可以通過繼承方式來重用,但是接口規格不必如此。已存在的實現對於修改是封閉的,但是新的實現不必實現原有的接口。
多態開閉原則
在20世紀90年代,開閉原則被廣泛的重新定義由於抽象化接口的使用,在這中間實現可以被改變,多種實現可以被創建,並且多態化的替換不同的實現。
相比梅耶的使用方式,多態開閉原則的定義倡導對抽象基類的繼承。接口規約可以通過繼承來重用,但是實現不必重用。已存在的接口對於修改是封閉的,並且新的實現必須,至少,實現那個接口。
羅伯特·C·馬丁1996年發表的文章《開閉原則》是使用這種方法的啟發式著作。在2001年,Craig Larman把開閉原則關聯到了Alistair Cockburn的名為 受護的變數的模式以及David Parnas關於 信息隱藏的討論。
參見
•SOLID- “SOLID”中的 O 指代了開閉原則