寫程式時該追求什麼,什麼是次要的?

2021-09-05 20:59:44 字數 1473 閱讀 6179

就我看來,一段程式,最該關注的是「邏輯表現」,次要的「效能」等問題的優化。當然,肯定也會有需要追求效能的場景,不過這並不是「追求」出來的,而是在大量經驗累計情況下做出的正確決策。就算在那種情況下,「邏輯表現」還是非常重要的。

「邏輯表現」的意思,就是如何用程式清晰地體現你的邏輯。每個程式的目標都是解決某個特定的問題,解決問題便有思路,這個思路用程式表現出來便是邏輯。與初中高中證明數學題一樣,邏輯清晰,並把它表達出來是最終的目標,而現在也只是把原本寫在紙上的文字,通過**表現出來而已。

寫**,其實也是用一種特殊的語言——程式語言,而不是文本來表達一段意思。我們平時寫文章需要注意分段,分層,分條理,寫程式也是一樣。可能由於水平有限,你一時還無法寫出華麗俊秀的文字,但是寫文章的首要目標還是「清晰」,要讓別人明白你的意思。寫程式也是一樣。在寫程式時,你不應該總想著用什麼技巧,追求這些技巧所帶來的好處。

老趙承認,每個技巧都是有其作用的,否則就是「笑話」,談不上「技巧」。不過有得往往就有失,某段技巧必然有其缺陷。例如在之前「陣列元素交換」一題中,有朋友認為應該不使用額外變數來交換兩個元素,也就是:

array[j] = array[i] + array[j];

array[i] = array[j] - array[i];

array[j] = array[j] - array[i];

他認為,這段**節省了額外的空間,在記憶體緊張的情況下很有必要。但是老趙認為,這裡的損失了可讀性。對於一段標準的交換**,每個人都知道它的目的,而正在讀這篇文章的您,是否可以立即反應出上面三行**的作用?

在程式設計領域有乙個道理被廣為傳播:make clean code fast遠比make fast code clean要容易,這裡clean無疑是「清晰」的意思。因為**清晰,我們可以找出其效能瓶頸,然後有針對性地加以優化。要知道把乙個呼叫10000次的過程優化了20%,比呼叫10次的過程優化80%(假設兩個過程原本消耗接近)要明顯的多。

就拿那位朋友的觀點,記憶體緊張時該怎麼辦。可能他的做法的確有所節省吧(不過高階語言中的「節省」,對於最終編譯後的結果又是兩碼事)。不過在記憶體緊張的時候,首要做的應該還是設法**最耗費資源的地方時什麼,然後加以優化。因此,可能會對某個問題重新設計其資料結構,例如壓縮資料存放方式,共享資料空間等等,而不是設法節省乙個字長的記憶體。那麼如何可以能方便瓶頸的發現呢?

清晰。當然,上面這段**並非不可使用,只是如果您真要這麼做,請把它封裝為乙個子方法:

private void swap(int array, int i, int j)

一旦你把這段邏輯給分離了,在**裡只適用swap方法了,那麼程式也會一下子變得清晰起來。而且在這時候,這三行**也變得容易理解了,別人也可以一眼看出它的作用——因為方法名已經說得很清楚了:交換。

所以,我們在寫程式的時候,不如仔細想想,如何把變數名、方法名或引數名取得清楚一些,如何把程式的邏輯表現地清晰一些,如何把你的意圖更好的告訴別人。

剩下的細節優化,什麼內聯子過程……就統統交給編譯器去處理吧。

JS 什麼是用心體會,Coder追求的是什麼

這個系列與其它系列文章不同,不同講具體的知識點,講的只是實際工作中開發人員應該如何去寫 寫健壯的 寫快樂的 寫物件導向的 事實上,從乙個人寫的 中,可以品味出這個人的心情,這個人對待 的態度 注意,不是工作態度,而是 的態度 在我看來,用心體會,就是你發自內心去寫 你把你的 擬人化,它可能是你的愛人...

JS 什麼是用心體會,Coder追求的是什麼

這個系列與其它系列文章不同,不同講具體的知識點,講的只是實際工作中開發人員應該如何去寫 寫健壯的 寫快樂的 寫物件導向的 事實上,從乙個人寫的 中,可以品味出這個人的心情,這個人對待 的態度 注意,不是工作態度,而是 的態度 在我看來,用心體會,就是你發自內心去寫 你把你的 擬人化,它可能是你的愛人...

JS 什麼是用心體會,Coder追求的是什麼

這個系列與其它系列文章不同,不同講具體的知識點,講的只是實際工作中開發人員應該如何去寫 寫健壯的 寫快樂的 寫物件導向的 事實上,從乙個人寫的 中,可以品味出這個人的心情,這個人對待 的態度 注意,不是工作態度,而是 的態度 在我看來,用心體會,就是你發自內心去寫 你把你的 擬人化,它可能是你的愛人...