物件導向設計原則詳解 開放封閉原則

2021-06-04 17:14:51 字數 2183 閱讀 3615

定義:軟體實體(類、模組、函式等)應該是可以擴充套件的,但是不可修改。對於擴充套件是開放的,對於更改是封閉的。關鍵是抽象,將乙個功能的通用部分和實現細節部分清晰的分離開來。

這裡要求我們寫**要有抽象的概念。什麼是抽象?指由實體抽離出概念的思考過程。就是從眾多的物件中抽離出共同的本質的特徵。在寫**的過程中,需要抽象類的地方,只需要抓住這個類的本質功能,不要老想著它在這個工程中的具體功能。

我們繼續看開放封閉原則,這個原則要求,將乙個功能的共用部分和實現部分清晰地分離開來。因為在最初搭建架構的時候你不能**到所有將要發生的變化,那麼這個類也就不是一塵不變的,隨著在各個模組中具體實現的時候,你發現抽象的類適合這個功能,但是對另乙個功能又不適合。那麼是否要返回去修改抽象類呢?這個代價是很大的,需要重新全盤思考,還要調整具體細節。如果程式還沒發布還好一些,一旦程式發布了,那麼返回修改抽象類,影響將更大。所以在開始抽象的時候就要防止這樣的現象發生,要遵循開放封閉原則。抽象類、介面是一種標準,在程式中一旦定義好,就不能輕易去修改,需求有變化,怎麼辦呢?可以擴充套件這個介面,重寫方法,或者繼承後增加新的方法,但是一定不要去修改。

下面用兩個例子來說明開放封閉原則。

1、連線資料庫為例。

比如在程式中用到的不同型別的資料庫連線,access和oracle。直接連線如下:

class connectaccess

;persist security info=true;jet oledb:database password=", datapath, "密碼");}}

class connectoracle

}

呼叫

static void main(string args)

這樣每次都要去考慮oledbconnection的引數到底用哪個。下面修改一下。抽象乙個介面。

inte***ce connectdatabase

class connectaccess : connectdatabase

;persist security info=true;jet oledb:database password=", datapath, "密碼");

}#endregion

}class connectoracle : connectdatabase

#endregion

}

呼叫

static void main(string args)

改過後,只需關心conn用哪乙個類例項化,就可以了。不過大家可能看到,由於oracle的連線必須oracleconnection,可能優勢不容易看出來。可以參考策略模式的例子體會一下(

2、基本型別作為方法引數為例。

一般的設計原則之所以強調方法引數盡量避免基本型別,原因正在於此。比較如下兩個方法定義:

//定義1  

bool connect(string username, string password, string wifiaddress, int port)

//定義2  

bool connect(account account)

public class account

public string password

public string wifiaddress

public int port

}

相比較而言,定義2多了乙個account類的定義,connect()方法明顯更加穩定。如果connect()方法wifiaddress發生改變,定義1必須修改該方法的介面,對應的,所有呼叫connect()方法的物件都會受到影響;而定義2只需要修改account類,由於connect()方法的介面保持不變,而對於connect()方法的呼叫者並不需wifiaddress,這樣的修改就完全不會影響呼叫者,從而降低需求變化帶來的影響。

總之開放封閉原則最關鍵的是抽象,但是也並不是說一旦抽象介面、類確定就一定不能修改。只是,我們在抽象的時候就要全面思考,爭取做到不用修改,一旦需求有變化,只需在實現的時候有變動。當然,需求是千變萬化的,一旦需要改動抽象的部分,那麼只要前面嚴格遵循了該原則,影響也會小得多。當然了如果修改了,一定要進行單元測試,凡是用到的地方都要測試正確。

物件導向設計原則 開放封閉原則 OCP

顧 名思義,既開放又封閉,對擴充套件是開放的,對更改是封閉的!擴充套件即擴充套件現行的模組,當我們軟體的實際應用發生改變時,出現新的需求,就需要我們對模組進行擴充套件,使其能夠滿足新的需求!更改封閉即是在我們對模組進行擴充套件時,勿需對源有程式 和dll進行修改或重新編譯檔案!這個原則對我們在設計類...

物件導向設計模式之開放封閉原則 OCP

對修改關閉 軟體實體 類,模組,方法等 應該是可以擴充套件的,但是是不可修改的 為了使程式的擴充套件性好,易於維護和公升級 滿足ocp軟體的優點 其它important 原始設計 class graphiceditor public void drawcircle circle r public v...

設計模式原則 開放 封閉原則

定義 軟體實體應該是可以擴充套件,但是不可修改,對擴充套件開放,對更改封閉 場景 某公司需要招聘3類員工,分別是 主管,程式設計師,銷售。公司根據不同的員工的需求,配置不同的資源。比如程式設計師應該配台電腦。首先定義乙個 員工型別 列舉 using system using system.colle...