常見編碼規範

来源: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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...