如何給程式中的變數起個好名字?
- 2019 年 10 月 7 日
- 筆記
聲明:
公眾號頭條文章,為技術相關文章
公眾號二條文章,為小說/廣告內容
自己選擇閱讀,不喜勿噴
收益甚微,只為將分享繼續下去
目前對非盈利項目,無私支援的企業
幾乎沒有,實屬無奈
特此希望,樂於分享的個人堅持下去
對一個人來說,名字很重要,俗語說「人如其名」。對程式中的變數而言,名字同樣非常重要。

作為開發人員,你要花費大量的敲程式碼時間來創建變數和考慮給變數起個名字。名字無處不在。你可以命名文件、類、方法和變數。而命名的不同導致有的是好程式碼,有的是糟糕的程式碼,最終這會嚴重影響程式碼維護的成本。
由於我們花費大量時間命名變數,因此做好它非常重要。在本文中,我將向你展示一些簡單的規則,你可以遵循這些規則來創建名字。
在程式碼中起名本身就是一門藝術!
1、名字要顯示真正意圖
這說起來容易做起來難。你多久遇到一次變數名,而這些變數名沒有告訴你有關變數的真實資訊?
一個好的經驗法則是:如果一個名字需要注釋,那麼它並不是真實意圖的命名。
編程大師 Robert C. Martin 在《Clean Code》中說道:「使用注釋是為了彌補我們程式碼表意上的不足。」
這句話意味著如果你的程式碼需要添加註釋,就說明你的程式碼還不夠好。同時,這也說明如果不能在單純的程式碼中展示你對問題或演算法的理解,這是非常失敗的,你只能依靠一些注釋說明你的想法,而不能僅用程式碼。
優秀的程式碼可以讓人在沒有注釋的情況下看懂並理解,好的編程習慣也是讓所有必要的資訊都在程式碼中展示出來。
以下程式碼段是一個變數,它不能揭示真正的意圖:
<?php
變數 $s 沒有顯示任何意義。
它不會看到任何時間流逝的含義。最好選擇一個名稱,該名稱指定要測量的內容以及該測量的單位。因此,很重要的一點就是,程式設計師要用程式碼準確的表達出自己的思想,從而讓其他人明白程式的含義。
下面的示例中的變數名會更好,任選其一。
<?php
選擇顯示意圖的名稱可以使理解一段程式碼變得更加容易,因此也易於維護。 選擇名字需要時間,但是比起維護程式碼,整體節省時間要多得多。
讓我們看一下以下示例:
<?php
為什麼 getList 函數的作用這麼難辨別?它並沒有複雜的表達式。程式碼已縮進並正確格式化。只使用了三個變數,沒有花里胡哨的東西。
再看一下 getOddNumbers 函數。你是否看到該函數與 getList 函數完全相同?
注意,程式碼的複雜度沒有改變。它仍然具有完全相同數量的運算符和變數,以及完全相同數量的嵌套邏輯。唯一改變的是程式碼命名變得更加明確。 通過簡單的名稱重構,我們很容易分辨出這段程式碼的功能。
2、使用某一領域背景中有意義的名字
程式設計師寫的所有程式碼都是和某一領域背景相關的,為了讓寫出的程式碼可以讓個更多的人理解,最好使用該領域背景下的名字。
不好的程式碼示範:
public class EntitiesRelation
當你在編寫針對某個領域的程式碼時,你應該使用領域背景相關的名字。如果以後有另外的人(不僅是程式設計師,也許是測試人員)接觸你的程式碼時,他能輕鬆的理解你寫背景相關的程式碼含義。
所以,程式設計師首先應該考慮的是領域背景問題,之後才是如何出解決方案。
清晰的程式碼示例:
public class ProductWithCategory
3、避免誤導資訊
你應該避免留下掩蓋程式碼含義的錯誤提示。 避免誤導其含義與預期含義有所差異的詞。例如,不要將產品分組稱為 productList,除非它實際上是 List 類型的對象。這可能導致錯誤的結論。一個更好的名字將是產品。
Product[] products;
你可能選擇的最差的變數名稱是大寫的 O 和小寫的 L。這是因為它們看起來很像 0 和 1。
當心使用名稱變化很小的名稱。發現一個文件中的 SomeMethodForEfficientHandlingOfFiles 和另一個文件中的 SomeMethodForEfficientStorageOfFiles 之間的細微差別需要多長時間?乍一看,這些名稱看起來相同。
導致誤解的資訊比沒有資訊更糟糕,有些程式設計師喜歡「隱藏」一些重要資訊,但更糟的是,他們有時會寫出一些讓人誤解的程式碼。
命名混淆:一個詞不要表示多種概念 定義場景中的概念很難,在軟體開發過程中,程式設計師需要花費很多時間去分析某一場景,並命名場景中的各種元素,這樣的工作永遠都是讓程式設計師頭疼的事情。 不好的程式碼示例:
//1.
在第一段程式碼中,這個程式設計師想表達「獲取數據」這個概念,但他用了很多不同的詞」load」,」fetch」, 」get」。在一個場景下,應該用一個統一的詞表示這個概念。
在第二段程式碼中,」set」一詞被用作了兩個概念,第一個是「取出數據顯示」,第二個是「為一個對象賦值」,應該用不同的詞表示這兩個不同的概念。
清晰的程式碼示例:
//1.
4、做出有意義的區分
數字系列命名不是一個命名的好方法。這樣的名稱是非資訊性的,因為它們沒有提供程式碼作者意圖的任何提示。
讓我們看下面的例子:
<?php
當將 arr1和arr1和 arr2 重命名為 source和source和 destination 時,此程式碼將更好地閱讀。
5、使用可以發音的單詞
如果不能說出名字,那麼你就不能在聽起來像個白痴的情況下討論它。這實際上很重要,因為編程的一部分工作是社交活動,每個人都有很大的機會知道自己無法發音的變數名稱。 假設我們有一個名為 $xsq 的變數名,這對貴公司來說是一個非常重要的縮寫。想像一下與同事的對話: 「嘿,那可變的 eks ess kjew 呢?」 「你是說訪問隊列?」 一些開發人員將嘗試將變數發音為一個單詞。其他人會拼出這個詞。
變數命名:使用在上下文有意義的名字 程式碼里的名字都有自己的上下文,上下文對於理解一個程式碼是很重要的,因為它能提供額外的資訊。我們來看一個典型的「地址」上下文:
不好的程式碼示例: string addressCity; string addressHomeNumber;
string addressPostCode;
在大多數情況中,「郵政編碼」(PostCode)是地址的一部分,很顯然,郵政編碼不能單獨使用(除非你是在開發一個專門處理郵編的應用)。 所以,沒有必要在「PostCode」的前面加上「address」。而且,所有的這些資訊都應該有一個上下文環境,在面向對象編程中,這裡應該用一個「Address」類來表達這個地址資訊。 清晰的程式碼示例: class Address { string city; string homeNumber; string postcode;
}
6、使用可搜索的名稱
由一個字母組成的名稱,可能存在難以定位的問題。 數字常量也是如此。數值常量可以用常量變數代替。搜索程式碼時,數字 8 可能會給你帶來很多麻煩。 但是,用常量 MAX_BLOCKS_DISPLAYED 替換它會使它變得更容易。 單字母名稱的唯一用例是簡短方法中的局部變數。
7、命名前綴
不要使用前綴。 例如,某些開發人員習慣在所有私有成員前面加上下劃線。別,你的類和方法應該足夠短小,以至於不需要任何這些前綴。 或者,你可以使用 IDE(或安裝插件),該 IDE 根據變數的範圍會為變數著色。
結論
這樣,你可以在程式碼中創建更有意義的名稱。
作為一名程式設計師你應該:
1、起的名字有意義,可以表達一個概念 2、要考慮名字的長度,名稱中只有必要資訊 3、符合「編碼規範」,有助於理解 4、一個概念不要多個名字混用 5、使用在背景領域和上下文中都有意義的名字