入職1年,總結了讓你的命名更優雅的好習慣

本文已經收錄進個人 80K+ Star 的 Java 開源項目 JavaGuide: https://github.com/Snailclimb/JavaGuide (「Java學習+面試指南」一份涵蓋大部分Java程序員所須要掌握的核心知識。)

編程過程當中,有太多太多讓咱們頭疼的事情了,好比命名、維護其餘人的代碼、寫測試、與其餘人溝通交流等等。就連世界級軟件大師 Martin Fowler 大神都說過 CS 領域有兩大最難的事情,一是緩存失效,一是程序命名(@ https://martinfowler.com/bliki/TwoHardThings.html)。html

今天 Guide 就單獨拎出 「命名」 來聊聊,聽說以前在 Quora 網站,由接近 5000 名程序員票選出來的最難的事情就是「命名」。java

這篇文章配合我以前發的 《編碼 5 分鐘,命名 2 小時?史上最全的 Java 命名規範參考!》 這篇文章閱讀效果更佳哦!git

爲何須要重視命名?

好的命名便是註釋,別人一看到你的命名就知道你的變量、方法或者類是作什麼的! 好的命名對於其餘人(包括你本身)理解你的代碼有着很大的幫助!程序員

簡單舉個例子說明一下命名的重要性。github

《Clean Code》這本書明確指出:面試

好的代碼自己就是註釋,咱們要儘可能規範和美化本身的代碼來減小沒必要要的註釋。apache

若編程語言足夠有表達力,就不須要註釋,儘可能經過代碼來闡述。編程

舉個例子:設計模式

去掉下面複雜的註釋,只須要建立一個與註釋所言同一事物的函數便可緩存

// check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))

應替換爲

if (employee.isEligibleForFullBenefits())

常見命名規則以及適用場景

這裏只介紹 3 種最多見的命名規範。

駝峯命名法(CamelCase)

駝峯命名法應該咱們最多見的一個,這種命名方式使用大小寫混合的格式來區別各個單詞,而且單詞之間不使用空格隔開或者鏈接字符鏈接的命名方式

大駝峯命名法(CamelCase)

類名須要使用大駝峯命名法(UpperCamelCase)

正例:

ServiceDiscovery、ServiceInstance、LruCacheFactory

反例:

serviceDiscovery、Serviceinstance、LRUCacheFactory

小駝峯命名法(lowerCamelCase)

方法名、參數名、成員變量、局部變量須要使用小駝峯命名法(lowerCamelCase)。

正例:

getUserInfo()、createCustomThreadPool()、setNameFormat(String nameFormat)
Uservice userService;

反例:

GetUserInfo()、CreateCustomThreadPool()、setNameFormat(String NameFormat)
Uservice user_service

蛇形命名法(snake_case)

測試方法名、常量、枚舉名稱須要使用蛇形命名法(snake_case)

在蛇形命名法中,各個單詞之間經過下劃線「_」鏈接,好比should_get_200_status_code_when_request_is_validCLIENT_CONNECT_SERVER_FAILURE

蛇形命名法的優點是命名所須要的單詞比較多的時候,好比我把上面的命名經過小駝峯命名法給你們看一下:「shouldGet200StatusCodoWhenRequestIsValid」。感受如何? 相比於使用蛇形命名法(snake_case)來講是否是不那麼易讀?**

正例:

@Test
void should_get_200_status_code_when_request_is_valid() {
  ......
}

反例:

@Test
void shouldGet200StatusCodoWhenRequestIsValid() {
  ......
}

串式命名法(kebab-case)

在串式命名法中,各個單詞之間經過下劃線「-」鏈接,好比dubbo-registry

建議項目文件夾名稱使用串式命名法(kebab-case),好比 dubbo 項目的各個模塊的命名是下面這樣的。

常見命名規範

Java 語言基本命名規範

1.類名須要使用大駝峯命名法(UpperCamelCase)風格。方法名、參數名、成員變量、局部變量須要使用小駝峯命名法(lowerCamelCase)。

2.測試方法名、常量、枚舉名稱須要使用蛇形命名法(snake_case) ,好比should_get_200_status_code_when_request_is_validCLIENT_CONNECT_SERVER_FAILURE。而且,測試方法名稱要求所有小寫,常量以及枚舉名稱須要所有大寫。

3.項目文件夾名稱使用串式命名法(kebab-case),好比dubbo-registry

4.包名統一使用小寫,儘可能使用單個名詞做爲包名,各個單詞經過 "." 分隔符鏈接,而且各個單詞必須爲單數。

正例: org.apache.dubbo.common.threadlocal

反例: org.apache.dubbo.common.threadLocal

5.抽象類命名使用 Abstract 開頭

//爲遠程傳輸部分抽象出來的一個抽象類(出處:Dubbo源碼)
public abstract class AbstractClient extends AbstractEndpoint implements Client {

}

6.異常類命名使用 Exception 結尾。

//自定義的 NoSuchMethodException(出處:Dubbo源碼)
public class NoSuchMethodException extends RuntimeException {
    private static final long serialVersionUID = -2725364246023268766L;

    public NoSuchMethodException() {
        super();
    }

    public NoSuchMethodException(String msg) {
        super(msg);
    }
}

7.測試類命名以它要測試的類的名稱開始,以 Test 結尾。

//爲 AnnotationUtils 類寫的測試類(出處:Dubbo源碼)
public class AnnotationUtilsTest {
  ......
}

POJO 類中布爾類型的變量,都不要加 is 前綴,不然部分框架解析會引發序列化錯誤。

若是模塊、接口、類、方法使用了設計模式,在命名時需體現出具體模式。

命名易讀性規範

1.爲了能讓命名更加易懂和易讀,儘可能不要縮寫/簡寫單詞,除非這些單詞已經被公承認以被這樣縮寫/簡寫。好比 CustomThreadFactory 不能夠被寫成 ~~CustomTF

2.命名不像函數同樣要儘可能追求短,可讀性強的名字優先於簡短的名字,雖然可讀性強的名字會比較長一點。 這個對應咱們上面說的第 1 點。

3.避免無心義的命名,你起的每個名字都要能代表意思。

正例:UserService userService; int userCount;

反例: UserService service int count

4.避免命名過長(50 個字符之內最好),過長的命名難以閱讀而且醜陋。

5.不要使用拼音,更不要使用中文。 注意:像 alibaba 、wuhan、taobao 這種國際通用名詞能夠當作英文來看待。

正例:discount

反例:dazhe

Codelf:變量命名神器?

這是一個由國人開發的網站,網上有不少人稱其爲變量命名神器, Guide 在實際使用了幾天以後感受沒那麼好用。小夥伴們能夠自行體驗一下,而後再給出本身的判斷。

Codelf 提供了在線網站版本,網址:https://unbug.github.io/codelf/,具體使用狀況以下:

我選擇了 Java 編程語言,而後搜索了「序列化」這個關鍵詞,而後它就返回了不少關於序列化的命名。

而且,Codelf 還提供了 VS code 插件,看這個評價,看來你們仍是很喜歡這款命名工具的。

總結

Guide 製做了一個涵蓋上面全部重要內容的思惟導圖,便於小夥伴們往後查閱。

其餘推薦閱讀

  1. 《阿里巴巴 Java 開發手冊》
  2. 《Clean Code》
  3. Google Java 代碼指南:https://google.github.io/styl...

推薦閱讀

  1. 接近8000字的Spring/SpringBoot經常使用註解總結!安排!
  2. 面試官問我Java8~14的有哪些重要的新特性,我哭了~~~
  3. 第一彈!安排!安利10個讓你爽到爆的IDEA必備插件!
  4. 完結撒花!JavaGuide面試突擊版來啦!

做者介紹: Github 80k Star 項目 JavaGuide(公衆號同名) 做者。每週都會在公衆號更新一些本身原創乾貨。公衆號後臺回覆「1」領取Java工程師必備學習資料+面試突擊pdf。

相關文章
相關標籤/搜索