優質代碼的十條黃金法則

来源:http://www.cnblogs.com/XL-Tommy/archive/2017/10/20/7699449.html
-Advertisement-
Play Games

1.- DRY: Don’t repeat yourself. DRY 是一個最簡單的法則,也是最容易被理解的。但它也可能是最難被應用的(因為要做到這樣,我們需要在泛型設計上做相當的努力,這並不是一件容易的事)。它意味著,當我們在兩個或多個地方的時候發現一些相似的代碼的時候,我們需要把他們的共性抽象 ...


1.- DRY: Don’t repeat yourself.

DRY 是一個最簡單的法則,也是最容易被理解的。但它也可能是最難被應用的(因為要做到這樣,我們需要在泛型設計上做相當的努力,這並不是一件容易的事)。它意味著,當我們在兩個或多個地方的時候發現一些相似的代碼的時候,我們需要把他們的共性抽象出來形一個唯一的新方法,並且改變現有的地方的代碼讓他們以一些合適的參數調用這個新的方法。

DRY 這一法則可能是編程屆中最通用的法則了,目前為止,應該沒有哪個程式員對這一法則存有異議。但是,我們卻能發現,一些程式在編寫單元測試(unit testing)時忘記了這一法則:讓我們相像一下,當你改變一個類的若幹介面,如果你沒有使用DRY,那麼,那些通過調用一系例類的介面的unit test的程式,都需要被手動的更改。比如:如果你的unit test的諸多test cases中沒有使用一個標準共有的構造類的方法,而是每個test case自己去構造類的實例,那麼,當類的構造函數被改變時,你需要修改多少個test cases啊。這就是不使用DRY法則所帶來的惡果。

 

2.- 短小的方法.

至少,我們有下麵三個不錯的理由要求程式員們寫下短小的方法。

  1. 代碼會變得更容易閱讀。
  2. 代碼會變得更容易重用(短方法可以減少代碼間的耦合程度)
  3. 代碼會變得更容易測試。

3.- 良好的命名規範

使用不錯的統一的命名規範可以讓你的程式變得更容易閱讀和維護,當一個類,一個函數,一個變數的名字達到了那種可以“望文生義”的境界話,我們就可以少一些文檔,少一些溝通。文章《編程中的命名設計那點事 》可以給你一些提示。

4.- 賦予每個類正確的職責

一個類,一個職責,這類規則可以參考一下類的SOLID 法則。但我們這裡強調的不是一種單一的職責,而是一個正確的職責。如果你有一個類叫Customer,我們就不應該讓這個類有sales 的方法,我們只能讓這個類有和Customer有最直接關係的方法。

5.- 把代碼組織起來

把代碼組織起來有兩具層次。

  • 物理層組織:無論你使用什麼樣的目錄,包(package)或名字空間(namespace)等的結構,你需要把你的類用一種標準的方法組織起來,這樣可以方便查找。這是一種物理性質的代碼組織。
  • 邏輯層組織: 所謂邏輯層,主要是說,我們如果把兩個不同功能的類或方法通過某種規範聯繫和組織起來。這裡主要關註的是程式模塊間的介面。這就是我們經常見到的程式模塊的架構。

6.- 創建大量的單元測試

單元測試是最接近BUG的地方,也是修改BUG成本最低的地方,同樣也是決定整個軟體質量好壞的成敗的地方。所以,只要有可能,你就應該寫更多的,更好的單元測試案例,這樣當你未來有相應代碼改變的時候,你可以很簡單知道你代碼的改變是否影響了其它單元。

7.- 經常重構你的代碼

軟體開發是一種持續的發現的過程,從而讓你的代碼可以跟上最新的實際需求的變化。所以,我們要經常重構自己的代碼來跟上這樣的變化。當然,重構是有風險的,並不是所有的重構都是成功的,也不是我們隨時都可以重構代碼。下麵是兩個重構代碼的先要條件,以避免讓你引入更多的BUG,或是把本來就爛的代碼變得更爛。

  1. 有大量的單元測試來測試。正如前面所說,重構需要用大量的單元測試來做保障和測試。
  2. 每次重構都不要大,用點點滴滴的小的重構來代替那種大型的重構。有太多的時候,當我們一開始計劃重構2000行代碼,而在3個小時後,我們就放棄這個計劃並把代碼恢復到原始的版本。所以,我們推薦的是,重構最好是從點點滴滴積累起來的。

8.- 程式註釋是邪惡的

這一條一定是充滿爭議的,大多數程式員都認為程式註釋是非常好的,是的,沒錯,程式註釋在理論上是非常不錯的。但是,在實際過程式當中,程式員們寫出來的註釋卻是很糟糕的(程式員的表達能力很有問題),從而導致了程式註釋成為了一切邪惡的化身,也導致了我們在閱讀程式的時,大多數時候,我們都不讀註釋而直接讀代碼。所以,在這裡,我們並不是鼓勵不寫註釋,而是——如果你的註釋寫得不夠好的話,那麼,你還不如把更重要的時間花在重構一下你的代碼,讓你的代碼更加易讀,更加清楚,這比會比註釋更好。

9.- 註重介面,而不是實現

這是一個最經典的規則了。介面註重的是——“What”是抽象,實現註重的是——“How”是細節。介面相當於一種合同契約,而實際的細節相當於對這種合同契約的一種運作和實現。運作是可以很靈活的,而合同契約則需要是相對需要穩定和不變的。如果,一個介面沒有設計好而需要經常性的變化的話,那我們可以試想一下,這代來的後果,這絕對會是一件成本很大的事情。所以,在軟體開發和調設中,介面是重中之重,而不是實現。然而我們的程式員總是註重於實現細節,所以他們局部的代碼寫的非常不錯,但軟體整體卻設計得相對較差。這點需要我們多多註意。

10.- 代碼審查機制

所有人都會出錯,一個人出錯的概率是很大的,兩個人出錯的概率就會小一些,人多一些,出錯的概率就會越來越小。因為,人多了,就能夠從不同的角度看待一個事情,雖然這樣可能導致無效率的爭論,但比起軟體產品release後出現問題的維護成本,這點成本算是相當值得的。所以,這就是我們需要讓不同的人來reivew代碼,代碼審查機制不但是一種發現問題的最有效的機制,同時也是一種可以知識共用的機制。當然,對於Code Review來說,下麵有幾個基本原則:

  • 審查者的能力一定要大於或等於代碼作者的能力,不然,代碼審查就成了一種對新手的training。
  • 而且,為了讓審查者真正負責起來,而不是在敷衍審查工作,我們需要讓審查者對審查過的代碼負主要責任,而不是代碼的作者。 
  • 另外,好的代碼審查應該不是當代碼完成的時候,而是在代碼編寫的過程中,不斷地迭代代碼審查。好的實踐的,無論代碼是否完成,代碼審核需要幾天一次地不斷地進行。

文章出處:https://coolshell.cn/articles/1007.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用正則表達式(regex)匹配多項式(polynomial),並提取出各項繫數、指數。 ...
  • 1)POP--面向過程編程(Process-oriented programming ): 面向過程編程是以功能為中心來進行思考和組織的一種編程方法,它強調的是系統的數據被加工和處理的過程,在程式設計中主要以函數或者過程為程式的基本組織方式,系統功能是由一組相關的過程和函數序列構成。面向過程強調的是 ...
  • 以下總結出自己在學習python期間常用的網址或者資源,其中包括很多人的博客,方便自己從這個入口查找資源。 1.https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/ (廖雪峰的官方網站 ...
  • MORE+ 這段代碼執行時會發生錯誤,如題。 原因在於:new.href 使用java 的關鍵字,把new改成news後就不再報錯。 ...
  • java特點; 1.面對象性 2.可移植性/跨平臺性 java組成; jdk(java工具開發工具包) / \ \ jre 指令集合 api和常用java包 (運行環境)(編輯器) / jvm(java虛擬器) java執行過程:java文件〉編輯器(javac)〉class文件〉jvm(解釋執行) ...
  • 題目描述 Farmer John最近為奶牛們的圖書館添置了一個巨大的書架,儘管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。 所有N(1 <= N <= 20,000)頭奶牛都有一個確定的身高H_i(1 <= H_i <= 10,000)。設所有奶牛身高的 ...
  • 什麼是策略者模式? 策略模式是針對一組演算法,將每個演算法封裝到具有公共介面的獨立的類中,從而使它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。對演算法的包裝,是把使用演算法的責任和演算法本身分割開,委派給不同的對象負責。策略模式通常把一系列的演算法包裝到一系列的策略類裡面。用一句話慨括 ...
  • 制定 BB 鳥規則時需遵循的規範: • 只包含不可變的規則,而不是籠統的說明• 總是把規則提煉成最簡單的表達• 總是首先說明規則是什麼,再說明“如果不這樣,那麼會如何”• 每個規則必須包含以下詞中的一個——總是、永遠不要、只有、每一個、不要、要 設計系統的規則列表: • 永遠不要給佈局的子內容強加內 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...