业务太复杂?教你如何降低软件的复杂性
轉(zhuǎn)載自??業(yè)務(wù)太復(fù)雜?教你如何降低軟件的復(fù)雜性
John Ousterhout 是斯坦福大學(xué)計(jì)算機(jī)系教授,也是 Tcl 語(yǔ)言的創(chuàng)造者。
今年四月,他出版了一本新書《軟件設(shè)計(jì)的哲學(xué)》(A Philosophy of Software Design)。這是課程講稿,160多頁(yè),亞馬遜全部是五星好評(píng)。
我還沒(méi)讀這本書,但是我看了作者在谷歌的一次演講(Youtube),介紹了這本書的主要內(nèi)容。我覺(jué)得非常值得看,大部分書教你怎么寫正確的代碼,這本書教你如何正確設(shè)計(jì)軟件。
下面我就根據(jù)演講視頻和網(wǎng)上的書評(píng),做一下筆記。
一、什么是復(fù)雜性
Ousterhout 教授認(rèn)為,軟件設(shè)計(jì)的最大目標(biāo),就是降低復(fù)雜性(complexity)。?所謂復(fù)雜性,就是任何使得軟件難于理解和修改的因素。
Complexity is anything that makes software hard to understand or to modify.復(fù)雜性的來(lái)源主要有兩個(gè):代碼的含義模糊和互相依賴。
Complexity is caused by obscurity and dependencies.模糊指的是,代碼里面的重要信息,看不出來(lái)。
依賴指的是,某個(gè)模塊的代碼,不結(jié)合其他模塊,就會(huì)無(wú)法理解。
Obscurity is when important information is not obvious.Dependency is when code can't be understood in isolation.
復(fù)雜性的危害在于,它會(huì)遞增。你做錯(cuò)了一個(gè)決定,導(dǎo)致后面的代碼都基于前面的錯(cuò)誤實(shí)現(xiàn),整個(gè)軟件變得越來(lái)越復(fù)雜。"我們先把產(chǎn)品做出來(lái),后面再改進(jìn)",這根本做不到。
Complexity is incremental, the result of thousands of choices. Which makes it hard to prevent and even harder to fix.?
二、復(fù)雜性的隔離
降低復(fù)雜性的基本方法,就是把復(fù)雜性隔離。"如果能把復(fù)雜性隔離在一個(gè)模塊,不與其他模塊互動(dòng),就達(dá)到了消除復(fù)雜性的目的。"
Isolating complexity in places that are rarely interacted with is roughly equivalent to eliminating complexity.改變軟件設(shè)計(jì)的時(shí)候,修改的代碼越少,軟件的復(fù)雜性越低。
Reduce the amount of code that is affected by each design decision, so design changes don't require very many code modifications.復(fù)雜性盡量封裝在模塊里面,不要暴露出來(lái)。如果多個(gè)模塊耦合,那就把這些模塊合并成一個(gè)。
When a design decision is used across multiple modules, coupling them together.?
三、接口和實(shí)現(xiàn)
模塊分成接口和實(shí)現(xiàn)。接口要簡(jiǎn)單,實(shí)現(xiàn)可以復(fù)雜。
Modules are interface and implementation. The best modules are where interface is much simpler than implementation.It's more important for a module to have a simple interface than a simple implementation.
好的 class 應(yīng)該是"小接口,大功能",糟糕的 class 是"大接口,小功能"。好的設(shè)計(jì)是,大量的功能隱藏在簡(jiǎn)單接口之下,對(duì)用戶不可見(jiàn),用戶感覺(jué)不到這是一個(gè)復(fù)雜的 class。
最好的例子就是 Unix 的文件讀寫接口,只暴露了5個(gè)方法,就囊括了所有的讀寫行為。
?
四、減少拋錯(cuò)
有些軟件設(shè)計(jì)者喜歡拋錯(cuò),一遇到問(wèn)題,就拋出一個(gè) Exception。這也導(dǎo)致了復(fù)雜性,用戶必須面對(duì)所有的 Exception。"反正我告訴你出錯(cuò)了,怎么解決是你的事。"
正確的做法是,除了那些必須告訴用戶的錯(cuò)誤,其他錯(cuò)誤盡量在軟件內(nèi)部處理掉,不要拋出。
Tcl 語(yǔ)言的最初設(shè)計(jì)是,unset() 方法用來(lái)刪除已經(jīng)存在的變量,如果變量不存在,該方法拋錯(cuò)。Ousterhout 教授說(shuō),這個(gè)設(shè)計(jì)是一個(gè)錯(cuò)誤,完全不應(yīng)該拋錯(cuò),只要把 unset() 定義成讓一個(gè)變量不存在,就解決問(wèn)題了。
另一個(gè)例子是,Windows 系統(tǒng)不能刪除已經(jīng)打開(kāi)的文件,會(huì)有錯(cuò)誤提醒。這也是一個(gè)設(shè)計(jì)錯(cuò)誤,有些用戶實(shí)在刪不掉這些文件,不得不重啟系統(tǒng)。Unix 的做法是,總是允許用戶刪除文件,但是不清理內(nèi)存,已經(jīng)打開(kāi)的文件在內(nèi)存里面繼續(xù)存在,因此不會(huì)干擾其他程序的運(yùn)行,那些程序退出保存文件的時(shí)候,發(fā)現(xiàn)文件不存在才會(huì)報(bào)錯(cuò)。這個(gè)設(shè)計(jì)比較好。
總結(jié)
以上是生活随笔為你收集整理的业务太复杂?教你如何降低软件的复杂性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: png图片结构分析与加密解密原理
- 下一篇: 如何在一分钟内搞定面试官