1. 告別編碼5分鐘,命名2小時!史上超全的Java命名規(guī)范參考!

        共 8388字,需瀏覽 17分鐘

         ·

        2019-12-08 23:21

        簡潔清爽的代碼風格應該是大多數(shù)工程師所期待的。在工作中筆者常常因為起名字而糾結(jié),命名已經(jīng)成為我工作中的攔路虎,夸張點可以說是編程5分鐘,命名兩小時!

        每個公司都有不同的標準,目的是為了保持統(tǒng)一,減少溝通成本,提升團隊研發(fā)效能。所以本文中是筆者結(jié)合阿里巴巴開發(fā)規(guī)范,以及工作中的見聞針對Java領域相關命名進行整理和總結(jié),僅供參考。

        一,Java中的命名規(guī)范

        好的命名能體現(xiàn)出代碼的特征,含義或者是用途,讓閱讀者可以根據(jù)名稱的含義快速厘清程序的脈絡。不同語言中采用的命名形式大相徑庭,Java中常用到的命名形式共有三種,既首字母大寫的UpperCamelCase,首字母小寫的lowerCamelCase以及全部大寫的并用下劃線分割單詞的UPPERCAMELUNSER_SCORE。通常約定,類一般采用大駝峰命名,方法和局部變量使用小駝峰命名,而大寫下劃線命名通常是常量和枚舉中使用。

        類型(名)約束
        項目全部小寫
        多個單詞用中劃線分隔‘-’
        spring-cloud
        全部小寫com.alibaba.fastjson
        單詞首字母大寫Feature,
        FieldDeserializer
        變量首字母小寫
        多個單詞組成時,
        除首個單詞
        其他單詞首字母都要大寫
        password,?
        userName
        常量全部大寫,多個單詞,用'_'分隔CACHEEXPIREDTIME
        方法同變量read(),?
        getById(Long id)

        二,包命名

        包名統(tǒng)一使用小寫點分隔符之間有且僅有一個自然語義的英文單詞或者多個單詞自然連接到一塊(如 springframework,deepspace不需要使用任何分割)。包名統(tǒng)一使用單數(shù)形式,如果類命有復數(shù)含義,則可以使用復數(shù)形式。

        包名的構成可以分為以下幾四部分【前綴】 【發(fā)起者名】【項目名】【模塊名】。常見的前綴可以分為以下幾種:

        前綴含義
        indi

        onem
        indi.發(fā)起者名.項目名.模塊名.……個體項目
        個人發(fā)起,但非自己獨自完成
        可公開或私有項目,
        copyright主要屬于發(fā)起者。
        perspers.個人名.項目名.模塊名.……個人項目
        指個人發(fā)起,獨自完成,
        可分享的項目
        copyright主要屬于個人
        privpriv.個人名.項目名.模塊名.……私有項目,指個人發(fā)起,獨自完成
        非公開的私人使用的項目,
        copyright屬于個人。
        teamteam.團隊名.項目名.模塊名.……團隊項目,指由團隊發(fā)起
        并由該團隊開發(fā)的項目
        copyright屬于該團隊所有
        頂級域名com.公司名.項目名.模塊名.……公司項目
        copyright由項目發(fā)起的公司所有

        三,類命名

        類名使用大駝峰命名形式,類命通常時名詞或名詞短語,接口名除了用名詞和名詞短語以外,還可以使用形容詞或形容詞短語,如Cloneable,Callable等,表示實現(xiàn)該接口的類有某種功能或能力。對于測試類則以它要測試的類開頭,以Test結(jié)尾,如HashMapTest。

        對于一些特殊特有名詞縮寫也可以使用全大寫命名,比如XMLHttpRequest,不過筆者認為縮寫三個字母以內(nèi)都大寫,超過三個字母則按照要給單詞算。這個沒有標準如阿里巴巴中fastjson用JSONObject作為類命,而google則使用JsonObjectRequest命名,對于這種特殊的縮寫,原則是統(tǒng)一就好。

        屬性(類)約束
        抽象Abstract?

        Base 開頭
        BaseUserService
        枚舉Enum 作為后綴OSType
        工具Utils作為后綴StringUtils
        異常Exception結(jié)尾RuntimeException
        接口實現(xiàn)接口名+ ImplUserServiceImpl
        領域模型相/DO/DTO/VO/DAO正例:UserDAO
        反例:UserDao
        設計模式相關Builder,F(xiàn)actory等當使用到設計模式時
        要使用對應的設計模式作為后綴
        如ThreadFactory
        處理特定功能Handler,Predicate
        Validator
        表示處理器,校驗器,斷言
        這些類工廠還有配套的方法名
        如handle,predicate,validate
        測試Test后綴UserServiceTest
        表示用來測試UserService類的
        MVC分層Controller,Service
        ServiceImpl,DAO
        后綴
        UserManageController
        UserManageDAO

        四,方法

        方法命名采用小駝峰的形式,首字小寫,往后的每個單詞首字母都要大寫。和類名不同的是,方法命名一般為動詞或動詞短語,與參數(shù)或參數(shù)名共同組成動賓短語,即動詞 + 名詞。一個好的函數(shù)名一般能通過名字直接獲知該函數(shù)實現(xiàn)什么樣的功能。

        4.1 返回真?zhèn)沃档姆椒?/h3>

        注:pre- prefix前綴,suf- suffix后綴,alo-alone 單獨使用

        位置單詞意義
        preis對象是否符合期待的狀態(tài)isValid
        precan對象能否執(zhí)行所期待的動作canRemove
        preshould調(diào)用方執(zhí)行某個命令
        或方法是好還是不好
        應不應該,
        或者說推薦還是不推薦
        shouldMigrate
        prehas對象是否持有
        所期待的數(shù)據(jù)和屬性
        hasObservers
        preneeds調(diào)用方是否需要
        執(zhí)行某個命令或方法
        needsMigrate

        4.2 用來檢查的方法

        單詞意義
        ensure檢查是否為期待的狀態(tài)
        不是則拋出異?;蚍祷豦rror code
        ensureCapacity
        validate檢查是否為正確的狀態(tài)
        不是則拋出異?;蚍祷豦rror code
        validateInputs

        4.3 按需求才執(zhí)行的方法

        位置單詞意義
        sufIfNeeded需要的時候執(zhí)行
        不需要則什么都不做
        drawIfNeeded
        premight同上mightCreate
        pretry嘗試執(zhí)行
        失敗時拋出異常
        或是返回errorcode
        tryCreate
        sufOrDefault嘗試執(zhí)行
        失敗時返回默認值
        getOrDefault
        sufOrElse嘗試執(zhí)行
        失敗時返回
        實際參數(shù)中指定的值
        getOrElse
        preforce強制嘗試執(zhí)行
        error拋出異?;蚴欠祷刂?/span>
        forceCreate,?
        forceStop

        4.4 異步相關方法

        位置單詞意義
        preblocking線程阻塞方法blockingGetUser
        sufInBackground執(zhí)行在后臺線程doInBackground
        sufAsync異步方法sendAsync
        sufSync

        同步方法

        sendSync

        pre
        /
        alo

        schedule

        Job和Tas
        k放入隊列

        schedule,?
        scheduleJob

        pre
        /
        alo

        post同上postJob

        pre
        /
        alo

        execute

        執(zhí)行異步

        同步方法
        execute,
        executeTask

        pre
        /
        alo

        start同上

        star,
        tstartJob

        pre
        /
        alo

        cancel停止異步方法

        cance,
        cancelJob

        pre
        /
        alo

        stop同上

        stop,

        stopJob

        4.5 回調(diào)方法

        位置單詞意義
        preon事件發(fā)生時執(zhí)行onCompleted
        prebefore事件發(fā)生前執(zhí)行beforeUpdate
        prepre同上preUpdate
        prewill同上willUpdate
        preafter事件發(fā)生后執(zhí)行afterUpdate
        prepost同上postUpdate
        predid同上didUpdate
        preshould確認事件
        是否可以執(zhí)行
        shouldUpdate

        4.6 操作對象生命周期的方法

        單詞意義
        initialize初始化或延遲初始化使用initialize
        pause暫停onPause , pause
        stop停止onStop, stop
        abandon銷毀的替代abandon
        destroy同上destroy
        dispose同上dispose

        4.7 與集合操作相關的方法

        單詞意義
        contains是包含指定對象相同的對象contains
        add添加addJob
        append添加appendJob
        insert插入到下標ninsertJob
        put添加與key對應的元素putJob
        remove移除元素removeJob
        enqueue添加到隊列的最末位enqueueJob
        dequeue從隊列中頭部取出并移除dequeueJob
        push添加到棧頭pushJob
        pop從棧頭取出并移除popJob
        peek從棧頭取出但不移除peekJob
        find尋找符合條件的某物findById

        4.8 與數(shù)據(jù)相關的方法

        單詞意義
        create新創(chuàng)建createAccount
        new新創(chuàng)建newAccount
        from從既有的某物新建
        或是從其他的數(shù)據(jù)新建
        fromConfig
        to轉(zhuǎn)換toString
        update更新既有某物updateAccount
        load讀取loadAccount
        fetch遠程讀取fetchAccount
        delete刪除deleteAccount
        remove刪除removeAccount
        save保存saveAccount
        store保存storeAccount
        commit保存commitChange
        apply保存或應用applyChange
        clear清除或是恢復到初始狀態(tài)clearAll
        reset清除或是恢復到初始狀態(tài)resetAll

        4.9 成對出現(xiàn)的動詞

        單詞意義
        get獲取set 設置
        add 增加remove 刪除
        create 創(chuàng)建destory 移除
        start 啟動stop 停止
        open 打開close 關閉
        read 讀取write 寫入
        load 載入save 保存
        create 創(chuàng)建destroy 銷毀
        begin 開始end 結(jié)束
        backup 備份restore 恢復
        import 導入export 導出
        split 分割merge 合并
        inject 注入extract 提取
        attach 附著detach 脫離
        bind 綁定separate 分離
        view 查看browse 瀏覽
        edit 編輯modify 修改
        select 選取mark 標記
        copy 復制paste 粘貼
        undo 撤銷redo 重做
        insert 插入delete 移除
        add 加入append 添加
        clean 清理clear 清除
        index 索引sort 排序
        find 查找search 搜索
        increase 增加decrease 減少
        play 播放pause 暫停
        launch 啟動run 運行
        compile 編譯execute 執(zhí)行
        debug 調(diào)試trace 跟蹤
        observe 觀察listen 監(jiān)聽
        build 構建publish 發(fā)布
        input 輸入output 輸出
        encode 編碼decode 解碼
        encrypt 加密decrypt 解密
        compress 壓縮decompress 解壓縮
        pack 打包unpack 解包
        parse 解析emit 生成
        connect 連接disconnect 斷開
        send 發(fā)送receive 接收
        download 下載upload 上傳
        refresh 刷新synchronize 同步
        update 更新revert 復原
        lock 鎖定unlock 解鎖
        check out 簽出check in 簽入
        submit 提交commit 交付
        push 推pull 拉
        expand 展開collapse 折疊
        begin 起始end 結(jié)束
        start 開始finish 完成
        enter 進入exit 退出
        abort 放棄quit 離開
        obsolete 廢棄depreciate 廢舊
        collect 收集aggregate 聚集

        五,變量&常量命名

        5.1 變量命名

        變量是指在程序運行中可以改變其值的量,包括成員變量和局部變量。變量名由多單詞組成時,第一個單詞的首字母小寫,其后單詞的首字母大寫,俗稱駱駝式命名法(也稱駝峰命名法),如 computedValues,index、變量命名時,盡量簡短且能清楚的表達變量的作用,命名體現(xiàn)具體的業(yè)務含義即可。

        變量名不應以下劃線或美元符號開頭,盡管這在語法上是允許的。變量名應簡短且富于描述。變量名的選用應該易于記憶,即,能夠指出其用途。盡量避免單個字符的變量名,除非是一次性的臨時變量。pojo中的布爾變量,都不要加is(數(shù)據(jù)庫中的布爾字段全都要加 is_ 前綴)。

        5.2 常量命名

        常量命名CONSTANT_CASE,一般采用全部大寫(作為方法參數(shù)時除外),單詞間用下劃線分割。那么什么是常量呢?

        常量是在作用域內(nèi)保持不變的值,一般使用final進行修飾。一般分為三種,全局常量(public static final修飾),類內(nèi)常量(private static final 修飾)以及局部常量(方法內(nèi),或者參數(shù)中的常量),局部常量比較特殊,通常采用小駝峰命名即可。

        1. /**

        2. * 一個demo

        3. *

        4. * @author Jann Lee

        5. * @date 2019-12-07 00:25

        6. **/

        7. publicclassHelloWorld{


        8. /**

        9. * 局部常量(正例)

        10. */

        11. publicstaticfinallong USER_MESSAGE_CACHE_EXPIRE_TIME =3600;


        12. /**

        13. * 局部常量(反例,命名不清晰)

        14. */

        15. publicstaticfinallong MESSAGE_CACHE_TIME =3600;


        16. /**

        17. * 全局常量

        18. */

        19. privatestaticfinalString ERROR_MESSAGE =" error message";


        20. /**

        21. * 成員變量

        22. */

        23. privateint currentUserId;


        24. /**

        25. * 控制臺打印 {@code message} 信息

        26. *

        27. * @param message 消息體,局部常量

        28. */

        29. publicvoid sayHello(finalString message){

        30. System.out.println("Hello world!");

        31. }


        32. }

        常量一般都有自己的業(yè)務含義,不要害怕長度過長而進行省略或者縮寫。如,用戶消息緩存過期時間的表示,那種方式更佳清晰,交給你來評判。

        通用命名規(guī)則

        1. 盡量不要使用拼音;杜絕拼音和英文混用。對于一些通用的表示或者難以用英文描述的可以采用拼音,一旦采用拼音就堅決不能和英文混用。正例:BeiJing, HangZhou 反例:validateCanShu

        2. 命名過程中盡量不要出現(xiàn)特殊的字符,常量除外。

        3. 盡量不要和jdk或者框架中已存在的類重名,也不能使用java中的關鍵字命名。

        4. 妙用介詞,如for(可以用同音的4代替), to(可用同音的2代替), from, with,of等。如類名采用User4RedisDO,方法名getUserInfoFromRedis,convertJson2Map等。

        六,代碼注解

        6.1 注解的原則

        好的命名增加代碼閱讀性,代碼的命名往往有嚴格的限制。而注解不同,程序員往往可以自由發(fā)揮,單并不意味著可以為所欲為之胡作非為。優(yōu)雅的注解通常要滿足三要素。

        1. Nothing is strange 沒有注解的代碼對于閱讀者非常不友好,哪怕代碼寫的在清除,閱讀者至少從心理上會有抵觸,更何況代碼中往往有許多復雜的邏輯,所以一定要寫注解,不僅要記錄代碼的邏輯,還有說清楚修改的邏輯。

        2. Less is more 從代碼維護角度來講,代碼中的注解一定是精華中的精華。合理清晰的命名能讓代碼易于理解,對于邏輯簡單且命名規(guī)范,能夠清楚表達代碼功能的代碼不需要注解。濫用注解會增加額外的負擔,更何況大部分都是廢話。

        1. // 根據(jù)id獲取信息【廢話注解】

        2. getMessageById(id)

        1. Advance with the time 注解應該隨著代碼的變動而改變,注解表達的信息要與代碼中完全一致。通常情況下修改代碼后一定要修改注解。

        6.2 注解格式

        注解大體上可以分為兩種,一種是javadoc注解,另一種是簡單注解。javadoc注解可以生成JavaAPI為外部用戶提供有效的支持javadoc注解通常在使用IDEA,或者Eclipse等開發(fā)工具時都可以自動生成,也支持自定義的注解模板,僅需要對對應的字段進行解釋。參與同一項目開發(fā)的同學,盡量設置成相同的注解模板。

        a. 包注解

        包注解在工作中往往比較特殊,通過包注解可以快速知悉當前包下代碼是用來實現(xiàn)哪些功能,強烈建議工作中加上,尤其是對于一些比較復雜的包,包注解一般在包的根目錄下,名稱統(tǒng)一為package-info.java。

        1. /**

        2. * 落地也質(zhì)量檢測

        3. * 1. 用來解決什么問題

        4. * 對廣告主投放的廣告落地頁進行性能檢測,模擬不同的系統(tǒng),如Android,IOS等; 模擬不同的網(wǎng)絡:2G,3G,4G,wifi等

        5. *

        6. * 2. 如何實現(xiàn)

        7. * 基于chrome瀏覽器,用chromedriver驅(qū)動瀏覽器,設置對應的網(wǎng)絡,OS參數(shù),獲取到瀏覽器返回結(jié)果。

        8. *

        9. * 注意:網(wǎng)絡環(huán)境配置信息{@link cn.mycookies.landingpagecheck.meta.NetWorkSpeedEnum}目前使用是常規(guī)速度,可以根據(jù)實際情況進行調(diào)整

        10. *

        11. * @author cruder

        12. * @time 2019/12/7 20:3 下午

        13. */

        14. package cn.mycookies.landingpagecheck;

        b. 類注接

        javadoc注解中,每個類都必須有注解。

        1. /**

        2. * Copyright (C), 2019-2020, Jann balabala...

        3. *

        4. * 類的介紹:這是一個用來做什么事情的類,有哪些功能,用到的技術.....

        5. *

        6. * @author 類創(chuàng)建者姓名 保持對齊

        7. * @date 創(chuàng)建日期 保持對齊

        8. * @version 版本號 保持對齊

        9. */

        c. 屬性注解

        在每個屬性前面必須加上屬性注釋,通常有一下兩種形式,至于怎么選擇,你高興就好,不過一個項目中要保持統(tǒng)一。

        1. /** 提示信息 */

        2. privateString userName;

        3. /**

        4. * 密碼

        5. */

        6. privateString password;

        d. 方法注釋

        在每個方法前面必須加上方法注釋,對于方法中的每個參數(shù),以及返回值都要有說明。

        1. /**

        2. * 方法的詳細說明,能干嘛,怎么實現(xiàn)的,注意事項...

        3. *

        4. * @param xxx 參數(shù)1的使用說明, 能否為null

        5. * @return 返回結(jié)果的說明, 不同情況下會返回怎樣的結(jié)果

        6. * @throws 異常類型 注明從此類方法中拋出異常的說明

        7. */

        e. 構造方法注釋

        在每個構造方法前面必須加上注釋,注釋模板如下:

        1. /**

        2. * 構造方法的詳細說明

        3. *

        4. * @param xxx 參數(shù)1的使用說明, 能否為null

        5. * @throws 異常類型 注明從此類方法中拋出異常的說明

        6. */

        而簡單注解往往是需要工程師字節(jié)定義,在使用注解時應該注意一下幾點:

        1. 枚舉類的各個屬性值都要使用注解,枚舉可以理解為是常量,通常不會發(fā)生改變,通常會被在多個地方引用,對枚舉的修改和添加屬性通常會帶來很大的影響。

        2. 保持排版整潔,不要使用行尾注釋;雙斜杠和星號之后要用1個空格分隔。

        1. int id =1;// 反例:不要使用行尾注釋

        2. //反例:換行符與注釋之間沒有縮進

        3. int age =18;

        4. // 正例:姓名

        5. String name;

        6. /**

        7. * 1. 多行注釋

        8. *

        9. * 2. 對于不同的邏輯說明,可以用空行分隔

        10. */

        總結(jié)

        無論是命名和注解,他們的目的都是為了讓代碼和工程師進行對話,增強代碼的可讀性,可維護性。優(yōu)秀的代碼往往能夠見名知意,注解往往是對命名的補充和完善。命名太南了!

        參考文獻:《碼出高效》
        https://www.cnblogs.com/wangcp-2014/p/10215620.html
        https://qiita.com/KeithYokoma/items/2193cf79ba76563e3db6
        https://google.github.io/styleguide/javaguide.html#s2.1-file-name

        推薦閱讀:


        4bf872459a70442de832ea8bf6b7138f.webp喜歡我可以給我設為星標哦4bf872459a70442de832ea8bf6b7138f.webp

        12a58cbdcca29fa514bd0a00fb826ac9.webp

        好文章,我?在看?

        f9d3d2662fa24d6fa47e5e3838c1f38f.webp
        瀏覽 84
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 国产精品久久久久久久久潘金莲 | 又黄又爽视频网站 | 这里有精品视频 | 欧美成人精品一级一级 | 超碰在线免费 |