程式中曾經包含子程式和函數(可能我沒有經歷這種年代),如今,程式中僅有函數這種方式保留下來。
程式語言中的函數,分為內建函數和自訂函數或類別方法。內建函數可以直接調用,而自訂函數是程式設計師編寫的。
函數是程式的極其重要的組成部分,要寫好,需要遵守一些原則。
函數要短小。函數中不應該容得下嵌套結構,如if...else等。在if..else、while、for或foreach等嵌套結構中,程式碼不應該超過一行,這唯一一行程式碼,是對函數的呼叫。請看代碼A。
function test($bool){ $age = 0; if($bool){ $age = 5; }else{ $age = 0; } return $age; } $bool = true; echo test($bool);
上面這段程式碼,函數體中包含if...else,嵌套結構,根據」函數要短小「的原則,上面的程式碼應該改寫為程式碼B:
function testTrue(){ $age = 5; return $age; }
function testFalse(){ $age = 0; return $age; }
$bool = true; if($bool){ echo testTrue(); }else{ echo testFalse(); }
我喜歡用程式碼B風格的代碼。它能簡化主幹程式碼(抽象層次高的程式碼)。實際程式設計中,我綜合了程式碼A和程式碼B,因為我在程式碼B的基礎上增加了一個函數test。請看代碼C。
function testTrue(){ $age = 5; return $age; } function testFalse(){ $age = 0; return $age; } function test($bool){ $age = 0; if($bool){ $age = testTrue(); }else{ $age = testFalse(); } $bool = true; echo test($bool);
三種風格的程式碼,孰優孰劣?我無法分辨。程式設計實作中,我選用C風格的程式碼。寫出短小的函數,原因是,短小的函數,易讀,方便調試。當然,也受制於許多程式設計師程式設計實務中總結出的程式設計原則:一個函數只做一件事情。
《程式碼整潔之道》用這樣的話強調這個程式設計原則:三十多年來,無數人用無數不同的表達方式傳遞出這樣一個觀點,一個函數應該只做一件事情;該函數應該做好這件事情;函數應該做完這件事情。
掌握這項原則,必須弄清楚:怎麼叫一件事情?一件事情,是指這些事情都在同一個抽象層次。舉個例子,函數A把訂單資料存到資料庫,並在這個過程中建立券號、發送簡訊。表面上看,有三件事情,但由於它們都是同一個抽象層次上的事情,所以,實際上,只有一件事情。如果用創建券號中的程式碼來取代建立券號函數,函數A就是做了兩件事。
此外,「從上往下「讀函數(to...do),也是區分函數是否做了一件事情的好方法。初級程式設計師要學會這項技巧,並不容易。
看函數的區段,也就是一個函數能否再分拆出其他的函數,也是辨識函數是否只做一件事情的方法。
我覺得,根據」抽象層次「,就可以判斷函數是否只做了一件事情。