在設(shè)計(jì)決策中潮剪,提到了4個(gè)原則應(yīng)對4種要求(需求充分涣楷、可理解性、可修改性抗碰、簡單)狮斗,但設(shè)計(jì)還有其他要求,簡單設(shè)計(jì)為什么沒有考慮將怎么應(yīng)對這些要求的方法納入進(jìn)自己的原則體系弧蝇?
在TDD訓(xùn)練營或重構(gòu)訓(xùn)練營中碳褒,我都會將簡單設(shè)計(jì)作為必講的知識點(diǎn)。我覺得這四條原則非常樸素看疗,也較為容易理解沙峻。并且背后支撐了考量軟件的核心的四個(gè)維度:
- 需求充分,編寫的軟件要滿足客戶需求的鹃觉,這個(gè)毋庸置疑专酗,沒什么可討論的。
- 可理解性盗扇,編寫的軟件要易于理解祷肯,這個(gè)是廣大開發(fā)人員也不會反對的事實(shí)沉填。
- 可修改性,編寫的軟件要易于修改佑笋,這個(gè)也是廣大開發(fā)人員不會反對的實(shí)施翼闹。
- 簡單,編寫的軟件要簡單蒋纬,如非必要猎荠,不要加多余的元素,但看這個(gè)點(diǎn)蜀备,很多人也不會反對关摇,但很多人不知道怎么把我。
可能你會說碾阁,軟件設(shè)計(jì)遠(yuǎn)遠(yuǎn)不止這些输虱,還有好多,比如:
- 高內(nèi)聚脂凶,低耦合
- 面向抽象編程
- 組合優(yōu)于繼承
- SOLID
- 好萊塢原則
- DRY
- KISS
- 設(shè)計(jì)模式
- 分層架構(gòu)(洋蔥架構(gòu)宪睹、整潔架構(gòu))
- 中臺
- ......
仔細(xì)想想,這些名字光鮮華麗的原則蚕钦,哪個(gè)能逃脫的了上述四個(gè)維度亭病?無一例外!
在當(dāng)下的軟件開發(fā)的上下文嘶居,所有的軟件設(shè)計(jì)理念和原則罪帖,都是在滿足需求的前提下,為了提高軟件的可維護(hù)性邮屁,而可維護(hù)性就體現(xiàn)在:容易理解胸蛛,容易修改,簡單樱报。
基于對良好軟件本質(zhì)的思考葬项,Kent Beck提出了簡單設(shè)計(jì)的四條原則:
- 通過測試。廣義上滿足客戶需求
- 揭示意圖迹蛤。講業(yè)務(wù)語言民珍,軟件模型跟業(yè)務(wù)模型一致。
- 消除重復(fù)盗飒。消除重復(fù)代碼(當(dāng)然嚷量,還有很多其他導(dǎo)致難以修改的問題)。
- 最少元素逆趣。不要增加沒必要的元素蝶溶。
沒有華麗的辭藻乃沙,用詞樸素储狭,容易被人理解债蜜。這個(gè)框架祖秒,即便初學(xué)者也能立馬用起來,他扮演了一個(gè)智者一直在對你提問田轧,促進(jìn)你去思考:
- 你寫的軟件滿足了需求了嗎暴匠?(嘿,跑偏了傻粘,PO沒說要實(shí)現(xiàn)這個(gè)功能...)
- 你這個(gè)代碼表達(dá)業(yè)務(wù)意圖了嗎每窖?(嘿,這個(gè)東西在業(yè)務(wù)上不是這么叫的...)
- 你的代碼容易修改嗎弦悉?有沒有重復(fù)窒典?(嘿,這段邏輯重復(fù)了稽莉,真討厭...)
- 這個(gè)元素對真的有用嗎崇败?(嘿,這個(gè)字段沒用上肩祥,去掉也沒有任何影響...)
初學(xué)者就可以從最基本的代碼命名、重復(fù)代碼缩膝、冗余方面去思考自己實(shí)現(xiàn)軟件的過程混狠,從很小的命名習(xí)慣(也是最重要的習(xí)慣之一)開始培養(yǎng)自己的編碼Sense,避免花里胡哨的炫技疾层,做一個(gè)接地氣的簡約開發(fā)者将饺。
掌握了簡單設(shè)計(jì)原則的標(biāo)志是:你對四條原則的優(yōu)先級的理解和沖突場景下的決策。這個(gè)在簡單設(shè)計(jì)一文中有介紹痛黎。
簡單設(shè)計(jì)只是一個(gè)開始予弧,它代表不了軟件設(shè)計(jì)的全部,它讓初學(xué)者更容易的開始湖饱。要具備軟件設(shè)計(jì)的敏銳的嗅覺掖蛤,還需要日積月累對上文提到的設(shè)計(jì)理念(不限于上述幾條)有深刻的理解。不然井厌,即便掌握簡單設(shè)計(jì)蚓庭,甚至TDD和重構(gòu),也會很快到達(dá)瓶頸期仅仆。