常見編碼規範

来源: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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...