這裡將向大家分享的是一些我對程式設計的思考總結,這些經驗在我畢生程式設計生涯中曾幫助我在無數的事情上作出正確的決定。這些程式設計策略有些是很顯然的,但實際程式設計中往往被人們忽略。
下面的例子是用python寫的,但這些概念適用於任何程式語言。
找出程式的主執行路徑——你的程式大部分時間都執行這些模組。首先優化這部分**,但也不要在程式實現的第一次迭代中進行優化。那些處理邊界情況或失敗/異常處理的地方,這部分**不需要優化,除非它們引起了值得注意的效能問題。 :).
不要試圖壓縮**行數,但你應該壓縮每個任務的**行數。寫簡單的函式/方法,每個函式/方法只完成乙個任務,而不是多個,除非你有很好的理由。
人們通常喜歡為了減少**行數而在乙個**片段裡完成大量的工作,這會導致**異常複雜,這種**試圖支援各種情況的處理,而大多時候只是其中的一種情況會發生。多餘的情況處理會給執行造成成本。
了解機器,理解機器內部裡事情是如何工作的。這將會幫助理解各種不同瓶頸產生的原因。這能幫助你找到**執行時為什麼會發生奇怪的現象。
在程式設計中運用管理技術。針對不同目的使用正確的工具。我有自己的喜好,但我努力克服。
程式設計的時候,有些邊界情況我們需要確保能正確的處理。對這些情況我們通常的做法是使用if
語句來檢查是否是這種情況。當程式執行時,這些檢查動作每次都會執行,來驗證是否是遇到了這些特殊場景。如果你使用的程式語言有異常處理系統——你可以利用它們來處理這些邊界情況。
c語言裡沒有異常處理系統。它依賴於錯誤碼來通知呼叫的函式發生了什麼。返回0是成功,負數則表示失敗。所以,呼叫者需要用if-else
來檢查返回碼。沒有其它的方法。
但對於那些有異常處理系統的程式語言,我們可以很好的利用它們。但我們需要使用if-else
配合異常處理機制來處理這些邊界情況或錯誤。
乙個簡單的例子:-
想象有乙個後台執行程式,它在啟動和停止時都會檢查乙個pid檔案。它會呼叫下面的函式來獲取pid。主調函式使用異常捕獲來確保程式邏輯不會出現意外。
下列情況時這個函式會被呼叫 -
這個後台程式啟動時
這個後台程式停止時
每種情況時主函式要做的事 -
下面就是我們上面提到的主程式會呼叫的獲取pid的**。注意我們使用異常捕獲和if-else
語句來處理這些情況。
方法 1
# 這種使用異常的方式不好,屬於被動防禦式程式設計。方法 2defread_pid_file
():try:f
=open
('daemon.pid'
,'r'
)pid
=int(f
.read
())return
pid# 沒有發現檔案,也可能是io錯誤
except
ioerror
:raise
"faild to read file"
# 有人在檔案裡放的不是數字,這能怪誰?
except
valueerror
:raise
wrongpid
# 捕獲所有其它異常
# 這個有點像
# 過度使用異常處理
except
exception
:raise
someunknownerror
# 使用方法 3if/else
方法。主調函式需要檢查無返回值情況# 異常情況
defread_pid_file
():ifos.
path
.exists
('daemon.pid'
):try:f
=open
('file.pid'
,'r'
)# 對於支援異常處理機制的程式語言,
# 如果有操作失敗,丟擲異常
# 這裡跟c語言有區別
return
int(f.
read
())except
(valueerror
,ioerror
):pass
# 事實上,我們知道可能會發生什麼,如果pid讀檔案我喜歡方法 3,因為它在大多數情況下都可行。如果極少的情況下出現了錯誤,主調函式裡的異常處理會捕獲這種情況。 :).# 檔案時有錯誤,主調函式會捕獲它。
# 我們使用的程式語言有異常處理機制。
# 我們可以在這裡利用上。
defread_pid_file
():f
=open
('daemon.pid'
,'r'
)return
int(f.
read
())
兩種錯誤處理方式都是我們保證程式無誤的重要途徑。
何時使用if-else
語句當我們知道可能會有什麼情況發生時。也許會分很多種情況。(c語言的錯誤碼機制就是乙個很好的例子)。
我們通常是基於輸入值使用if-else來控制執行路徑。
何時使用異常處理你想捕獲乙個異常,或者捕獲一些異常但自己不處理,交給系統去處理。支援異常機制的程式語言會在最頂層捕獲這些異常,並報告給使用者。
有時候事情就是這樣!而且這樣並不一定是壞事。我們程式設計時經常這樣——當我們開發乙個新原型,或針對乙個特殊問題找乙個解決方案,這時我們如何實現並不重要,重要的是在定型後我們如何完成它們。我想大多時候我們都是這樣做的。誰都知道,先打草稿,後動真的。
[英文原文:some programming strategies ]
this entry was posted in 心得體會 and tagged **優化. bookmark the permalink.
一些程式設計上的小技巧
下面介紹的方法 程式設計珠璣 裡也有所提及 下面的例子是用python寫的,但這些概念適用於任何程式語言。找出程式的主執行路徑 你的程式大部分時間都執行這些模組。首先優化這部分 但也不要在程式實現的第一次迭代中進行優化。那些處理邊界情況或失敗 異常處理的地方,這部分 不需要優化,除非它們引起了值得注...
一些程式設計上的小技巧
下面介紹的方法 程式設計珠璣 裡也有所提及 下面的例子是用python寫的,但這些概念適用於任何程式語言。找出程式的主執行路徑 你的程式大部分時間都執行這些模組。首先優化這部分 但也不要在程式實現的第一次迭代中進行優化。那些處理邊界情況或失敗 異常處理的地方,這部分 不需要優化,除非它們引起了值得注...
C專家程式設計上的一些習題
第一題 關於鍊錶問題 問題 怎樣才能檢測到鍊錶中是否存在迴圈?對訪問過的每個元素做個標記,繼續遍歷這個鍊錶,如果遇到某個已經做過標記的元素,說明鍊錶中存在迴圈。如何做標記呢?思考之 如果鍊錶中的元素全部都是正整數的話,我們可以這樣做,對訪問過的每個元素加上個負號,然後我們繼續遍歷鍊錶,如果訪問到負數...