第八章 設計原則

2022-05-29 13:12:09 字數 2451 閱讀 7600

模擬是避免做傻事的最佳方式。

到目前為止我們一直致力於應用程式編碼之前的事情上,如收集需求、分析、編寫功能列表、繪製用例圖等。當然,在某些地方真的必須編寫一些**,那是設計原則真正開始產生作用的地方。

設計原則:是能被應用到設計或編寫程式**中的工具或技術,讓程式**更可維護、根具靈活性或者更易擴充套件。

oo原則:

1.封裝變化之物

2.對介面程式設計,而不是對實現

3.應用程式中的每乙個類只有乙個改變的理由

4.類是關於行為與功能的。

第乙個設計原則:

開閉原則(ocp, open-closed principle)

ocp允許改變(allowing change),但是以不需要修改現有程式**的方式進行。即**易擴充套件,但是擴充套件的時候不能修改原有的**。

ocp:類應該允許為擴充套件而開放,禁止為修改而關閉(closed for modification)

ocp是封裝(encapsulation)與抽象化(abstraction)的結合。將保持不變的行為抽取到基類中,然後將程式**鎖住以禁止修改。當需要新的或不同的行為時,你的子類會通過擴充套件基類來處理這項改變。這是封裝著力的地方:你正在封裝變化之物(子類中的行為),將它與不變之物(基類中的共同行為)分開。

運用ocp的唯一方法是擴充套件其他類嗎?

不,只要你的程式**禁止為修改而關閉,但允許為擴充套件而開放,就是在運用ocp。例如,在類中有一些private(私有)方法,那些方法便是禁止為修改而關閉——沒有其他程式**能弄亂它們,但接著你可以增加一些以不同方式呼叫這些private方法的public方法。你正在擴充套件這些private方法的public方法的行為,而無需改變它們。這是乙個ocp運作的另乙個例子。

第二個設計原則:

不自我重複原則(dry,don't repeat yourself principle)

dry:通過將共同之物抽取出來並置於單一地方來避免重複的程式**。

dry關係到讓系統中每乙個資訊與行為的片段都儲存在單

一、合理的地方。

第三個設計原則:

單一職責原則(srp,single responsibility principle)

系統裡的每乙個物件應該具有單一職責,所有物件的服務都應該聚焦在實現該職責上。

當你的每乙個物件都只有乙個改變的理由時,你已經正確的實現單一職責原則。

srp和dry聽起來蠻像的,它們是相關的,dry是關於把乙個功能片段放在單一地方,如乙個類;而srp是關於確認乙個類只做一件事,而且把事情做好。

在良好的應用程式裡,乙個類只做一件事且把事情做好,並且沒有其他類共同分擔該行為。

讓每乙個類只做一件事,是不是有點限制?

不,要知道,類所做的那一件事可以是相當大的一件事。如,棋盤遊戲系統框架中board類完成了很多不同的小任務,但全都關係到同一件大事:處理遊戲裡的棋盤,而那是board類所做的一切,所以那是使用srp的好例子。

使用srp有助於讓類保持較小,因為它們只做一件事,對嗎?

不,srp通常會讓你的類更大。因為你不把功能分散到許多類中,往往會放更多的東西到類中。使用srp通常導致較少的類,而這一般會讓你的整個應用程式在管理和維護上簡單得多。

srp聽起來像內聚力(cohesion),兩者有什麼關係?

內聚力是srp的另乙個名稱,假如你在編寫具有高度內聚性的軟體,就表示你在正確的運用srp。

第四個設計原則:

liskov替換原則(lsp,liskov substitution principle)

liskov替換原則:子型別(subtype)必須能夠替換其基型別(base type)。

lsp完全關係到設計良好的繼承。當你從乙個基類繼承下來時,你必須能用你的子類替換該基類且不會把事情弄糟,否則,你就錯誤的使用了繼承。

誤用繼承的程式**是難以理解的。

使用繼承時,你的子類會從它的父類獲得所有的方法,即使你並不想要那些方法。假如你錯誤的使用繼承,將會得到許多你不想要的方法,因為它們可能另你的子類不合理。

除了繼承之外,還有什麼好的方法?

將功能委託給其他類。

委託:是將特定工作的責任委派給另乙個類或方法。它是繼承的幾個替代做法之一。

何時使用委託?

委託最好在你想要使用另乙個類的功能時使用,依照原樣,完全沒有改變其行為。

假如你需要使用另乙個類的功能性,但不想改變該功能性,考慮以委託代替繼承。

組合:將來自其他多個類的行為集合起來。

何時使用組合?

當你想要使用由介面所定義的行為,並且從該介面的種種實現中進行選擇是,組合是最具有威力的,不論是在編譯期間還是在執行時。

組合讓你使用來自一組其他類的行為,並且可以在執行時切換該行為。

若物件由其他物件組成,當擁有物件(owning object)被銷毀時,被擁有物件(即組合的一部分)也跟著消失。

在組合中,由其他行為所組成的物件擁有那些行為。當物件被摧毀時,其所有行為也被摧毀。組合中的行為不存在於組合本身以外。

聚合:當乙個類被用作另乙個類的一部分時,但仍然可以存在於該類之外。

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

第八章(筆記)

能在 中進行記憶體單元的定址的暫存器只有4個,分別是bx si di bp 其中bx bp 是基址,bx對應的段位址是ds,bp對應的段位址是ss si di 是變址,單獨使用時段位址是ds,組合使用段位址是跟隨組合的基址對應的段位址 中進行記憶體單元定址彙總 si di bx bp 常量 si 常...

第八章 字典

d 空字典 d 這就是字典 d dict.fromkeys a b d dict zip keyslist,valslist d dict name bob age 22 建立字典的函式 d name 通過索引key獲取對應的value d.keys 返回d字典物件所有key,返回乙個列表 d.va...