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