一些程式設計上的策略
這裡將向大家分享的是一些我對程式設計的思考總結,這些經驗在我畢生程式設計生涯中曾幫助我在無數的事情上作出正確的決定。這些程式設計策略有些是很顯然的,但實際程式設計中往往被人們忽略。
下面的例子是用Python寫的,但這些概念適用於任何程式語言。
2. 程式碼優化
找出程式的主執行路徑——你的程式大部分時間都執行這些模組。首先優化這部分程式碼,但也不要在程式實現的第一次迭代中進行優化。那些處理邊界情況或失敗/異常處理的地方,這部分程式碼不需要優化,除非它們引起了值得注意的效能問題。
3. 程式碼行數
不要試圖壓縮程式碼行數,但你應該壓縮每個任務的程式碼行數。寫簡單的函式/方法,每個函式/方法只完成一個任務,而不是多個,除非你有很好的理由。
人們通常喜歡為了減少程式碼行數而在一個程式碼片段裡完成大量的工作,這會導致程式碼異常複雜,這種程式碼試圖支援各種情況的處理,而大多時候只是其中的一種情況會發生。多餘的情況處理會給執行造成成本。
4. 多學習作業系統和編譯器知識
瞭解機器,理解機器內部裡事情是如何工作的。這將會幫助理解各種不同瓶頸產生的原因。這能幫助你找到程式碼執行時為什麼會發生奇怪的現象。
5. 運用管理技術
在程式設計中運用管理技術。針對不同目的使用正確的工具。我有自己的喜好,但我努力克服。
1. 異常處理和if-else語句的用法
程式設計的時候,有些邊界情況我們需要確保能正確的處理。對這些情況我們通常的做法是使用if語句來檢查是否是這種情況。當程式執行時,這些檢查動作每次都會執行,來驗證是否是遇到了這些特殊場景。如果你使用的程式語言有異常處理系統——你可以利用它們來處理這些邊界情況。
C語言裡沒有異常處理系統。它依賴於錯誤碼來通知呼叫的函式發生了什麼。返回0是成功,負數則表示失敗。所以,呼叫者需要用if-else來檢查返回碼。沒有其它的方法。
但對於那些有異常處理系統的程式語言,我們可以很好的利用它們。但我們需要使用if-else配合異常處理機制來處理這些邊界情況或錯誤。
一個簡單的例子
想象有一個後臺執行程式,它在啟動和停止時都會檢查一個pid檔案。它會呼叫下面的函式來獲取pid。主調函式使用異常捕獲來確保程式邏輯不會出現意外。
下列情況時這個函式會被呼叫
- 這個後臺程式啟動時
- 這個後臺程式停止時
每種情況時主函式要做的事
啟動時
1.如果pid檔案存在,意味著後臺程式中執行。這個程式自己會停止,會提示有另一個例項已經在執行。
2.讀取這個檔案時如果返回錯誤,這說明沒有pid檔案,說明這個程式沒有執行(除非讀取檔案時發生意外)。這時就建立pid檔案,啟動程式。
停止時
1.如果發現了pid檔案,停止前刪除這個檔案。
如果沒有發現pid檔案,那該怎麼辦?這說明後臺程式根本沒有執行。報告給使用者。
下面就是我們上面提到的主程式會呼叫的獲取pid的程式碼。注意我們使用異常捕獲和if-else語句來處理這些情況。
方法 1
# 這種使用異常的方式不好,屬於被動防禦式程式設計。 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
方法 2
# 使用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
方法 3
# 事實上,我們知道可能會發生什麼,如果pid讀檔案 # 檔案時有錯誤,主調函式會捕獲它。 # 我們使用的程式語言有異常處理機制。 # 我們可以在這裡利用上。 def read_pid_file(): f = open('daemon.pid', 'r') return int(f.read())
我喜歡方法 3,因為它在大多數情況下都可行。如果極少的情況下出現了錯誤,主調函式裡的異常處理會捕獲這種情況。
兩種錯誤處理方式都是我們保證程式無誤的重要途徑。
- 何時使用if-else語句
-
- 當我們知道可能會有什麼情況發生時。也許會分很多種情況。(C語言的錯誤碼機制就是一個很好的例子)。
- 我們通常是基於輸入值使用if-else來控制執行路徑。
- 何時使用異常處理
-
- 你想捕獲一個異常,或者捕獲一些異常但自己不處理,交給系統去處理。支援異常機制的程式語言會在最頂層捕獲這些異常,並報告給使用者。
6. 忽略上面所有的策略
有時候事情就是這樣!而且這樣並不一定是壞事。我們程式設計時經常這樣——當我們開發一個新原型,或針對一個特殊問題找一個解決方案,這時我們如何實現並不重要,重要的是在定型後我們如何完成它們。我想大多時候我們都是這樣做的。誰都知道,先打草稿,後動真的。
請在評論裡留下你對這些觀點的想法。
相關文章
- 淺談Hbase與中間的一些設計策略
- 一些設計上的基本常識
- 程式設計的一些抽象核心程式設計抽象
- Go程式設計的一些規則Go程式設計
- 類程式設計的WAF(上)程式設計
- 關於一些設計上的基本常識
- 面向協議程式設計的一些思考協議程式設計
- 程式設計師買房的一些想法程式設計師
- 給各位程式設計師的一些忠告程式設計師
- 一些程式設計題目的解析程式設計
- java架構-一些設計上的基本常識Java架構
- 好程式設計師分享Vue的一些小技巧程式設計師Vue
- Spark 程式設計模型(上)Spark程式設計模型
- 前端網路程式設計之快取策略前端程式設計快取
- Python程式設計方面的一些技巧Python程式設計
- 給Python初學者的一些程式設計技巧Python程式設計
- Bash 指令碼程式設計的一些高階用法指令碼程式設計
- Java——物件導向程式設計的一些總結Java物件程式設計
- 一些有趣的程式設計師智力面試題程式設計師面試題
- Java程式設計師必備的一些流程圖Java程式設計師流程圖
- 程式設計師最應該知道的一些事程式設計師
- 1024 寫給程式設計師的一些建議程式設計師
- 設計的一些概念
- web的一些設計Web
- 「譯」使用策略設計模式來簡化程式碼設計模式
- (C++模板程式設計):策略(policy)技術中的演算法策略與總結C++程式設計演算法
- 那些 Android 程式設計師必會的檢視優化策略Android程式設計師優化
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- [譯] 關於你的程式設計生涯的一些告誡程式設計
- 奇葩的能讓程式設計師抓狂的一些問題程式設計師
- 響應式程式設計在Android 中的一些探索程式設計Android
- 設計模式(策略模式)設計模式
- 設計模式-策略模式設計模式
- 設計模式——策略模式設計模式
- 老程式設計師被新程式設計師拍在沙灘上?程式設計師
- 一些關係(離散數學中的)的程式設計思想程式設計
- 併發程式設計基礎(上)程式設計
- python學習之物件導向程式設計的一些思考Python物件程式設計
- java 程式設計常混淆的一些屬性,方法,工具類Java程式設計