簡單是 Python 程式設計的第一要則

2020-03-15 12:42:00

本文是 Python 之禪特別系列的第二篇,我們將要關注其中第三與第四條原則:簡單與複雜。

Il semble que la perfection soit atteinte non quand il n'y a plus rien à ajouter, mais quand il n'y plus rien à retrancher.

It seems that perfection is finally attained not when there is no longer anything to add, but when there is no longer anything to take away.

“完美並非無可增,而是不可減。”

—Antoine de Saint-Exupéry, Terre des Hommes, 1939

程式設計時最常有的考量是與複雜性的鬥爭,只想寫出讓旁人無從下手的繁雜程式碼,對每個程式設計師來講都算不上難事。倘若未能觸及程式碼的簡繁取捨,那麼 《Python 之禪》 就有了一角殘缺。

簡單勝過複雜Simple is better than complex

尚有選擇餘地時,應該選簡單的方案。Python 少有不可為之事,這意味著設計出巴洛克風格(LCTT 譯註:即誇張和不理性)的程式只為解決淺顯的問題不僅有可能,甚至很簡單。

正因如此,程式設計時應當謹記,程式碼的簡單性是最易丟失,卻最難復得的。

這意味著,在可以選用函數來表達時不要去引入額外的類;避免使用強力的第三方庫往往有助於你針對迫切的問題場景設計更妥當的簡短函數。不過其根本的意圖,旨在讓你減少對將來的盤算,而去著重解決手頭的問題。

以簡單和優美作為指導原則的程式碼相比那些想要囊括將來一切變數的,在日後要容易修改得多。

複雜勝過錯綜複雜Complex is better than complicated

把握用詞的精確含義對於理解這條令人費解的原則是至關重要的。形容某事複雜complex,是說它由許多部分組成,著重組成成分之多;而形容某事錯綜複雜complicated,則是指其包含著差異巨大、難以預料的行為,強調的是各組成部分之間的雜亂聯絡。

解決困難問題時,往往沒有可行的簡單方案。此時,最 Python 化的策略是“自底向上bottom-up”地構建出簡單的工具,之後將其組合用以解決該問題。

這正是物件組合object composition這類技術的閃耀之處,它避免了錯綜複雜的繼承體系,轉而由獨立的物件把一些方法呼叫傳遞給別的獨立物件。這些物件都能獨立地測試與部署,最終卻可以組成一體。

“自底建造” 的另一例即是單分派泛函數singledispatch的使用,拋棄了錯綜複雜的物件之後,我們得到是簡單、幾乎無行為的物件以及獨立的行為。