如何給程序中的變量起個好名字?

  • 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、使用在背景領域和上下文中都有意義的名字