- 編程與類型系統
- (美)弗拉德·里斯庫迪亞
- 935字
- 2021-01-29 11:51:24
1.2.4 可組合性
假設我們想找出一個數值數組中的第一個負數,以及一個字符串數組中的第一個單字符字符串。如果沒有思考如何把這個問題分解為可組合的副本,然后拼接成一個可組合的系統,那么可能會創建兩個函數:findFirstNegativeNumber()和findFirstOneCharacterString(),如程序清單1.8所示。
程序清單1.8 不可組合的系統

這兩個函數分別搜索第一個負數和第一個單字符字符串。如果找不到這樣的元素,則函數返回undefined(這是通過不使用return語句退出函數來隱式實現的)。
假設現在有了一個新的需求:當找不到滿足條件的元素時,就記錄一個錯誤。那么,我們需要同時更新兩個函數,如程序清單1.9所示。
程序清單1.9 更新后的不可組合的系統

這已經不太理想了。如果我們忘記在所有地方應用更新,問題就更嚴重了。在大型系統中,這些問題會加劇。仔細觀察每個函數做的工作,我們會發現它們的算法是相同的,只是在一個函數中,我們根據一種條件操作數值,而在另一個函數中,我們根據不同的條件操作字符串。我們可以提供一個泛型算法,將其操作的類型和檢查的條件參數化,如程序清單1.10所示。這種算法不依賴于系統的其他部分,所以我們能夠單獨處理它。
程序清單1.10 可組合的系統

如果覺得語法看上去有點奇怪,請不必擔心。第5章會講解n => n < 0這樣的內聯函數,第9章和第10章將講解泛型。
如果想在這個實現中添加日志記錄,只需要更新first的實現。更好的情況是,如果我們找出了一種更加高效的算法,則只要更新實現,就可以讓所有調用者受益。
在第10章討論泛型算法和迭代器的時候將會看到,我們可以使這個函數變得更加通用。目前,它只操作某個類型T的一個數組??梢詳U展這個函數,讓它遍歷任意數據結構。
如果代碼不是可組合的,那么我們需要為每種數據類型、每個數據結構和每個條件使用一個不同的函數,即使這些函數在本質上實現了相同的抽象。能夠進行抽象,然后混合搭配組件,就減少了大量的重復代碼。泛型類型使我們能夠表達這類抽象。
將獨立的組件組合起來,能夠得到模塊化系統,并減少需要維護的代碼。隨著代碼規模和組件數量的增加,可組合性會變得很重要。在可組合系統中,不同部分是松散耦合的,同時,每個子系統中的代碼不會重復。要處理新的需求,通??梢酝ㄟ^更新單個組件來完成,而不必在整個系統中做大范圍修改,同時,理解這些系統要簡單一些,因為我們可以單獨思考系統的各個部分。
- INSTANT Mock Testing with PowerMock
- Android開發精要
- Mastering Selenium WebDriver
- Leap Motion Development Essentials
- CouchDB and PHP Web Development Beginner’s Guide
- Unity 5.x By Example
- VMware虛擬化技術
- 圖數據庫實戰
- ExtJS Web應用程序開發指南第2版
- Image Processing with ImageJ
- Greenplum構建實時數據倉庫實踐
- Python滲透測試編程技術:方法與實踐(第2版)
- 虛擬現實:引領未來的人機交互革命
- 分布式系統架構與開發:技術原理與面試題解析
- Python機器學習