常見編碼規範

来源: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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...