下面介紹的方法《編程珠璣》裏也有所說起python
下面的例子是用Python寫的,但這些概念適用於任何編程語言。編程
找出程序的主執行路徑——你的程序大部分時間都執行這些模塊。首先優化這部分代碼,但也不要在程序實現的第一次迭代中進行優化。那些處理邊界狀況或失敗/異常處理的地方,這部分代碼不須要優化,除非它們引發了值得注意的性能問題。 .編程語言
不要試圖壓縮代碼行數,但你應該壓縮每一個任務的代碼行數。寫簡單的函數/方法,每一個函數/方法只完成一個任務,而不是多個,除非你有很好的理由。函數
人們一般喜歡爲了減小代碼行數而在一個代碼片斷裏完成大量的工做,這會致使代碼異常複雜,這種代碼試圖支持各類狀況的處理,而大多時候只是其中的一種狀況會發生。多餘的狀況處理會給執行形成成本。工具
瞭解機器,理解機器內部裏事情是如何工做的。這將會幫助理解各類不一樣瓶頸產生的緣由。這能幫助你找到代碼運行時爲何會發生奇怪的現象。性能
在編程中運用管理技術。針對不一樣目的使用正確的工具。我有本身的喜愛,但我努力克服。學習
編程的時候,有些邊界狀況咱們須要確保能正確的處理。對這些狀況咱們一般的作法是使用if
語句來檢查是不是這種狀況。當程序運行時,這些檢查動做每次都會執行,來驗證是不是遇到了這些特殊場景。若是你使用的編程語言有異常處理系統——你能夠利用它們來處理這些邊界狀況。優化
C語言裏沒有異常處理系統。它依賴於錯誤碼來通知調用的函數發生了什麼。返回0是成功,負數則表示失敗。因此,調用者須要用if-else
來檢查返回碼。沒有其它的方法。spa
但對於那些有異常處理系統的編程語言,咱們能夠很好的利用它們。但咱們須要使用if-else
配合異常處理機制來處理這些邊界狀況或錯誤。操作系統
一個簡單的例子 :-
想象有一個後臺運行程序,它在啓動和中止時都會檢查一個pid文件。它會調用下面的函數來獲取pid。主調函數使用異常捕獲來確保程序邏輯不會出現意外。
下列狀況時這個函數會被調用 -
每種狀況時主函數要作的事 -
若是沒有發現pid文件,那該怎麼辦?這說明後臺程序根本沒有運行。報告給用戶。
下面就是咱們上面提到的主程序會調用的獲取pid的代碼。注意咱們使用異常捕獲和if-else
語句來處理這些狀況。
# 這種使用異常的方式很差,屬於被動防護式編程。 def read_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
# 使用If/else方法。主調函數須要檢查無返回值狀況 # 異常狀況 def read_pid_file(): if os.path.exists('daemon.pid'): try: f = open('file.pid', 'r') # 對於支持異常處理機制的編程語言, # 若是有操做失敗,拋出異常 # 這裏跟C語言有區別 return int(f.read()) except (ValueError, IOError): pass
# 事實上,咱們知道可能會發生什麼,若是pid讀文件 # 文件時有錯誤,主調函數會捕獲它。 # 咱們使用的編程語言有異常處理機制。 # 咱們能夠在這裏利用上。 def read_pid_file(): f = open('daemon.pid', 'r') return int(f.read())
我喜歡方法 3,由於它在大多數狀況下均可行。若是極少的狀況下出現了錯誤,主調函數裏的異常處理會捕獲這種狀況。 .
兩種錯誤處理方式都是咱們保證程序無誤的重要途徑。
if-else
語句
有時候事情就是這樣!並且這樣並不必定是壞事。咱們編程時常常這樣——當咱們開發一個新原型,或針對一個特殊問題找一個解決方案,這時咱們如何實現並不重要,重要的是在定型後咱們如何完成它們。我想大多時候咱們都是這樣作的。誰都知道,先打草稿,後動真的。
請在評論裏留下你對這些觀點的想法。