一些編程上的策略 - OSCHINA - 中文開源技術交流社區

2020-12-14 開源中國

這裡將向大家分享的是一些我對編程的思考總結,這些經驗在我畢生編程生涯中曾幫助我在無數的事情上作出正確的決定。這些編程策略有些是很顯然的,但實際編程中往往被人們忽略。

下面的例子是用Python寫的,但這些概念適用於任何程式語言。

2. 代碼優化

找出程序的主執行路徑——你的程序大部分時間都執行這些模塊。首先優化這部分代碼,但也不要在程序實現的第一次迭代中進行優化。那些處理邊界情況或失敗/異常處理的地方,這部分代碼不需要優化,除非它們引起了值得注意的性能問題。 

3. 代碼行數

不要試圖壓縮代碼行數,但你應該壓縮每個任務的代碼行數。寫簡單的函數/方法,每個函數/方法只完成一個任務,而不是多個,除非你有很好的理由。

人們通常喜歡為了減少代碼行數而在一個代碼片段裡完成大量的工作,這會導致代碼異常複雜,這種代碼試圖支持各種情況的處理,而大多時候只是其中的一種情況會發生。多餘的情況處理會給執行造成成本。

4. 多學習作業系統和編譯器知識

了解機器,理解機器內部裡事情是如何工作的。這將會幫助理解各種不同瓶頸產生的原因。這能幫助你找到代碼運行時為什麼會發生奇怪的現象。

5. 運用管理技術

在編程中運用管理技術。針對不同目的使用正確的工具。我有自己的喜好,但我努力克服。

1. 異常處理和if-else語句的用法

編程的時候,有些邊界情況我們需要確保能正確的處理。對這些情況我們通常的做法是使用if語句來檢查是否是這種情況。當程序運行時,這些檢查動作每次都會執行,來驗證是否是遇到了這些特殊場景。如果你使用的程式語言有異常處理系統——你可以利用它們來處理這些邊界情況。

C語言裡沒有異常處理系統。它依賴於錯誤碼來通知調用的函數發生了什麼。返回0是成功,負數則表示失敗。所以,調用者需要用if-else來檢查返回碼。沒有其它的方法。

但對於那些有異常處理系統的程式語言,我們可以很好的利用它們。但我們需要使用if-else配合異常處理機制來處理這些邊界情況或錯誤。

一個簡單的例子 :-

想像有一個後臺運行程序,它在啟動和停止時都會檢查一個pid文件。它會調用下面的函數來獲取pid。主調函數使用異常捕獲來確保程序邏輯不會出現意外。

下列情況時這個函數會被調用 -

  1. 這個後臺程序啟動時
  2. 這個後臺程序停止時

每種情況時主函數要做的事 -

下面就是我們上面提到的主程序會調用的獲取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語句

  1. 當我們知道可能會有什麼情況發生時。也許會分很多種情況。(C語言的錯誤碼機制就是一個很好的例子)。
  2. 我們通常是基於輸入值使用if-else來控制執行路徑。

何時使用異常處理

  1. 你想捕獲一個異常,或者捕獲一些異常但自己不處理,交給系統去處理。支持異常機制的程式語言會在最頂層捕獲這些異常,並報告給用戶。

6. 忽略上面所有的策略  .

有時候事情就是這樣!而且這樣並不一定是壞事。我們編程時經常這樣——當我們開發一個新原型,或針對一個特殊問題找一個解決方案,這時我們如何實現並不重要,重要的是在定型後我們如何完成它們。我想大多時候我們都是這樣做的。誰都知道,先打草稿,後動真的。

請在評論裡留下你對這些觀點的想法。

相關焦點

  • 關於編程裡的那些 ABCDEFG - OSCHINA - 中文開源技術交流社區
    它是一款開源 JavaScript 函式庫,由 Google 和它的社區來維護,用來協助單一頁面應用程式運行的。它的目標是透過 MVC模式(Model-View-Controller)功能增強基於瀏覽器的應用,使開發和測試變得更容易。函式庫讀取包含附加自定義(標籤屬性)的 HTML,遵從這些自定義屬性中的指令,並將頁面中的輸入或輸出與由 JavaScript 變量表示的模型綁定起來。
  • Delta Lake 進入 Linux 基金會 - OSCHINA - 中文開源技術交流社區
    Delta Lake 是一個存儲層,為 Apache Spark 和大數據 workloads 提供 ACID 事務能力,其通過寫和快照隔離之間的樂觀並發控制(optimistic concurrency control),在寫入數據期間提供一致性的讀取,從而為構建在 HDFS 和雲存儲上的數據湖帶來可靠性。
  • 開源社區的「忌諱」話題 - OSCHINA - 中文開源技術交流社區
    加拿大資深開源技術記者Bruce Byfield較早前發表了一篇名為「開源社區從來不想承認的九大事實」(9 Things That Are Never Admitted About Open
  • 開源軟體蓄勢待發 - OSCHINA - 中文開源技術交流社區
    相關內容11家值得關注的開源技術公司優異的技術特性和相對低廉的價格的結合使得開源產品廠商比以往有了更多進入企業網絡的路徑。Likewise公司執行長 Barry Crist 稱:「在網絡泡沫時期,由於Linux比SPARC上的Solaris更為便宜,開源產品逐漸由Unix轉移到了Linux。
  • SugarCRM:開源與商業的完美結合 - OSCHINA - 中文開源技術交流社區
    他認為,在中國市場以商業為後盾的開源模式將會成為CRM軟體發展的一個趨勢。 2009年4月22日,SugarCRM在上海舉辦了精英聯合峰會,並同時宣布中國區總經理的上任。我們可以看出這是一個信號,是關於SugarCRM商業開源策略正式在中國實施的前奏。
  • 開源春天,此時不來,更待何時? - OSCHINA - 中文開源技術交流社區
    簡單地講,其實這背後都是利益問題,以這些開源項目社區的話來講,他們都不想讓一些雲廠商「坐收漁翁之利」,然而實際上,這些被指責的雲廠商真的都違反了開源協議內容嗎?這可真不好說。在這些社區宣布項目修改開源協議之後,遭到了各種反對聲音。
  • 5款開源雲計算平臺推薦 - OSCHINA - 中文開源技術交流社區
    我們熟知的幾個IT巨頭的雲計算平臺,如亞馬遜EC 2、IBM的藍雲、微軟的Azure、Sun Cloud等,那麼開源雲計算的平臺又有哪些呢?以下列舉了開源中國社區收錄的5款知名的開源雲計算平臺。Programs To Useful Systems)是 Amazon EC2 的一個開源實現,它與商業服務接口兼容。
  • Git 2.4.3 發布 - OSCHINA - 中文開源技術交流社區
    Git是一個開源的分布式版本控制系統,用以有效、高速的處理從很小到非常大的項目版本管理。開源中國 Git 代碼託管平臺:http://git.oschina.net/Windows下的Git請看這裡:http://www.oschina.net/p/msysgitGit 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體
  • 如何在 2020 年用 Java 安全編程 - OSCHINA - 中文開源技術交流社區
    他在文中表示,儘管目前 Java 的安全性相較於一些舊的語言(特別是 C 和 C ++)而言有所長進,但是使用 Java 編寫的代碼的漏洞級別還是取決於程式設計師遵循的最佳實踐。在當今的開發環境中更是如此,各種新的安全性技術、黑客技術以及新穎的存儲和加密形式,意味著許多人都在質疑著 Java 的安全性。Java 開發人員還面臨著包括雲遷移的安全性問題在內的諸多挑戰。
  • Netflix 的開源文化與技術 - OSCHINA - 中文開源技術交流社區
    Netflix利用開源或者自己開發的技術,讓公司能夠在分布於全世界50多個國家的伺服器上進行持續地構建和集成;能夠對用戶所產生的海量行為數據進行分析挖掘從而更好地推薦和改善自身服務;同時能夠通過性能剖析和安全審計保護用戶的隱私和數據,下面就讓我們來盤點一下Netflix所使用或貢獻的開源技術。
  • Web 是開源最大的成功 - OSCHINA - 中文開源技術交流社區
    下面列出了Web得以運轉的一些開源項目。 Web browsers -網絡瀏覽器 在網絡瀏覽器市場中,雖然微軟的封閉源碼軟體IE瀏覽器仍然佔有很大的份額,但其它功能相似的開源項目已經流行起來,並在不斷壯大。像 Mozilla公司的Firefox瀏覽器(它是開源的,還有Flock、PaleMoon)。
  • JavaFX 2012:徹底開源 - OSCHINA - 中文開源技術交流社區
    其中將JavaFX完全開源赫列榜首——在2011年的JavaOne大會上,Oracle已做出保證將開源整個JavaFX平臺。 以下是Richard Bair列出的2012年JavaFX 10大目標: 1.
  • Google限制Python使用引熱議 - OSCHINA - 中文開源技術交流社區
    今日,csdn報導的一篇文章「Google將限制Python語言的應用 開發社區熱議」;引發網友的熱烈討論
  • zmail 6.1版本更新 - OSCHINA - 中文開源技術交流社區
    Zmail的官方主頁:www.z-email.orgZmail的官方論壇:bbs.z-email.orgZmail的QQ群: 257959126系統要求redhat 6.x centos 6.x 64位最小安裝Zmail安裝說明:概述:(1)該安裝包為一鍵安裝包,方便快捷部署;(2)Zmail是開源郵件技術社區的最新的郵件伺服器軟體包
  • 開放源碼是開源軟體嗎? - OSCHINA - 中文開源技術交流社區
    所以,與此類似的,在中文裡,我們可以認為:「開放原始碼」是一個動詞+一個名詞。而「開源」則是一個特定的詞彙。作為動詞,我們說將某某軟體開源,是一種行為。作為形容詞,我們稱某某軟體是一個開源(的)軟體,不僅僅是指我們能夠獲取到他的原始碼。
  • Gitbook,這個開源出書平臺了不起 - OSCHINA - 中文開源技術交流社區
    GitHub充分利用了網際網路的能力,讓開發者可以方便地參與不同的項目,不要說查閱別人的代碼,修改別人的項目,是一種更高層次的交流、對話。就好像《如何閱讀一本書》裡提到的「主動閱讀」,是通過不斷了解作者核心觀念,並提出自己觀點進行碰撞的方式,讓讀者成為一名偉大的讀者。相比紙質書中作者與讀者的對話,GitHub 將兩段代碼撰寫者的溝通顯性化,不再是偷偷在旁邊的注釋裡加入自己的觀點。
  • Hutool 2.16.0 發布,Java 工具集 - OSCHINA - 中文開源技術交流社區
    HttpConnection中判斷Http Method 錯誤修復PooledDataSource和SimpleDataSource配置文件讀取錯誤問題-2016的尾巴-隨著2016的結束,Hutool又走過了一個年頭,在這一年中,因為Hutool認識了很多志同道合之人,也因為Hutool讓我接觸了更多的開源項目
  • 開源雲計算市場份額正在上升 - OSCHINA - 中文開源技術交流社區
    雲計算具備轉變政府機構接入IT服務方式的潛力,而開源是政府早期配置的幾種雲採用的基礎技術。
  • 有史以來最出彩的程式語言名字 - OSCHINA - 中文開源技術交流社區
    我腦子裡經常會縈繞一些很無聊的小問題,其中一個就是,這麼多的程式語言的名字都是怎麼出來的?讓我們來給它們歸歸類。
  • JQuery 之父: 好好學習,天天編碼 - OSCHINA - 中文開源技術交流社區
    如何處理我的業餘編程項目是有一些嚴重問題的。我最主要是在周末或者某些工作日的晚上編寫代碼。如同結果一樣,這種策略並不適合我。周末我拖著巨大 的壓力嘗試完成儘可能多的高質量代碼(如果我沒能完成我會認為自己很失敗)。這樣想有一個問題,因為沒有什麼能夠保證我每個周末都有空,並且想整個周末都 寫程序而不是抓緊機會放鬆或娛樂。每周寫代碼之間空擋太長也是個問題。