软件设计入门之路
最高原則
高內聚 低耦合
正交設計四原則
- 消除重復
- 分離關注點
- 減小不必要的依賴
- 向著穩定的方向依賴
簡單設計原則
簡單設計
- 通過所有測試
- 盡可能消除重復
- 盡可能清晰表達
- 更少代碼元素
- 以上四個原則的重要性依次遞減
SOLID 原則
正交設計,OO與SOLID
SRP 單一職責原則
每個類都應該只有一個引起它變化的原因
OCP 開放封閉原則
對擴展開放(只需要增加新的類),對修改封閉(原則上不應修改原有的任何代碼),當然指的是被第一顆子彈擊中的時候進行這樣的設計,被第一顆子彈擊中指的是變化的方向第一次明確,如果是一個嶄新的需求,則和本原則無關,所以本原則關注的是 1到2 的過程,而不是 0到1 的過程
LSP 里氏替換原則
一個子類的實例應該能夠替換其任何父類的實例時,它們之間才具有 is-A 關系
ISP 接口隔離原則
- 不能強迫用戶去依賴那些它們不需要依賴的接口,簡單來說,就是使用多個專門的接口比使用單一的總接口要更好
- 每個接口都是 對變化的阻抗力 被很多客戶代碼依賴之后就很難擺脫這個接口了,哪怕接口不合理,某種程度上是對改善的阻抗,所以定義接口的時候要慎之又慎
DIP 依賴倒置原則
- 上層不應該依賴于下層,下層也不應該依賴于上層,雙方共同依賴于抽象層
- 一般的代碼是下層提供了什么樣的接口,上層代碼就只能使用下層提供的這些接口,但是依賴倒置可以使得上層來定義需要被使用的接口,下層來實現對應的接口,這樣使得主動權掌握在上層手中
- 同時,下層也不應該依賴于上層,而是應該依賴于上層定義的抽象的接口,這樣只要接口沒有發生變化,即時雙方各自的實現發生變化,并不會影響到需求的實現
多態
一個面孔多個形態,適時選擇,在哪個地方做選擇則會導出不同形式的多態
從數據的流動看高內聚低耦合
一個類要在其一個成員函數里面完成一個算法,其數據來源只可能有以下三個:類自身持有的數據,函數的參數,全局變量。而一個高內聚低耦合的設計應該使得每個模塊(最小單位是類)之間的交互盡可能少,算法所需的數據大都是自身持有,只有少部分數據由參數傳入或者是全局變量。
既然高內聚低耦合的設計中數據流通是盡可能少的,那么只要我們不斷根據模塊之間的數據流動來調整模塊的自身結構,就可以使得類的設計能夠做到高內聚低耦合,在這個調整的過程中,根據數據的交互關系,也就知道了哪些數據應該被定義成成員變量,哪些數據應該被定義成全局變量,哪些參數應該被當成函數參數。在考慮類之間關系的時候也需要考慮各個變量的生命周期。
軟件設計的經典書籍
- 人月神話
- SICP 函數式編程
- TDD Test Driven Design
- C++ 實現模式
- Jolt 圖書獎 軟件行業每年都會評選的優秀書籍
C++ 特點
- 多態 一個面孔多個實現,適時選擇
- 封裝 把數據隱藏起來
- 繼承 鼓勵接口繼承
- 委托
class 職責
- 價值 類的存在是為了完成什么樣的任務
- 行為 行為是一個類的靈魂,沒有行為的類就是一個簡單的數據結構包
- 邊界 類與外界的接口
好的架構
DCI 架構
六邊形架構
clean architecture
C++ 缺陷
- 全局變量,靜態全局變量的初始化順序問題
- 復雜的依賴關系,include ?
C++ 語法
- 基類的靜態成員和派生類的靜態成員是共享空間的,如果是一個基類多個派生類,則不同的派生類之間是共享基類的靜態成員的
- 能用 const& 盡可能使用 const&,包括函數參數以及返回值,需要考慮的是變量的生命周期
- 前置聲明,對象的引用和指針可以看成是同樣一個東西,都可以使用前置聲明,如果是對象的話則因為要知道分配的空間大小,所以不能使用前置聲明,如果使用到其中內部的方法,也不能使用前置聲明
visitor 設計模式與 lambda 函數
visitor 能傳的參數其實是函數指針,
一種是定義的自由函數
一種是函數類(類重載了() 運算符,能夠處理參數)
在引入lambda表達式之后,能夠很方便地完成以前需要使用函數類才能完成的功能,而且 lambda 表達式的引入也解決了定義函數類的復雜性
空對象模式
策略模式
往往策略是純算法類,則可以作為常量存在,如果內部需要數據的話,則是需要創建實例
策略不應該變成使用策略的類的成員變量
策略是閉包的 策略里面包含策略還是策略
測試的一些手段
fake 用內存數據庫替換實際數據庫
stub 將用到的函數給一個簡單的使用,鏈接不使用原本的函數,使用stub的函數
mock 一個測試框架
duck typing 模板類
關于枚舉
定義的一個枚舉類型和枚舉變量之間的關系,也是一個 is-A的關系
有時候會使用枚舉來建立一個映射關系,可以想想這個枚舉類型是不是一定是必須的,能不能直接用枚舉變量對應的映射量作為判斷的依據
組合式設計
不同類組合在一起,完成一些功能
組合式設計 Format(Length(1,Mile), BASE)
其他
- 測試是手段,設計是目的
- 閱讀源代碼的順序是 測試用例 頭文件 源代碼
- 要想學會好的設計,需要從設計理念和設計技法兩個角度去思考問題
轉載于:https://www.cnblogs.com/race-with-unknown/p/10807110.html
總結
- 上一篇: python基础复习
- 下一篇: 清远游记