在軟件開發(fā)中,為了提高軟件系統(tǒng)的可維護(hù)性和可復(fù)用性,增加軟件的可擴(kuò)展性和靈活性,程序員要盡量根據(jù) 7 條原則來開發(fā)程序,從而提高軟件開發(fā)效率、節(jié)約軟件開發(fā)成本和維護(hù)成本。我們將在下面的幾節(jié)中依次來介紹這 7 條原則,本節(jié)首先介紹開閉原則。
開閉原則(Open Closed Principle,OCP)由勃蘭特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向?qū)ο筌浖?gòu)造》(Object Oriented Software Construction)中提出:軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉(Software entities should be open for extension,but closed for modification),這就是開閉原則的經(jīng)典定義。
這里的軟件實(shí)體包括以下幾個(gè)部分:
• 項(xiàng)目中劃分出的模塊
• 類與接口
• 方法
開閉原則的含義是:當(dāng)應(yīng)用的需求改變時(shí),在不修改軟件實(shí)體的源代碼或者二進(jìn)制代碼的前提下,可以擴(kuò)展模塊的功能,使其滿足新的需求。
開閉原則是面向?qū)ο蟪绦蛟O(shè)計(jì)的終極目標(biāo),它使軟件實(shí)體擁有一定的適應(yīng)性和靈活性的同時(shí)具備穩(wěn)定性和延續(xù)性。具體來說,其作用如下。
1、對軟件測試的影響
軟件遵守開閉原則的話,軟件測試時(shí)只需要對擴(kuò)展的代碼進(jìn)行測試就可以了,因?yàn)樵械臏y試代碼仍然能夠正常運(yùn)行。
2、可以提高代碼的可復(fù)用性
粒度越小,被復(fù)用的可能性就越大;在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,根據(jù)原子和抽象編程可以提高代碼的可復(fù)用性。
3、可以提高軟件的可維護(hù)性
遵守開閉原則的軟件,其穩(wěn)定性高和延續(xù)性強(qiáng),從而易于擴(kuò)展和維護(hù)。
可以通過“抽象約束、封裝變化”來實(shí)現(xiàn)開閉原則,即通過接口或者抽象類為軟件實(shí)體定義一個(gè)相對穩(wěn)定的抽象層,而將相同的可變因素封裝在相同的具體實(shí)現(xiàn)類中。
因?yàn)槌橄箪`活性好,適應(yīng)性廣,只要抽象的合理,可以基本保持軟件架構(gòu)的穩(wěn)定。而軟件中易變的細(xì)節(jié)可以從抽象派生來的實(shí)現(xiàn)類來進(jìn)行擴(kuò)展,當(dāng)軟件需要發(fā)生變化時(shí),只需要根據(jù)需求重新派生一個(gè)實(shí)現(xiàn)類來擴(kuò)展就可以了。
下面以 Windows 的桌面主題為例介紹開閉原則的應(yīng)用。
【例1】Windows 的桌面主題設(shè)計(jì)。
分析:Windows 的主題是桌面背景圖片、窗口顏色和聲音等元素的組合。用戶可以根據(jù)自己的喜愛更換自己的桌面主題,也可以從網(wǎng)上下載新的主題。這些主題有共同的特點(diǎn),可以為其定義一個(gè)抽象類(Abstract Subject),而每個(gè)具體的主題(Specific Subject)是其子類。用戶窗體可以根據(jù)需要選擇或者增加新的主題,而不需要修改原代碼,所以它是滿足開閉原則的,其類圖如圖 1 所示。
圖1 Windows的桌面主題類圖