天天看點

【設計模式和面向對象設計】拾零(持續更新,個人零散筆記)

以後有什麼關于設計模式的心得和零散的學習都放在這歸納總結,以備自己溫習助記所用,不成體系,沒有深度,自娛自樂,嚴重歡迎拍磚,不歡迎說風涼話的童鞋。

1.關于設計模式分類

【設計模式和面向對象設計】拾零(持續更新,個人零散筆記)

這是Gof的分類方式,從面對的具體事物上将模式分為兩個大類:

Class模式:在具體化時需要使用繼承(extends) Object模式:在實作時除了接口繼承(implements)外不需要其他關鍵字。這個情況比上一種的模式多得多,也說明了在面向對象程式設計中提倡面向接口程式設計而不是基于繼承。

從動作上,模式被分為三類:

建立型模式:關注對象的建立。 結構型模式:關注程式的結構化組織方式,屬于靜态模型模式。 行為型模式:關注各個對象在運作時如何互動,屬于動态模型模式。

2.關于設計模式和面向對象設計

不要關注設計模式之間的關系,知道确實都互相有關聯就可以了。 公有繼承是is-a的關系,但是不要解釋為“是一個”,最好在思維時想着“其行為像一個”,注意是“行為”,或者思考時用“可以用作一個”來形容,不要通過公有繼承重用基類中已有的代碼,公有繼承是為了被重用(已經多态的使用了基對象的已有代碼)。也就是說已有的多态代碼通過調用Base的虛函數來使用Base&或者Base*,可以無縫的使用新的派生類對象。 關注模式描述的意圖、應用場景。 OOP和OOD不可混為一談,靈活開發是設計和編碼并行的,設計模式是面向對象程式員将最初設計轉化為代碼時所采用的典型的實作細節。 基于過程的程式設計,中心是資料,關注的是資料流。共享資料在子程式之間建立了耦合關系(不該有的依賴)。 基于對象的程式設計,中心是事物,關注的是互相協作的代理。對象不會把資料給其他對象,對象是一組能力。 面向對象設計的要旨就是在于将那些可能會發生變化的東西封裝,以便程式中一個部分發生變化不會根本影響其他的部分。 派生類之間的差別在于屬性,則使用資料成員表示;若在于行為則用虛函數(C++)表示。 若是對實作的繼承,則使用私有基類,更好的方法是采用組合的方法。

3.具體設計

1)C++動态記憶體的回收要注意自指派和自操作兩種特殊情況,可以使用=進行判斷也可以使用延遲delete的方式實作。

2)C++中,通常情況下,公有基類的析構函數應該被聲明為虛函數。

3)C++重載運算符和提供相同功能的成員函數之間的選擇該運算是不是大量進行,若是則采用重載運算符,若不是則使用成員函數。因為前者會帶來很多困惑,這樣的困惑需要增加代碼複雜度來保證不會産生什麼不可預料的問題。

4.關于實際開發

軟體部署的成本是IT部門預算最大的組成部分之一。

5.技巧

如果你發現一個類中除了setter和getter以外就沒有别的方法了,你可以考慮把這個類換成一個struct進行表述了,因為這樣的類意味着private資訊封裝是無意義的,其資料成員本身就應該是讀寫接口。 盡量不使用setter和getter:進行粗粒度的封裝。(如果你必須在對象之間傳遞資訊的話,可以将資訊封裝在其他對象中,方法傳回的對象用該對象所實作的接口最好。)

Money a,b,c; a.SetValue(a.SetValue() + b.SetValue()); 轉換為: a.increaseBy(b);

繼續閱讀