軟件設計(架構)每每在項目開發中起到很是關鍵性的做用,至少它是可以工做。良好的軟件設計包含了:靈活性、可伸縮性、可行性、可複用性、安全性,經過該一系列的定義,使咱們影響到了軟件功能的設計和特徵。數據庫
過分設計一詞在英文中稱爲"over design",over意思是太多,design意思是設計、構思,經過教科書上面的解釋,意味着你設計的或構思的太多了,即爲過分設計。安全
什麼是過分設計?設計出來的系統比恰到好處要複雜或臃腫的多,過分的封裝、繼承、接口或是大量的無用配置方法,其實就是用戶須要一把殺雞的刀,而你卻設計出了殺牛刀或是電鋸。微信
過分設計一般來自於開發者將問題過於複雜化或是前瞻性欠缺。架構
在咱們平常所犯的錯誤中,大部分是來自於前者,至於後者的欠缺,須要必定的項目經驗和洞察力來支撐,可以合理的預判和考慮需求會哪一個方向發展。數據庫設計
在前者,問題複雜化會引入大量額外的代價,如成本上升,系統缺陷增大、提高維護成本、下降系統性能。而高性能和可維護性都是系統的隱性需求,若是這些也沒實現好,那就可能屬於設計錯誤。性能
可是從客觀角度來看,可以進行過分設計的,多半設計能力高於設計不足的,過分的設計改回來的成本也比設計不足的改過去的成本低的多,在此須要更多地去權衡"利與弊"。測試
以系統充值爲例,最初你設計的系統只須要一個支付寶功能,你的數據庫設計以下:編碼
id primary key int //主鍵 user_id int//充值用戶 status int //-1充值失敗,0充值中,1充值成功 order_no string //第三方支付系統訂單號 amount decimal //金額
可是沒過多久,你的系統須要接入另外一個支付系統-微信,須要區分用戶是經過微信仍是支付寶充值的,因而你的數據庫設計便成了如下模樣設計
id primary key int //主鍵 user_id int//充值用戶 status int //-1充值失敗,0充值中,1充值成功 order_no string //第三方支付系統訂單號 platform string //第三方交易平臺 amount decimal //金額
可是你想了下,感受可能之後須要接入銀聯支付,須要記錄是哪張銀行卡支付的,而後你又想了下,既然已經接入了銀聯支付,那順便就再完善如下,支持國際支付,如美圓充值,港幣充值,而後須要記錄上當地充值的匯率及當地支付時間,最終你花了一天的時間,將數據庫改爲了這樣code
id primary key int //主鍵 user_id int//充值用戶 status int //-1充值失敗,0充值中,1充值成功 order_no string //第三方支付系統訂單號 platform string //第三方交易平臺 amount decimal //金額 currency string //貨幣:CNY USD HKD bank_id int //銀行卡ID rate decimal // 充值匯率 local_pay_time //當地支付時間
完成基本設計後,你花了4周的時間完成編碼和測試,最終交付了上去,然而系統的初衷只是須要簡單區分的是微信充值或支付寶充值,而因過分設計帶來的額外成本和缺陷是很是巨大的,爲此咱們須要盡力讓本身作的恰到好處而且避免過分設計。
避免過分設計的最佳方法就是「不要設計的太遠」,未了解實際將來,就作出了各類預設和判斷,爲系統增長了額外的負擔。
正如scrum(敏捷開發)所倡導的Evolutionary Design(演進式設計),將每一次的重構和迭代都映射和更新到最新的設計中來,從而最大限度的知足系統的功能性需求和非功能性需求。
當你手裏握着一把錘子時,不要把全部看到的,都當成釘子。