天天看點

《高階Perl》——1.6 函數式程式設計與面向對象式程式設計

現在停下來看看已經做的。已經有了一個有用的函數,total_size(),它包含了在其他應用中周遊目錄結構的有用代碼。是以為使total_size()更具普遍意義,把所有與計算大小相關的部分提出來,替換成使用者指定的任意函數的調用。結果就是dir_walk()。現在,對于任何需要周遊目錄結構并做某事的程式,dir_walk()處理周遊部分,參數函數處理“做某事”部分。通過傳遞合适的函數對給dir_walk(),可以使它做任何想要它做的事情。已經獲得了靈活性與複用dir_walk()的機會,通過提取有用的部分并參數化成兩個函數參數。這便是函數式程式設計風格的核心。

面向對象式(object oriented,oo)的程式設計風格最近受到了更多關注。oo風格的目标和函數式風格的一樣:期望通過把軟體分割成通用的部分提高它的可複用性。

在一個oo系統中,可以類似地轉換total_size(),但是結果看起來會不同。可以把total_size()做成一個目錄周遊對象的抽象基類,這些對象有一個方法,dir_walk(),它依次調用兩個未定義的虛方法file與directory。 (在c++中,它們稱為純虛方法(pure virtual method)。)這樣一個類本身還沒有用處,因為缺少file方法與directory方法。為了使用這個類,你要産生一個子類定義file方法與directory方法,然後産生子類的對象。這些對象将全部繼承相同的dir_walk方法。

在這個例子中,我認為函數式的風格會帶來一個更輕量級和更易用的解決方案,并使參數函數靠近它被使用的地方,而不是陷入一個類檔案裡。但重要的一點是盡管風格不同,原函數分解成的有用的組成部分卻有完全相同的結構。函數式風格使用函數式參數,面向對象式風格使用純虛方法。雖然本書的剩餘部分是關于函數式程式設計的,但許多技術也将直接适用于面向對象式程式設計風格。

繼續閱讀