常見編碼規範

来源:https://www.cnblogs.com/fatedeity/archive/2023/02/02/17086145.html
-Advertisement-
Play Games

通常,不同的公司里有著不同的編碼規範,主要是從代碼得準確性、穩定性、可讀性等地方著手制定,以提高團隊成員之間的協作效率,這裡主要是列出一些常見的編碼規範。 ...


命名規範

命名長度

命名的原則以準確達意為目標,其長度以遵循此原則為主,並且是越短越好。

  • 對於公認、熟知的詞,可以在項目內部統一成縮寫
  • 對於作用域較小的變數,可以使用較短的命名
  • 對於作用域較大的變數,推薦使用可達意的較長的命名

命名上下文

命名時可以根據上下文來簡化命名,如在 User 類中,就不需要對類中的成員變數添加 user 首碼,而是直接命名如 namepassword 等名稱。

在使用時,開發者也可以藉助上下文明確變數的含義。

可讀性

可讀性指的是不使用特別生僻、難發音的英文單詞來命名,同時也不要使用一些無意義、隨意搭配的單詞。

可搜索性

命名可搜索性指的是,使用 IDE 開發的時候,可以很方便地使用“關鍵詞聯想”功能快速補全。

這個原則指的是,最好能在項目、團隊內部統一命名方式,如都使用 selectXXX 表示查詢,而不是既有 selectXXX,也有 findXXXqueryXXX 等多種命名方式表示查詢。

介面、抽象類

對於介面的命名,通常有兩種比較常見的方式:一種是介面加首碼 I 表示 Interface,如 IUserService;另一種是實現類加尾碼 Impl 表示 implements,如 UserServiceImpl

對於抽象類的命名,也有兩種常見的方式:一種是帶上首碼 Abstract 表示抽象類,如 AbstractConfig;另一種是不帶首碼。

無論是介面還是抽象類,選擇哪個命名方式都可以,最重要的是能在項目內部統一。

註釋規範

註釋內容

註釋的目的是讓代碼更容易看懂。

註釋的內容主要是包括三個方面:做什麼、為什麼做、怎麼做。對於複雜的介面或類,還需要補充“如何用”。

註釋多少

註釋本身有一定的維護成本,並非越多越好。

類和函數一定要寫註釋,而且要寫得儘可能全面、詳細,函數內部的註釋要相對少一些,一般可以通過好的命名、提煉函數、解釋性變數、總結性註釋等方式來提高代碼可讀性。

代碼風格

類和函數的行數

對於函數代碼行數的最大限制,網上有一種說法:最好不要超過一個顯示屏的垂直高度。

對於類的代碼行數的最大限制,有一個間接的判斷標準:

  • 當一個類的代碼讀起來比較困難
  • 實現某個功能時不知道該用哪個函數
  • 想用哪個函數的時候需要找很久
  • 只用到一個小功能的時候要引入整個類

一行代碼的長度

總體遵循一個原則:一行代碼最長不能超過 IDE 顯示的寬度。

需要滾動滑鼠才能查看一行的全部代碼,顯然不利於代碼的閱讀;但是太小的限制也會導致很多稍長點的語句被折成兩行。

分隔單元塊

對於比較長的函數,如果邏輯上可以分為幾個獨立的代碼塊,但是又不方便將這些獨立的代碼塊抽取成小函數的時候,可以使用總結性註釋的方式分隔代碼塊。

除此之外,還可以通過使用空行分隔代碼塊。如類的成員變數和函數之間、靜態成員變數和普通成員變數之間、各函數之間、甚至是各成員變數之間。

類成員的排列順序

在 Google Java 編程規範中,依賴類按照字母序從小到大排列、類中先寫成員變數後寫函數、成員變數之間或函數之間先寫靜態成員變數或函數(按照作用域大小依次排列)。

常用技巧

善於提煉函數

對於邏輯比較複雜的代碼,通常是建議提煉出類或者函數,但也避免提煉出的函數只包含兩三行代碼,以增加閱讀成本。

避免函數參數過多

通常函數的參數超過 5 個時候就會影響到代碼的可讀性,使用起來也不方便。

出現函數參數較多的情況,通常有兩個解決辦法:根據單一職責原則拆分成多個函數;將函數的參數封裝成對象。

勿用函數參數控制邏輯

切勿在函數內部根據函數的參數來控制內部邏輯,如根據 isVip = true 時走 VIP 的邏輯、isVip = false 走非 VIP 的邏輯。

針對於這樣情況,通常是根據需求將其拆分成多個函數,拆分之後的函數職責更明確。

函數設計要職責單一

不只是針對類、模塊而言,對於函數的設計,更要滿足單一職責原則。

移除過深的嵌套

代碼嵌套最好不超過兩層,超過兩層之後就要思考一下是否可以減少嵌套,以避免難以理解和代碼縮進過多。

解決代碼嵌套過深的方法有以下幾種思路:

  • 去掉多餘的 if 或者 else 語句
  • 使用編程語言提供的 continuebreakreturn 關鍵字提前退出嵌套
  • 調整執行順序來減少嵌套
  • 將部分嵌套的邏輯封裝成函數調用,以此來減少嵌套
  • 使用多態來替代 if-elseswitch-case 條件判斷

使用解釋性變數

使用解釋性變數可以提高代碼的可讀性,常見的情況有以下幾種:

  • 使用常量取代魔法數字
  • 使用解釋性變數來解釋複雜表達式

函數錯誤返回

函數的運行結果可以分為兩類:正確情況下輸出的預期結果,異常(出錯)情況下輸出的非預期結果。

在異常情況下,函數返回的數據類型非常靈活,可以針對不同的場景和特點選擇不同的返回值。

返回錯誤碼

C 語言沒有異常這樣的語法機制,返回錯誤碼是最常見的出錯處理方式。

而 Java、Python 等比較新的編程語言,大部分情況下,都用異常來處理函數出錯的情況,極少會用到錯誤碼。

返回 NULL 值

在多數編程語言中,使用 NULL 值表示“不存在”這種語義。

對於查找函數來說,數據不存在並非一種異常情況,是一種正常行為,所以返回表示“不存在”語義的 NULL 值比返回異常更加合理。

返回空對象

返回 NULL 值有各種弊端,對此有一個比較經典的應對策略,那就是應用空對象設計模式。

當函數返回的數據類型是字元串類型或者集合類型的時候,可以用空字元串或空集合替代 NULL 值,來表示不存在的情況。

拋出異常對象

最常用的函數出錯處理方式是拋出異常。異常可以將正常邏輯和異常邏輯的處理分離開,這樣的代碼可讀性會更好。

對於拋出的異常對象,通常有以下幾種處理方式:

  • 直接吞掉,如在捕捉之後只記錄日誌,不做任何處理
  • 原封不動的重新拋出,如在調用的函數外部重新拋出相同的異常
  • 包裝新的異常重新拋出,如在捕捉之後拋出另一個的異常

首發於「程式員翔仔」,點擊查看更多。


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

-Advertisement-
Play Games
更多相關文章
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:為了擴展主節點的讀請求能力,DDS提供具備獨立連接地址的只讀節點,適合獨立系統直連訪問,以緩解大量讀請求給主節點造成的 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: KAiTO 文章來源:GreatSQL社區原創 往期回顧 圖文結合帶你搞懂MySQL日誌之relay log(中繼日誌) 圖文結合帶你搞懂MyS ...
  • 慢查詢指的是資料庫中查詢時間超過了指定的閾值的SQL,這類SQL通常伴隨著執行時間長、伺服器資源占用高、業務響應慢等負面影響。隨著攜程酒店業務的不斷擴張,再加上大量的SQLServer轉MySQL項目的推進,慢查詢的數量正在飛速增長,每日的報警量也居高不下,因此慢查詢的治理優化已經是刻不容緩,此文主... ...
  • 1:apk文件結構 如圖所示: assets: 存放應用程式的靜態資源文件,如圖片資源,json配置文件,html離線資源等。註意,assets目錄下是支持任意深度的子目錄。 res: 規定的指定文件,圖標,圖片資源等,且res下文件都會生成對應的資源id, 但是assets下是不會的。 lib: ...
  • 在元素設置浮動(float)後,該元素就會脫離文檔流,並且向左或向右浮動,直至它的外邊緣遇到包含框或者另一個浮動框的邊緣。 一、浮動元素對佈局的影響 1.1、浮動元素造成父元素的高度塌陷: 原來的父元素高度是內部元素撐開的,但是當內部元素浮動後,脫離文檔流浮動起來,那父元素的高度就坍塌,變為高度 0 ...
  • 寫代碼的時候遇到這個問題了,在這裡複習一下 非箭頭函數 非箭頭函數的this指向比較好理解,就是調用這個函數的對象,舉個慄子: var obj = { foo: { bar: 3, foo:{ bar: 4, foo: function a() { console.log(this.bar) }, ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 什麼是跨域? 跨域不是問題,是一種安全機制。瀏覽器有一種策略名為同源策略,同源策略規定了部分請求不能被瀏覽器所接受。 值得一提的是:同源策略導致的跨域是瀏覽器單方面拒絕響應數據,伺服器端是處理完畢並做出了響應的。 什麼是同源策略 一個ur ...
  • 1.CSS、SCSS、Sass CSS是開發人員熟知的一種用於頁面樣式開發的語言,可以通過內容的分離控制減少代碼的重覆性,降低代碼的複雜程度。 Sass與 SCSS 都是 CSS 預處理器,可包含在基於 CSS 的 UI(用戶界面)或前端框架中以簡化開發。Sass 與 SCSS 框架在高級別的 CS ...
一周排行
    -Advertisement-
    Play Games
  • 就像 Web Api 介面可以對入參進行驗證,避免用戶傳入非法的或者不符合我們預期的參數一樣,選項也可以對配置源的內容進行驗證,避免配置中的值與選項類中的屬性不對應或者不滿足預期,畢竟大部分配置都是通過字元串的方式,驗證是很有必要的。 1. 註解驗證 像入參驗證一樣,選項驗證也可以通過特性註解方便地 ...
  • 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/17270107.html 加工的泛型類如下: using System; using System.Collections.Generic; using System.IO; using Syst ...
  • 在前一篇文章,我們瞭解瞭如何通過.NET6+Quartz開發基於控制台應用程式的定時任務,今天繼續在之前的基礎上,進一步講解基於ASP.NET Core MVC+Quartz實現定時任務的可視化管理頁面,僅供學習分享使用,如有不足之處,還請指正。 涉及知識點 Quartz組件,關於Quartz組件的 ...
  • 面向對象1 面向對象,更在乎的結果,而過程的實現並不重要 IDea快捷鍵(基礎版) | 快捷鍵 | 作用 | | | | | ctrl + / | 快捷註釋 | | ctrl + shift + / | 多行註釋 | | ctrl + d | 快速複製 | | ctrl + shift + up/d ...
  • NX中的checkmate功能是用於檢查模型、圖紙數據的工具,在UGOPEN中有例子。手動操作可以檢查已載入的裝配下所有零部件,可以設置通過後保存模型,檢查結果保存到Teamcenter中,預設保存在零組件版本下。 代碼中可以設置多個檢查規則。相關設置可以在用戶預設設置中進行設置。 1 // 2 / ...
  • JavaSE 運算符 算術運算符:+,-,*,/,%,++(自增),--(自減) i++:先用後+1;++i:先+1後用 賦值運算符:= 擴展賦值運算符:+=,-=,*=,/= a+=b >a=a+b: ​ 可讀性差,但是編譯效率高,且會自動進行類型轉換; ​ 當ab為基本數據類型時,a+b和b+a ...
  • 面向對象2 訪問修飾符 | | private | default | protected | public | | | | | | | | 當前類 | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_che ...
  • 推薦一些學習qml教程 Qt官方的QML教程: https://doc.qt.io/qt-5/qtqml-index.html 這是一個由Qt官方提供的完整的QML教程,包含了所有基本知識和高級語法。 QML中文網:http://www.qmlcn.com/ 這是一個非常不錯的中文QML學習網站,提 ...
  • QAbstractBUtton: 所有按鈕控制項的基類 提供按鈕的通用功能 繼承自QWidget 屬於抽象類別,不能直接去使用,必須藉助於子類(除非你覺得子類不夠用,想自定義一個按鈕) 大部分功能之前已經使用過,在這裡只作簡單介紹 文本設置: setText(str) :設置按鈕提示文本 text() ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 配置文件中配置項 StartDisabled 的使用方法。 ...