函数设计概念和指南
以下內容翻譯至《Learning Python》17章的Function Design Concepts一節。有些地方翻譯的不到位,敬請諒解,建議閱讀原文,下面是原文翻譯。
當你開始使用函數的時候,你馬上就會面對的一個問題是“如何把多個部件結合到一起”,例如如何把一個任務分解成多個有目的的函數(內聚),函數之間如何通訊(耦合)等等。在函數的設計過程中你需要考慮內聚(cohesion)、耦合(Coupling)、函數的大小等一系列問題,這些都會影響到函數結構的分析和設計。下面為Python的初學者提供幾條通用的設計指南。 耦合:使用“參數”做輸入,用“返回”做輸出。我們應該努力使一個函數獨立于函數以外的東西。“參數”和“返回”通常都是使函數和外部隔離的最好的方法。 耦合:只在萬不得已時候才使用全局變量。全局變量通常都是一種很差勁的函數間通訊的方式會導致若干函數間的相互依賴、時間選擇(timing issue)等問題,并且最終從而使程序變得難以調試、維護和修改。 耦合:除非調用者期望,否則不要改變“可改變”的參數。函數能夠改變部分傳遞過來的參數的值。但就和全局變量一樣,這會導致調用和被調用函數間的依賴,從而使得函數變得特別的“特殊”和“易碎”。 內聚:每個函數應該有它自己單一的、唯一的目的。一個設計良好的函數應該只做一件事情,對函數功能的描述用一句簡單的話就可以加以總結。當你發現對某個函數的描述過于寬泛的(例如,這個函數實現了我所有的程序),或是描述內容中包含了很多的關聯(例如,這個函數給店員增加提成并提交一個pizza訂單),你可以考慮將這個函數分割成幾個獨立的更為簡單的函數。否則就無法重用混雜在一起的代碼。 函數大小:每個函數都應該相對的小。這個原則實際上會和上面那個內聚目標關聯在一起的。如果你的函數需要占據多個頁面話,最好能夠分割他們。在Python編程中如果出現某個function要依賴很長的、嵌入很深的嵌入函數這通常就是設計有問題的信號。讓函數保持小且簡單。 耦合:避免直接修改在另一個模塊文件中的變量。作為參考,要謹記跟全局變量會耦合函數一樣,跨多個模塊文件修改變量會導致模塊變得難以理解和重用。只要有可能就要使用存取方法,而不是直接的賦值語句。 下面這張圖是對上述幾條規則的總結。圖的左邊是函數的輸入(包括了參數、全局變量、文件/流等等),圖的右邊是函數的輸出(包括了返回語句、也變參數、全局變量)。很多函數設計人員更喜歡使用參數做為輸入,用返回語句做為輸出。
當然對于之前的設計準則也會有不少的例外,例如Python中面向對象的支持。對象中的函數會通過self(也就是java和c中的this)來修 改對象中的狀態信息(self.name=’bob’)。如果沒有了對象的支持,開發人員很容易會用全局變量(上例中的name就會引入一個global 的name變量來替換)來實現幾個函數間的相互調用和通訊,這樣就會引入一些副作用和危險。
總結
作者在《Learning Python》描述的這段內容超越了特定語言的,使用各種語言的開發人員都可以從以上的內容中汲取函數設計的經驗。
總結
- 上一篇: PL/0语言编译程序分析
- 下一篇: 【2016年第1期】基于大数据的小麦蚜虫