<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Johnny's Collections

    生活總是有太多的無奈與失望,讓我們以在努力學(xué)習(xí)和工作中獲得的成就感和快樂來沖淡它們。

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      10 Posts :: 0 Stories :: 80 Comments :: 0 Trackbacks
    筆者從事開發(fā)多年,有這樣一種感覺,查看一些開源項(xiàng)目,如Spring、Apache Common等源碼是一件賞心悅目的事情,究其原因,無外兩點(diǎn):1)代碼質(zhì)量非常高;2)命名特別規(guī)范(這可能跟老外的英語水平有關(guān))。
    要寫高質(zhì)量的代碼,不是一件容易的事,需要長(zhǎng)年累月的鍛煉,是一個(gè)量變到質(zhì)變的過程,但要寫好命名,只需要有比較好的英語語法基礎(chǔ)和一種自我意識(shí)即可輕松達(dá)到。本博文將會(huì)結(jié)合本人的開發(fā)經(jīng)驗(yàn),總結(jié)出若干命名規(guī)則,這些命名規(guī)則純屬個(gè)人的使用習(xí)慣,不代表是一種理想的規(guī)則,在這里列舉出來,供大家交流討論。

    1.切忌使用沒有任何意義的英語字母進(jìn)行命名:
        for(int i=0; i<10; i++) {
            ...
        }
    這是在很多教Java基本語法的書上常見的代碼片斷,作為教學(xué)材料,這樣寫無可厚非,但作為真正的代碼編寫,程序員必須要養(yǎng)成良好的習(xí)慣,不要使用這種沒有任何含義的命名方式,這里可以使用“index”。

    2.切忌使用拼音,甚至是拼音首字母組合:
        cishu =5; // 循環(huán)的次數(shù)
        zzje = 1000.00 // 轉(zhuǎn)賬金額
    筆者在做代碼檢查的時(shí)候,無數(shù)次遇到過這樣的命名,使人哭笑不得

    3.要使用英文,而且要使用準(zhǔn)確的英語,無論是拼寫還是語法:
    • 名詞單數(shù),必須使用單數(shù)英文,如Account、Customer。
    • 對(duì)于數(shù)組,列表等對(duì)象集合的命名,必須使用復(fù)數(shù),而且最好按照英文的語法基礎(chǔ)知識(shí)使用準(zhǔn)確的復(fù)數(shù)形式,如 List<Account> accounts、Set<Strategy> strategies。
    • 對(duì)于boolean值的屬性,很多開發(fā)人員習(xí)慣使用isXXX,如isClose(是否關(guān)閉),但這里有兩點(diǎn)建議:1)最好不要帶“is”,因?yàn)镴avaBean的規(guī)范,為屬性生成get/set方法的時(shí)候,會(huì)用“get/set/is”,上面的例子,生成get/set方法就會(huì)變成“getIsClose/isIsClose/getIsClose”,非常別扭;2)由于boolean值通常反映“是否”,所以準(zhǔn)確的用法,應(yīng)該是是用“形容詞”,上面的例子,最終應(yīng)該被改為 closed,那么get/set方法就是“getClosed/isColsed/setClosed”,非常符合英語閱讀習(xí)慣。

    4.方法名的命名,需要使用“動(dòng)賓結(jié)構(gòu)短語”或“是動(dòng)詞+表語結(jié)構(gòu)短語”,筆者曾看到過千奇百怪的方法命名,有些使用名詞,有些甚至是“名詞+動(dòng)詞”,而且,如果賓語是一個(gè)對(duì)象集合,還是最好使用復(fù)數(shù):
        createOrder(Order order) good   
        orderCreate(Order order) bad
        removeOrders(List<Order> orders) good
        removeOrder(List<Order> order) bad

    5.對(duì)于常見的“增刪改查”方法,命名最好要謹(jǐn)慎:
    • 增加:最常見使用create和add,但最好根據(jù)英語的語義進(jìn)行區(qū)分,這有助于理解,create代表創(chuàng)建,add代表增加。比如,要?jiǎng)?chuàng)建一個(gè)Student,用createStudent要比用addStudent好,為什么?想想如果有個(gè)類叫Clazz(班級(jí),避開Java關(guān)鍵字),現(xiàn)在要把一個(gè)Student加入到一個(gè)Clazz,Clazz很容易就定義了一個(gè) addStudent(Student student)的方法,那么就比較容易混淆。
    • 修改:常見的有alter、update、modify,個(gè)人覺得modify最準(zhǔn)確。
    • 查詢:對(duì)于獲取單個(gè)對(duì)象,可以用get或load,但個(gè)人建議用get,解釋請(qǐng)見第7點(diǎn)的說明,對(duì)于不分條件列舉,用list,對(duì)于有條件查詢,用search(最好不要用find,find在英文了強(qiáng)調(diào)結(jié)果,是“找到”的意思,你提供一個(gè)“查詢”方法,不保證輸入的條件總能“找到”結(jié)果)。
    • 刪除:常見的有delete和remove,但刪除建議用delete,因?yàn)閞emove有“移除”的意思,參考Clazz的例子就可以理解,從班級(jí)移除一個(gè)學(xué)生,會(huì)用removeStudent。

    6.寧愿方法名冗長(zhǎng),也不要使用讓人費(fèi)解的簡(jiǎn)寫,筆者曾經(jīng)遇到一個(gè)方法,判斷“支付賬戶是否與收款賬戶相同”,結(jié)果我看到一個(gè)這樣的命名:
        checkIsOrderingAccCollAccSame(...) 很難理解,我馬上把它改為:
        isOrderingAccountSameAsCollectionAccount(...),雖然有點(diǎn)長(zhǎng),但非常容易閱讀,而且這種情況總是出現(xiàn)得比較少。

    7.如果你在設(shè)計(jì)業(yè)務(wù)系統(tǒng),最好不要使用技術(shù)化的術(shù)語去命名。筆者曾經(jīng)工作的公司曾經(jīng)制訂這樣的命名規(guī)則,接口必須要以“I”開頭,數(shù)據(jù)傳輸對(duì)象必須以“DTO”作為后綴,數(shù)據(jù)訪問對(duì)象必須以“DAO”作為后綴,領(lǐng)域?qū)ο蟊仨氁?#8220;DO”作為后綴,我之所以不建議這種做法,是希望設(shè)計(jì)人員從一開始就引導(dǎo)開發(fā)人員,要從“業(yè)務(wù)”出發(fā)考慮問題,而不要從“技術(shù)”出發(fā)。所以,接口不需要非得以“I”開頭,只要其實(shí)現(xiàn)類以“Impl”結(jié)尾即可(注:筆者認(rèn)為接口是與細(xì)節(jié)無關(guān)的,與技術(shù)無關(guān),但實(shí)現(xiàn)類是實(shí)現(xiàn)相關(guān)的,用技術(shù)化術(shù)語無可口非),而數(shù)據(jù)傳輸對(duì)象,其實(shí)無非就是保存一個(gè)對(duì)象的信息,因此可以用“**Info”,如CustomerInfo,領(lǐng)域?qū)ο蟊旧砭褪菢I(yè)務(wù)的核心,所以還是以其真實(shí)名稱出現(xiàn),比如Account、Customer,至于“DAO”,這一個(gè)詞來源于J2ee的設(shè)計(jì)模式,筆者在之前的項(xiàng)目使用“***Repository”命名,意味“***的倉庫”,如AccountRepository,關(guān)于“Repository”這個(gè)詞的命名,是來源于Eric Evans的《Domain-Driven Design》一書的倉庫概念,Eric Evans對(duì)Repository的概念定義是:領(lǐng)域?qū)ο蟮母拍钚约希瑐€(gè)人認(rèn)為這個(gè)命名非常的貼切,它讓程序員完全從技術(shù)的思維中擺脫出來,站在業(yè)務(wù)的角度思考問題。說到這里,可能有人會(huì)反駁:像Spring、Hibernate這些優(yōu)秀的框架,不是都在用“I”作為接口開頭,用“DAO”來命名數(shù)據(jù)訪問對(duì)象嗎?沒錯(cuò)!但千萬別忽略了語義的上下文,Spring、Hibernate框架都是純技術(shù)框架,我這里所說的場(chǎng)景是設(shè)計(jì)業(yè)務(wù)系統(tǒng)。

    8.成員變量不要重復(fù)類的名稱,例如,很多人喜歡在Account對(duì)象的成員變量中使用accountId,accountNumber等命名,其實(shí)沒有必要,想想成員變量不會(huì)鼓孤立的存在,你引用accountId,必須是account.accountId,用account.id已經(jīng)足夠清晰了。

    “勿以善小而不為,勿以惡小而為之”、“細(xì)節(jié)決定成敗”,有太多的名言告訴我們,要注重細(xì)節(jié)。一個(gè)優(yōu)秀的程序員,必須要有堅(jiān)實(shí)的基礎(chǔ),而對(duì)于命名規(guī)則這樣容易掌握的基礎(chǔ),我們何不現(xiàn)行?
    posted on 2010-04-29 22:54 Johnny.Liang 閱讀(6630) 評(píng)論(17)  編輯  收藏 所屬分類: 編程技巧

    Feedback

    # re: 編寫高質(zhì)量的代碼——從命名入手[未登錄] 2010-04-30 10:35 m
    第一個(gè)就寫爆了……
    for語句內(nèi)使用i,j,k……是約定俗成的,符合習(xí)慣的。
    并不是說教材上胡亂寫的。  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-04-30 11:35 BioKen
    第一個(gè)是有點(diǎn)牽強(qiáng),可能他所舉的例子不能表達(dá)的真正想要表達(dá)的意思吧@m
      回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-04-30 11:52 泰妮絲童裝
    按開始的開始就愛看的  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-04-30 12:27 BearRui(AK-47)
    其實(shí)一直有個(gè)想法困難很久,為什么不能使用拼音,大家都是中國(guó)人,英語水平參差不齊,但拼音水平還是一樣的,而且用英文同1個(gè)意思,不同人寫出來單詞確不一樣。我覺得使用拼音非常好,在注釋比較少的情況下,拼音命名更能幫助理解程序。個(gè)人覺得拼音更加適合我們的國(guó)情。

    當(dāng)然如果非常常見的除外,比如add,insert delete。

    如果你寫的程序會(huì)給外國(guó)人看哪就另當(dāng)別人認(rèn)了。可是有幾個(gè)人的代碼會(huì)給外國(guó)人看?  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-04-30 12:45 Johnny.Liang
    @BearRui(AK-47)
    我是這樣想的,做開發(fā)人員,基礎(chǔ)英語知識(shí)是必備的工具,很多技術(shù)文檔、規(guī)范、API都是英文的,即使有翻譯,也是讀英語的比較好,因此在我參與過的項(xiàng)目中,包括我曾經(jīng)工作過的公司,都是嚴(yán)禁使用拼音的。  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手[未登錄] 2010-05-01 19:56 海邊沫沫
    用拼音是真的不好,因?yàn)槟悴荒馨?234聲注上去,而且即使注上去了,也有很多重復(fù)的詞。用純拼音寫一本書你看不看?

    用拼音的縮寫就更加要人命了。

    樓主的總結(jié)非常好,特別是對(duì)boolean變量的命名,讓我很受啟發(fā)。其它的條目我一般都是和樓主一樣的做法。  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-05-02 11:10 vagrant
    政府項(xiàng)目里面,無數(shù)的中國(guó)特色式業(yè)務(wù)名稱,怎么翻譯成英文?項(xiàng)目組一堆人,怎么確保同一個(gè)名稱翻譯成同一個(gè)英文單詞?  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-05-04 18:21 sf
    第一項(xiàng)就亂叫,請(qǐng)去看下linux 內(nèi)核源碼在來寫blog, ok?  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-05-06 10:29 r
    @vagrant
    世事無絕對(duì),樓主概括的是大部分的情況。頂樓主一個(gè),辛苦!
      回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手[未登錄] 2010-05-07 17:41 Gavin
    值得借鑒...  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手[未登錄] 2010-05-21 09:28 Mike
    寫得不錯(cuò),感謝樓主分享。 期待有更多高質(zhì)量的文章可以學(xué)習(xí)。  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2010-06-20 15:22 趙云
    第一項(xiàng)不敢恭維!  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2011-01-05 17:55 Xluo
    贊一個(gè),學(xué)習(xí)了。  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2012-10-15 22:17 eyougo
    當(dāng)你遇到
    JYR
    JYRQ
    JYRS
    YYRQ
    YYR
    這一長(zhǎng)串變量命名在一個(gè)類里的時(shí)候,頭疼不?
    解釋一下:
    JYR借閱人
    JYRQ借閱日期
    JYRS借閱人數(shù)
    YYRQ預(yù)約日期
    YYR預(yù)約人
    哈哈哈  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2014-06-30 12:57 dohkoos
    第1點(diǎn)完全是謬論,約定俗成的東西你也要改。而且你以為人家不寫成index是沒有理由的嗎??
    for (int i = 0; i < n; i++) {
    for (int j = 0; j < i; j++) {
    }
    }
    算法里經(jīng)常有這種代碼,你把 j 這個(gè)變量改改看,腦細(xì)胞死一堆還可能找不到更好的命名。那些寫程序的先驅(qū)幾年幾十年的血淚總結(jié)出來的東西啊。

    為什么不可以在代碼中使用拼音命名。代碼可讀性包含一致性,因?yàn)榛A(chǔ)代碼都是英文的,如果用拼音命名的話,就破壞了這點(diǎn),破壞了代碼的可讀性。在讀代碼時(shí)需要頻繁地在命名是拼音還是英文中切換,影響效率。
    用首字母縮寫??過段時(shí)間你自己還能記得它是什么意思??  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2015-05-28 18:15 會(huì)長(zhǎng)
    1,第一個(gè)是約定成俗了,而且我一直認(rèn)為i是index的縮寫;
    2,拼音或漢字我覺得可以偶爾使用,有些詞很難翻譯,如”計(jì)劃生育“、”改革開放“等;
    3,接口I打頭,抽象類Abs打頭一目了然,”實(shí)現(xiàn)類以“Impl”結(jié)尾“,不也是從技術(shù)的角度出發(fā)的,如果實(shí)現(xiàn)類還實(shí)現(xiàn)了別的接口怎么辦...
    4,"成員變量不要重復(fù)類的名稱",這樣的話如果數(shù)據(jù)庫中字段名稱為XXXId,那么實(shí)體類屬性名稱與之對(duì)應(yīng)比較好。當(dāng)然數(shù)據(jù)庫也可以不加XXX,直接上Id,但我覺得主鍵還是tableNameId比較好,否則在長(zhǎng)SQL語句中到處都是Id,眼花繚亂。

    其余部分嚴(yán)重同意。  回復(fù)  更多評(píng)論
      

    # re: 編寫高質(zhì)量的代碼——從命名入手 2015-05-28 18:18 會(huì)長(zhǎng)
    @BearRui(AK-47)
    拼音的話會(huì)產(chǎn)生歧義。當(dāng)然熟悉系統(tǒng)的人沒事,新人就比較郁悶了,想砸鍵盤。  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 91免费在线视频| 亚洲av成人片在线观看| 最近中文字幕大全免费版在线| 亚洲 综合 国产 欧洲 丝袜 | 亚洲成人免费网站| 精品一区二区三区免费毛片爱 | 久久亚洲AV成人无码国产电影 | 污网站在线免费观看| 免费在线观看的黄色网址| 男性gay黄免费网站| 免费人妻无码不卡中文字幕18禁| 污污视频网站免费观看| 亚洲日本va中文字幕久久| 久久青草免费91线频观看不卡| 中文字幕亚洲色图| 无码国产精品一区二区免费虚拟VR| 亚洲日本人成中文字幕| 日韩毛片无码永久免费看| 日本一区二区三区免费高清在线| 久久亚洲AV无码西西人体| 亚在线观看免费视频入口| 亚洲a级在线观看| 四虎永久成人免费| 91在线视频免费观看| 亚洲欧洲自拍拍偷综合| 国产高清免费在线| a级毛片毛片免费观看久潮 | 亚洲精品无码少妇30P| 亚洲日韩国产成网在线观看| 久久久久成人精品免费播放动漫| 亚洲香蕉在线观看| 久久亚洲国产精品123区| 久视频精品免费观看99| 亚洲heyzo专区无码综合| 亚洲人成在线播放网站| 欧洲乱码伦视频免费| 男女作爱免费网站| 亚洲成a人不卡在线观看| 国产乱子伦片免费观看中字| 无码免费一区二区三区免费播放 | 女人18毛片水最多免费观看|