有時候,為了節(jié)省幾行代碼或者想讓你的同事對你刮目相看搬瑰,你會編寫一些更“精巧”的代碼款票,但是,編寫這種代碼是要付出代價的:犧牲了代碼可讀性和簡單性泽论。下面來看一個例子艾少,代碼1-9,對字典序列進行排序:
這段代碼有什么問題翼悴?
當然缚够,在一行代碼中,利用lambda表達式按照first_name對字典進行排序抄瓦,可以讓代碼看起來比使用for循環(huán)更加精巧潮瓶,并沒有什么問題。
但是钙姊,咋一看這段代碼毯辅,會發(fā)現(xiàn)并沒那么容易理解,尤其是對新手來說更是如此煞额,因為lambda表達式怪異的語法思恐,并沒有那么容易掌握沾谜。當然,在這里使用lambda表達式的確節(jié)省了一些代碼量胀莹,看起來貌似精巧基跑,但是,這種做法并沒有讓代碼的易讀性和容錯性更強描焰。比如媳否,這段代碼忽視了鍵值缺失的場景,同時也沒有考慮字典正確是否荆秦。
下面用函數(shù)來改寫一下這段代碼篱竭,讓其更易讀,容錯性更強步绸。函數(shù)會檢查非預期值掺逼,編寫起來也更加容易,如代碼1-10所示:
你可以看到瓤介,這段代碼檢查了所有可能的非預期值吕喘,且比之前的單行代碼更易讀。單行代碼雖然節(jié)省了代碼量刑桑,但給代碼帶來了一定的復雜度氯质。需要說明的是,并不是說單行代碼就一定不好漾月,在這里我要闡明的觀點是病梢,如果單行代碼讓你的代碼更難閱讀,請盡量避免使用梁肿。
所以,在編寫代碼的時候需要意識到這點觅彰,單行代碼有時會讓你的代碼更易讀吩蔑,有時候恰恰相反。
讓我們來看另外一個例子填抬,在這個例子中烛芬,會讀取一個CSV文件,并對所處理的行數(shù)進行計數(shù)飒责,代碼1-11所示說明了為什么代碼的可讀性如此重要赘娄,同時也說明了為什么命名在代碼可讀性中會起到重要的作用。
將代碼分割成幫助函數(shù)(helper function)可讓復雜代碼更容易閱讀宏蛉,而且在代碼碰到錯誤時更容易調(diào)試遣臼。
這段代碼在with語句中完成多個功能,為了讓代碼易讀性更強拾并,需要將從CSV文件中處理薪水的代碼放到另外一個函數(shù)里讓代碼產(chǎn)生更不易產(chǎn)生錯誤揍堰。另外鹏浅,調(diào)試這種多行代碼也會非常困難,所以在定義函數(shù)的時候屏歹,需要有明確的目標和界限隐砸。下面,將這些代碼進一步進行分割蝙眶,如代碼1-12所示:
我們在這里創(chuàng)建了個幫助函數(shù),而不是在with語句里完成所有的功能幽纷,這種做法可以讓開發(fā)人員更清晰地了解process_salary函數(shù)的功能式塌。如果你要處理更多的場景,或者從CSV文件里讀取更多的數(shù)據(jù)霹崎,可以按照上述簡單原則將函數(shù)進一步進行分割珊搀。