《代碼整潔之道》第5章 格式 - 筆記

你應該選擇一套管理代碼格式的簡單規則。如果是團隊,應該選擇一套團隊一致同意采用的簡單格式規則。

最重要的原則:一致性(Consistency)!

  • 沒有完美的格式規范,但有統一的規范。 整個團隊(或者你自己寫項目時)要定下一套格式規則,然后所有人都要嚴格遵守它。哪怕某個規則你不太喜歡,為了團隊整體的代碼風格統一,也得遵循。
  • 為什么? 讀代碼時,大腦就不用去適應不同的排版風格了,可以把精力完全放在理解代碼邏輯上。
  • 強烈建議: 使用自動化代碼格式化工具(IDE 里通常都有,比如 IntelliJ IDEA 的 Reformat Code,Eclipse 的 Format),并配置好團隊統一的格式規范,讓工具去強制執行排版規則。

格式的目的

代碼格式關乎溝通,而溝通是專業開發者的頭等大事。

你今天編寫的功能,即有可能在下一版被修改,而代碼的可讀性會對以后可能發生修改行為產生深遠影響。

垂直格式(Vertical Formatting)- 像寫文章一樣組織代碼

想象你的代碼文件是一張紙,你怎么在紙上從上往下安排內容?

  1. 報紙頭條原則: 文件頂部應該包含最高層次、最概括的概念(比如類名、最重要的功能)。越往下,代碼應該越詳細,越具體。就像讀報紙,先看大標題、導語,再看詳細報道。
  2. 概念之間要留白: 用空行把不相關的概念隔開,就像文章段落之間要有空行一樣。
    • 比如兩個方法之間,應該用空行隔開。
    • 一個方法內部,不同邏輯塊之間(比如初始化變量、執行主要計算、處理結果這三個步驟)也應該用空行稍微隔開,增強可讀性。
  1. 相關性要緊密: 關系非常緊密的代碼(比如屬于同一個邏輯步驟的連續幾行代碼)應該緊挨著,不要用空行隔開,表示它們是一個整體。
  2. 相關代碼要靠近: 概念上相關的代碼,比如調用者和被調用者、使用某個變量的代碼和定義這個變量的代碼,在垂直距離上應該盡量靠近。理想情況下,調用者應該在被調用者上面(回想第三章的向下原則)。很顯然這條規則不使用于分布在不同文件的概念。除非有很好的理由,否則不要把關系密切的概念放到不同文件中,這也是避免使用 protected 的原因。
  3. 垂直距離:概念相關,概念相關的代碼應該放到一起,相關性越強,彼此的距離越短。變量聲明,本地變量聲明盡可能靠近使用位置,實體變量應該聲明在類的頂部位置,這會在大多數方法用到。函數相關,若一個函數調用了另一個函數,應該緊密的把這兩個函數垂直放到一起,調用者放到函數上面,這樣極大的增加了可讀性,程序就有一個自然順序。
  4. 文件總長度: 文件不應該無限長。如果一個文件太長(比如超過幾百行),可能意味著這個類或模塊承擔了太多的責任,可以考慮拆分成多個文件/類。太長的文件翻起來也很費勁。

垂直順序

一般而言,我們想自上向下展示函數調用依賴順序。也就是說,被調用的函數應該放在執行調用的函數下面 1。這樣就建立了一種自頂向下貫穿源代碼模塊的良好信息流。

像報紙文章一般,我們指望最重要的概念先出來,指望以包括最少細節的方式表述它們。我們指望底層細節最后出來。這樣,我們就能掃過源代碼文件,自最前面的幾個函數獲知要旨,而不至于沉溺到細節中。

橫向格式

想象怎么把一行行的代碼寫得更舒服?

空格的使用:

  • 在操作符兩邊加空格: 讓代碼看起來不擁擠,更容易分辨不同的元素。例如 a = b + c; 而不是 a=b+c;
  • 逗號后面加空格: 比如 method(arg1, arg2);
  • 方法名和括號之間不要有空格:methodName(); 而不是 methodName ();
  • 關鍵字后面加空格:if (...), for (...), while (...)

縮進(Indentation):這是水平格式中最重要的! 縮進表示了代碼的層級結構。每一個代碼塊(比如 if 體、for 循環體、方法體、類體)都應該相對于其外層塊進行縮進。嚴格且一致的縮進是代碼可讀性的基石。

不要對齊變量聲明或賦值: 有些人喜歡讓多行變量聲明的賦值符號 = 對齊。雖然看起來整齊,但當你修改其中一行時,可能導致很多其他行的等號位置也需要調整,這在代碼版本管理(Git Diff)時會產生很多不相關的修改,干擾 Code Review。

空范圍

如果循環語句塊為空,不要在結尾加分號,容易看不見,你可以就用空括號,確保縮進,或者換行加 ;,這樣也有點丑

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78444.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ 類與對象(中)—— 默認成員函數與運算符重載的深度解析:構造函數,析構函數,拷貝構造函數,賦值運算符重載,普通取地址重載,const取地址重載

在 C 中,類的默認成員函數是編譯器自動生成的重要機制,合理利用這些函數可以簡化代碼編寫,同時避免資源管理錯誤。本文將從構造函數、析構函數、拷貝構造函數、賦值運算符重載等核心內容展開,結合具體案例深入解析。 一、默認成員…

【KWDB創作者計劃】_企業級多模數據庫實戰:用KWDB實現時序+關系數據毫秒級融合(附代碼、性能優化與架構圖)

一、技術背景與行業痛點 1.1 多模數據融合挑戰 場景痛點: 工業物聯網設備每秒產生百萬級傳感器數據(時序數據)。需關聯設備檔案(關系數據)生成設備健康報告,傳統方案需多數據庫跳轉,延遲>5…

w~嵌入式C語言~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/13870376 一、STM32怎么選型 什么是 STM32 STM32,從字面上來理解,ST是意法半導體,M是Microelectronics的縮寫,32表示32位,合起來理解,STM32就是指S…

Multisim使用教程詳盡版--(2025最新版)

一、Multisim14前言 1.1、主流電路仿真軟件 1. Multisim:NI開發的SPICE標準仿真工具,支持模擬/數字電路混合仿真,內置豐富的元件庫和虛擬儀器(示波器、頻譜儀等),適合教學和競賽設計。官網:艾…

分布式理論和事務

微服務和分布式 微服務 是一種軟件架構風格,它將應用程序拆分成一系列小型、獨立的服務,每個服務專注于單一功能,彼此通過輕量級通信機制(如 API)進行交互。微服務通常是松耦合的,可以獨立開發、部署和擴展…

JAVA:紅黑樹應用的技術指南

🌳 1、簡述 紅黑樹是一種自平衡二叉查找樹(Self-Balancing Binary Search Tree),被廣泛應用于操作系統調度、Java集合、數據庫索引等核心模塊中。本文將從 基本原理 入手,結合 實際應用場景與代碼實例,帶你…

【Pandas】pandas DataFrame rfloordiv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于執行 DataFrame 與另一個對象(如 DataFrame、Series 或標量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于執行 DataFrame 與另一個對象&…

【數據可視化-26】基于人口統計與社會經濟數據的多維度可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

WinForm真入門(18)——DateTimePicker?控件解析

一、基本概念? ?DateTimePicker? 是 Windows 窗體中用于選擇日期和時間的控件,支持以下交互方式: 通過下拉日歷選擇日期通過上下按鈕調整時間直接輸入日期或時間 適用于需要規范日期格式、限制日期范圍或快速輸入的場景(如預約系統、數據…

AVFormatContext 再分析

說明 :將 avfromatContext 的變量依次打印分析,根據ffmpeg 給的說明,猜測,結合網上的文章字節寫測試代碼分析。 從常用到不常用依次分析 1. unsigned int nb_streams; 代表 avfromatContext 中 AVStream **streams 的個數 /** …

計算機網絡-運輸層(1)

計算機網絡-運輸層(1) 文章目錄 計算機網絡-運輸層(1)5.1 運輸層概述5.2 運輸層端口號、復用與分用端口號基本概念端口號特性端口號分類重要說明 5.3 UDP與TCP協議對比關鍵區別說明 5.1 運輸層概述 計算機網絡體系結構中的物理層、數據鏈路層以及網絡層共同解決了主機通過異構…

2025 FIC wp

這次比賽計算機和手機大部分題目都比較常規 第一和第四部分有點讓人摸不著頭腦 比賽的時候第一部分有四個題沒出 第四部分基本都沒怎么出 現在復盤一下 把我當時做題的心得和獲取的新知識記錄一下 互聯網取證的部分就先學習一下別的師傅 檢材 鏈接:https://pan.bai…

【大數據技術-聯邦集群RBF】DFSRouter日志一直打印修改Membership為EXPIRED狀態的日志分析

生產環境遇到下面報錯 2025-04-23 17:44:15,780 INFO store.CachedRecordStore (CachedRecordStore.java:overrideExpiredRecords(192)) - Override State Store record MembershipState: router1:8888->hh-fed-sub25:nn2:nn2:8020-EXPIRED 2025-04-23 17:44:15,781 INFO …

【HarmonyOS 5】鴻蒙檢測系統完整性

【HarmonyOS 5】鴻蒙檢測系統完整性 一、前言 從現實安全威脅來看,設備系統完整性風險已影響至移動應用的各個場景。不少用戶因使用越獄設備(Jailbreak)或非真實設備(Emulator),導致應用安全防護機制失效…

學習spark-streaming收獲

1.流處理的核心概念 ?實時 vs微批處理:理解了 Spark Streaming 的微批處理(Micro-Batch)模型,將流數據切分為小批次(如1秒間隔)進行處理,與真正的流處理(如Flink)的區…

Redis一些小記錄

Redis一些小記錄 SpringData Redis:RedisTemplate配置與數據操作 操作String類型數據 String是Redis中最基本的數據類型,可以存儲字符串、整數或浮點數。RedisTemplate提供了ValueOperations接口來操作String類型的數據,支持設置值、獲取值、…

5G融合消息PaaS項目深度解析 - Java架構師面試實戰

5G融合消息PaaS項目深度解析 - Java架構師面試實戰 場景:互聯網大廠Java求職者面試,面試官針對5G融合消息PaaS項目進行提問。 第一輪提問 面試官:馬架構,請簡要介紹5G融合消息PaaS平臺的核心功能和應用場景。 馬架構&#xff…

【C語言極簡自學筆記】C 語言數組詳解:一維數組與二維數組

在 C 語言中,數組是一種非常重要的數據結構,它可以將多個相同類型的元素組織在一起,以便于我們進行批量處理和操作。本文將詳細介紹 C 語言中的一維數組和二維數組,包括它們的定義、初始化、元素訪問以及內存存儲等方面的內容。 …

04.通過OpenAPI-Swagger規范讓Dify玩轉Agent

dify安裝 cd dify cd docker cp .env.example .env docker compose up -d準備自定義工具 我自建的PowerDNS,它的swagger如下: https://github.com/PowerDNS/pdns/blob/master/docs/http-api/swagger/authoritative-api-swagger.yaml 但需要加上&#x…

汽車產業鏈主表及類別表設計

(提前設計,備用) 一、汽車產業鏈類別表(industry_chain_category) 設計要點 1、核心字段:定義產業鏈分類(如零部件、整車制造、銷售服務等) 2、主鍵約束:自增ID作為唯一標…