(五) 面向對象類設計原則

1. 開閉原則(the Open Closed Principle OCP)

  一個模塊在擴展性方面應該是開放的而在更改性方面應該是封閉的。因此在進行面向對象設計時要盡量考慮接口封裝機制、抽象機制和多態技術。該原則同樣適合于非面向對象設計的方法,是軟件工程 設計方法的重要原則之一。

  我們以收音機的例子為例,講述面向對象的開閉原則。我們收聽節目時需要打開收音機電源,對準電臺頻率和進行音量調節。但是對于不同的收音機,實現這三個步驟的細節往往有所不同。比如自動收縮電臺的收音機和按鈕式收縮在操作細節上并不相同。因此,我們不太可能針對每種不同類型的收音機通過一個收音機類來實現(通過重載)這些不同的操作方式。但是我們可以定義一個收音機接口,提供開機、關機、增加頻率、降低頻率、增加音量、降低音量六個抽象方法。不同的收音機繼承并實現這六個抽象方法。這樣新增收音機類型不會影響其它原有的收音機類型,收音機類型擴展極為方便。此外,已存在的收音機類型在修改其操作方法時也不會影響到其它類型的收音機。

圖1是一個應用OCP生成的收音機類圖的例子:

2. 替換原則 (the Liskov Substitution Principle LSP)

  子類應當可以替換父類并出現在父類能夠出現的任何地方。這個原則是Liskov于1987年提出的設計原則。它同樣可以從Bertrand Meyer 的DBC (Design by Contract) 的概念推出。

  我們以學生為例,夜校生為學生的子類,因此在任何學生可以出現的地方,夜校生均可出現。這個例子有些牽強,一個能夠反映這個原則的例子時圓和橢圓,圓是橢圓的一個特殊子類。因此任何出現橢圓的地方,圓均可以出現。但反過來就可能行不通。

Liskov的相關圖示見下圖:

  運用替換原則時,我們盡量把類B設計為抽象類或者接口,讓C類繼承類B(接口B)并實現操作A和操作B,運行時,類C實例替換B,這樣我們即可進行新類的擴展(繼承類B或接口B),同時無須對類A進行修改。

?

3. 依賴原則 (the Dependency Inversion Principle DIP)

  在進行業務設計時,與特定業務有關的依賴關系應該盡量依賴接口和抽象類,而不是依賴于具體類。具體類只負責相關業務的實現,修改具體類不影響與特定業務有關的依賴關系。在結構化設計中,我們可以看到底層的模塊是對高層抽象模塊的實現(高層抽象模塊通過調用底層模塊),這說明,抽象的模塊要依賴具體實現相關的模塊,底層模塊的具體實現發生變動時將會嚴重影響高層抽象的模塊,顯然這是結構化方法的一個"硬傷"。面向對象方法的依賴關系剛好相反,具體實現類依賴于抽象類和接口。為此,我們在進行業務設計時,應盡量在接口或抽象類中定義業務方法的原型,并通過具體的實現類(子類)來實現該業務方法,業務方法內容的修改將不會影響到運行時業務方法的調用。

4. 接口分離原則(the Interface Segregation Principle ISP)

  采用多個與特定客戶類有關的接口比采用一個通用的涵蓋多個業務方法的接口要好。ISP原則是另外一個支持諸如COM等組件化的使能技術。缺少ISP,組件、類的可用性和移植性將大打折扣。這個原則的本質相當簡單。如果你擁有一個針對多個客戶的類,為每一個客戶創建特定業務接口,然后使該客戶類繼承多個特定業務接口將比直接加載客戶所需所有方法有效。

  下圖展示了一個擁有多個客戶的類。它通過一個巨大的接口來服務所有的客戶。只要針對客戶A的方法發生改變,客戶B和客戶C就會受到影響。因此可能需要進行重新編譯和發布。這是一種不幸的做法。

?

  以上四個原則是面向對象中常常用到的原則。此外,除上述四原則外,還有一些常用的經驗諸如類結構層次以三到四層為宜、類的職責明確化(一個類對應一個具體職責)等可供我們在進行面向對象設計參考。但就上面的幾個原則看來,我們看到這些類在幾何分布上呈現樹型拓撲的關系,這是一種良好、開放式的線性關系、具有較低的設計復雜度。一般說來,在軟件設計中我們應當盡量避免出現帶有閉包、循環的設計關系,它們反映的是較大的耦合度和設計復雜化。

轉載于:https://www.cnblogs.com/wolfrickwang/p/3326068.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376407.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

160 - 30 cracking4all.1

環境 Windows XP sp3 工具 exeinfope ollydbg 查殼 無殼的VB程序 測試 這個serial藏得比較里面,多點幾下才能看到 字符串搜索: 00403338 . 50 push eax ; /var18 00403339 . 51 …

java2s.com

http://www.java2s.com/Code/JavaAPI/CatalogJavaAPI.htm轉載于:https://www.cnblogs.com/reborn2012/p/3326445.html

MVC5 + EF6 入門完整教程

MVC5 EF6 入門完整教程 原文:MVC5 EF6 入門完整教程第0課 從0開始 ASP.NET MVC開發模式和傳統的WebForm開發模式相比,增加了很多"約定"。 直接講這些 "約定" 會讓人困惑,而且東西太多容易忘記。 和微軟官方教程不同&#xff0c…

160 - 31 cracking4all.2

環境 Windows xp sp3 工具 exeinfope ollydbg 查殼 無殼VB程序 測試 輸入1234567 OD載入字符串搜素,往上翻就看到這里,我截取部分片段: 00402C26 . 8D55 98 lea edx,dword ptr ss:[ebp-0x68] ; 取serial長度…

stm32的DFU使用方法

stm32的dfu看上去是個很高級的東西,似乎可以通過USB給內部flash、外部spi flash、外部nor等東西刷寫數據、把數據讀出來,但是用了一下感覺確實有點麻煩。 先不管原理是怎樣的,使用方法是這樣: 1、先下載這個Dfuse,然后…

160 - 32 genocide1

環境 Windows xp sp3 工具 upx exeinfope ollydbg 查殼 發現是upx殼,手脫的話會不干凈,影響OD分析。 所以就直接用 upx -d 脫了 手脫: upx -d: 用upx -d 脫的版本進行分析。 第一次運行時顯示這個: 缺少Reg.dat…

vector function trmplate

/*vectorfunction templateprogrammer:qpz */ #include <iostream> #include <vector> #define MAX 10 using namespace std; class Myclass{ private:vector <int> vel;//可均分的動態數組 public:void Add(int x){vel.push_back(x);}void print(); }; void…

軟件工程個人項目11061180王宇杰

&#xff08;1&#xff09;我完全不知道要花費多少時間&#xff0c;因為從來沒有進行過類似的項目&#xff0c;涉及的很多問題我以前也根本不會。簡單的估計一下&#xff0c;這至少是15小時的工作量。 &#xff08;2&#xff09;前期的準備工作很耗時間&#xff0c;因為一開始根…

160 - 33 Cruehead.1

環境 windows xp sp3 工具 exeinfo pe ollydbg 查殼 無殼的匯編程序&#xff08;OD載入的出來的&#xff09; 測試 當name輸入為數字時&#xff0c;會彈出兩次錯誤框。 OD載入搜字符串&#xff0c;發現有兩個地方&#xff1a; 0040134D /$ 6A 30 push 0x…

mac osx 10.10 pip 安裝問題

在mac osx 升級到 10.10(Yosemite)以后&#xff0c;用pip以及easy_install 安裝python包的時候&#xff0c;如果包需要編譯&#xff0c;就會編譯失敗&#xff0c;錯誤如下&#xff1a; build/temp.macosx-10.10-x86_64-2.7/greenlet.o -o build/lib.macosx-10.10-x86_64-2.7/gr…

英文系統上網頁內容亂碼的解決

今天隨便寫了一段html 代碼示例&#xff0c;代碼如下&#xff1a; <html lang"zh-cn"> <head> </head> <body> <h1>HTML 教程目錄</h1> <ul> <li><a href"#C1">第一章</a></li> <li…

160 - 34 Cruehead.3

環境 windows xp sp3 工具 1.exeinfo pe 2.ollydbg 3.WinHex 查殼 和上一個一樣&#xff0c;OD載入判斷出 測試 運行后發現是沒有任何提示&#xff0c;而且沒有輸入serial的窗口&#xff0c;通過任務管理器可以看出程序的名稱寫有“Uncracked”&#xff0c;可以猜測…

sed awk tr等文本處理命令

指定行范圍替換&#xff1a; sed -i "520,950s/\(.*\)\(HOST_CMD_.*\)\(,\)/\1{ \2, \"\2\" },/g" hostCmdMacro.h linux shell sed命令與轉義字符 A“2013/06/09“ sed “s#hello#$A#" sed 指定行范圍匹配 刪除文本中的重復行(sortuniq/awk/sed) 263…

160 - 35 cupofcoffe.1

環境 Windows xp sp3 工具 1.exeinfo PE 2.ollydbg 查殼 OD載入后可以看出是VB程序 測試 輸入&#xff1a;12345678 顯示的內容發生了改變&#xff0c;也不影響查找字符串。 004FEC14 > \8B4D E8 mov ecx,dword ptr ss:[ebp-0x18] 004FEC17 . 51 …

centos7 安裝mysql

http://my.oschina.net/u/919612/blog/310533 測試可用 隨后又想到了&#xff0c;做個iso鏡像&#xff0c;然后掛載在CDrom上&#xff0c;然后安裝JDK成功&#xff0c;但是mysql安裝失敗&#xff0c;可能由于只從官網上下載了server&#xff0c;而沒有解決依賴關系。 最后&…

ecshop后臺增加模板頁的方法

CShop的動態模板機制是一個非常靈活的系統,管理員可以在后臺根據自己的要求調整模板模塊的顯示位置。本文詳細講解了如何修改ECSHOP內部結構使得用戶可以添加自己的模板頁從而方便靈活的使用系統自帶的模板系統和廣告位系統。 如下圖所示 可以看到ECShop支持設置的模板一共如上…

160 - 36 cupofcoffe.2

環境 Winows xp sp3 工具 1.exeinfo PE 2.ollydbg 查殼 OD載入后看出是VB程序 測試 輸入&#xff1a;12345678 繼續OD搜字符串&#xff1a; 00521688 . 68 60054500 push cupofcof.00450560 ; UNICODE ".........." 0052168D …

使用VS2010 + VirtualDDK 調試驅動

總的說來比 WINDBG要簡單的多 可以看到詳細的調試內容 但是好像不知道怎么弄成一般的工程 待定今天玩了一下 感覺還是有點麻煩 網站&#xff1a; http://techird.blog.163.com/blog/static/1215640362011112385241568/ 轉載于:https://www.cnblogs.com/zcc1414/p/3982457.html…

160 - 37 CyberBlade.1

環境 Windows xp sp3 工具 1.exeinfo PE 2.ollydbg 查殼 OD載入是VB程序。 測試 OD載入直接搜字符串。 這個是當輸入為空時會彈出消息框告訴你要輸入9個字符。 0040E005 > \8B4D E4 mov ecx,dword ptr ss:[ebp-0x1C] 0040E008 . 51 push…

恢復回收站里一篇文章 --我的實習生涯

今天想恢復我回收站里的一篇日志竟然沒這功能&#xff0c;無奈只好ctrlv出來了。半年前的文章&#xff0c;現在已經就業了&#xff0c;工作挺開心的。。。原文如下: 今天是年前的最后一個周6&#xff0c;公司的SVN掉了&#xff0c;我就賣賣呆在CSDN上瞎轉轉&#xff0c;也寫寫…