官术网_书友最值得收藏!

  • 編程與類型系統
  • (美)弗拉德·里斯庫迪亞
  • 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展這個函數,讓它遍歷任意數據結構。

如果代碼不是可組合的,那么我們需要為每種數據類型、每個數據結構和每個條件使用一個不同的函數,即使這些函數在本質上實現了相同的抽象。能夠進行抽象,然后混合搭配組件,就減少了大量的重復代碼。泛型類型使我們能夠表達這類抽象。

將獨立的組件組合起來,能夠得到模塊化系統,并減少需要維護的代碼。隨著代碼規模和組件數量的增加,可組合性會變得很重要。在可組合系統中,不同部分是松散耦合的,同時,每個子系統中的代碼不會重復。要處理新的需求,通??梢酝ㄟ^更新單個組件來完成,而不必在整個系統中做大范圍修改,同時,理解這些系統要簡單一些,因為我們可以單獨思考系統的各個部分。

主站蜘蛛池模板: 乌鲁木齐县| 天津市| 东乡| 桃园县| 泰兴市| 奉节县| 叙永县| 玉溪市| 丹凤县| 冕宁县| 温泉县| 昌都县| 宁阳县| 洛阳市| 吉首市| 顺昌县| 琼中| 常熟市| 田阳县| 如皋市| 浦县| 重庆市| 洪江市| 香河县| 监利县| 台东市| 永泰县| 民乐县| 孝义市| 保靖县| 蕲春县| 罗江县| 马公市| 牡丹江市| 卓尼县| 嘉善县| 江阴市| 马龙县| 东丰县| 盐亭县| 临沂市|