所謂的 OO設(shè)計(jì)原則的目的 是 1. Extensibility距糖;2. Flexibility湿右;3. Pluggability
1. 最小職責(zé) 原則:一個(gè)類做一個(gè)職責(zé)(角色)竟趾;SRP
2. 里氏替換原則:子類不能改變 父類的 契約,即 子類不能override 父類的方法璧坟, 可以有條件 overload嗡贺;輸入?yún)?shù)更寬松, 返回參數(shù) 更嚴(yán)格抖拦;LSP
3. 依賴倒置原則:面向接口升酣,所有的 底層類和高層類(具體業(yè)務(wù)邏輯)都依賴上層的 接口定義;DIP
4. 最小接口原則: 接口或抽象類的 定義 要 包含盡量少的 方法聲明态罪;ISP
5. 迪米特原則:對(duì)依賴的對(duì)象了解盡量少的信息噩茄;通過中間層的 對(duì)象了解;
6. 組合/聚合原則:多用組合复颈,少用繼承绩聘;因?yàn)?組合可用更靈活的“復(fù)用”對(duì)象所屬類的 代碼,并且可用在runtime(運(yùn)行時(shí))動(dòng)態(tài)改變對(duì)象的行為耗啦; 使用繼承則子類全盤接受 父類的 方法實(shí)現(xiàn)(遵守里氏替換原則)凿菩,并且無法運(yùn)行時(shí)動(dòng)態(tài)改變方法實(shí)現(xiàn);所以 需要 “封裝變化”帜讲,再 組合之衅谷; strategy 模式 很好的體現(xiàn)了這個(gè)原則;
7. 開閉原則:軟件代碼(類級(jí)別)對(duì)修改關(guān)閉似将,對(duì)擴(kuò)展開放获黔;這個(gè)是理論上的蚀苛;OCP
實(shí)際的設(shè)計(jì)/開發(fā)過程應(yīng)該是: 先做領(lǐng)域模型,理解業(yè)務(wù)上要做什么事情玷氏,期望拿到什么價(jià)值堵未;這個(gè)階段切忌思考 如何抽象接口/類,如何設(shè)計(jì)類盏触; ?第二 考慮 設(shè)計(jì)層面有哪些需要抽象渗蟹,有哪些依賴,具體方法接口如何設(shè)計(jì)耻陕; ?最后才考慮 用哪種模式拙徽,那個(gè)包來實(shí)現(xiàn);