丨缺乏業(yè)務(wù)含義的命名如何精準(zhǔn)_第1頁(yè)
丨缺乏業(yè)務(wù)含義的命名如何精準(zhǔn)_第2頁(yè)
丨缺乏業(yè)務(wù)含義的命名如何精準(zhǔn)_第3頁(yè)
丨缺乏業(yè)務(wù)含義的命名如何精準(zhǔn)_第4頁(yè)
丨缺乏業(yè)務(wù)含義的命名如何精準(zhǔn)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

代代123456789publicvoidprocessChapter(longchapterId)Chapterchapter=this.repository.findByChapterId(chapterId);if(chapter==null){thrownewIllegalArgumentException("Unknownchapter["+chapterId+}}這是一段看上去還挺正常的代碼,甚至以很多團(tuán)隊(duì)的標(biāo)準(zhǔn)來(lái)看,這段代碼寫(xiě)得還不錯(cuò)。但如果我問(wèn)你,這段代碼是做什么的。你就需要調(diào)動(dòng)全部注意力,去認(rèn)真閱讀這段代碼,找出其中的邏輯。經(jīng)過(guò)閱讀我們發(fā)現(xiàn),這段代碼做的就是把一個(gè)章節(jié)的翻譯狀態(tài)改成翻譯中。問(wèn)題就出在函數(shù)名上。這個(gè)函數(shù)的名字叫proessChaper(處理章節(jié)),這個(gè)函數(shù)確實(shí)是在處理章節(jié),但是,這個(gè)名字太過(guò)寬泛。如果說(shuō)“將章節(jié)的翻譯狀態(tài)改成翻譯中”叫做處理章節(jié),那么“將章節(jié)的翻譯狀態(tài)改成翻譯完”是不是也叫處理章節(jié)呢?“修改章節(jié)內(nèi)這就是一類(lèi)典型名問(wèn)題,從表面上看,這個(gè)名字是有含義的,但實(shí)際上,它并不能有效地反映這段代碼的含義。如果說(shuō)我在做的是一個(gè)信息處理系統(tǒng),你根本無(wú)法判斷,我做是一個(gè)平臺(tái),還是一個(gè)管理系統(tǒng),從溝通的角度看,這就不是一個(gè)有效的溝通。要想理解它,你需要消耗大量認(rèn)知成本,無(wú)論是時(shí)間,還是精力。data、info、flag、process、handle、build、maintain、manage、modify回到前面那段代碼上,如果它不叫“處理章節(jié)”,那應(yīng)該叫什么呢?首先,命名要能夠描述出這段代碼在做的事情。這段代碼在做的事情就是“將章節(jié)修改為翻譯中”。那是不是它就應(yīng)該叫changeChapterToTranlsating呢?不可否認(rèn),相比于“處理章節(jié)”,chaneChaperToTralsaing這個(gè)名字已經(jīng)進(jìn)了一步,然而,它也不算是一個(gè)好名字,因?yàn)樗氖窃诿枋鲞@段代碼在做的細(xì)節(jié)。我們之所以要將一段代碼封裝起來(lái),一個(gè)重要的原因就是,我們不想知道那么多的細(xì)節(jié)。如果把細(xì)節(jié)平鋪開(kāi)來(lái),那本質(zhì)上和直接閱讀代碼細(xì)節(jié)差別并不大。就這段代碼而言,我們?yōu)槭裁匆逊g狀態(tài)修改成翻譯中,這一定是有原因的,也就是意圖。具體到這里的業(yè)務(wù),我們把翻譯狀態(tài)修改成翻譯中,是因?yàn)槲覀冊(cè)谶@里開(kāi)啟了一個(gè)翻譯的過(guò)程。所以,這段函數(shù)應(yīng)該命名sartTranslaion。代代123456789publicvoidstartTranslation(longchapterId)Chapterchapter=this.repository.findByChapterId(chapterId);if(chapter==null){thrownewIllegalArgumentException("Unknownchapter["+chapterId+}}1List<Book>bookList=這個(gè)bookList變量之所以叫bookList,原因就是它的類(lèi)型是List。這種命名在代碼中幾乎是隨處可見(jiàn)的,比如xxxMap、xxxSet。這是一種不費(fèi)腦子名方式,但是,這種命名卻會(huì)帶來(lái)很多問(wèn)題,因?yàn)樗且环N基于實(shí)現(xiàn)細(xì)節(jié)名方式。我們都知道,編程有一個(gè)重要的原則是面向接口編程,這個(gè)原則從另外一個(gè)角度理解,就是不要面向?qū)崿F(xiàn)編程,因?yàn)榻涌谑欠€(wěn)定的,而實(shí)現(xiàn)是易變的。雖然在大多數(shù)人的理解里,這個(gè)原則是針對(duì)類(lèi)型的,但在命名上,我們也應(yīng)該遵循同樣的原則。為什么?我舉個(gè)例子你就知道了。比如,如果我發(fā)現(xiàn),我現(xiàn)在需要的是一個(gè)不重復(fù)的作品集合,也就是說(shuō),我需要把這個(gè)變量的類(lèi)型從List改成et。變量類(lèi)型你一定會(huì)改,但變量名你會(huì)改嗎?這還真不一定,一旦出現(xiàn)遺忘,就會(huì)出現(xiàn)一個(gè)奇特的現(xiàn)象,一個(gè)叫ooList的變量,它的類(lèi)型是一個(gè)et。這樣,一個(gè)新的就此產(chǎn)生了。那有什么更好的名字嗎?我們需要一個(gè)更面向意圖的名字。其實(shí),我們?cè)谶@段代碼里真正要表達(dá)的是拿到了一堆書(shū),所以,這個(gè)名字可以命名成books。1List<Book>books=比如,在業(yè)務(wù)代碼里如果直接出現(xiàn)了1123456789publicBookgetByIsbn(Stringisbn)BookcachedBook=redisBookStore.get(isbn);if(cachedBook!=null){return}Bookbook=doGetByIsbn(isbn);redisBookStore.put(isbn,book);return}通常來(lái)說(shuō),這里真正需要的是一個(gè)緩存。Redis代代123456789publicBookgetByIsbn(String{=cache.get(isbn);if(cachedBook!=null){returnBookbook=doGetByIsbn(isbn);cache.put(isbn,book);return}再進(jìn)一步,緩存這個(gè)概念其實(shí)也是一個(gè)技術(shù)術(shù)語(yǔ),從某種意義上說(shuō),它也不應(yīng)該出現(xiàn)在業(yè)務(wù)代碼中。這方面做得比較好的是Spring。使用Sring框架時(shí),如果需要緩存,我們通常是加上一個(gè)Annotation(注解):publicBookgetByIsbn(Stringisbn)4程序員之所以喜歡用技術(shù)名詞去命名,一方面是因?yàn)?,這是大家習(xí)慣的語(yǔ)言,另一方面也是因?yàn)槌绦騿T學(xué)習(xí)寫(xiě)代碼,很大程度上是參考別人的代碼,而行業(yè)里面優(yōu)秀的代碼常常是一些開(kāi)源項(xiàng)目,而這些開(kāi)源項(xiàng)目往往是技術(shù)類(lèi)的項(xiàng)目。在一個(gè)技術(shù)類(lèi)的項(xiàng)目中,這些技術(shù)術(shù)語(yǔ)其實(shí)就是它的業(yè)務(wù)語(yǔ)言。但對(duì)于業(yè)務(wù)項(xiàng)目,這個(gè)說(shuō)法就必須重新審視了。務(wù),就要盡可能把技術(shù)術(shù)語(yǔ)開(kāi)來(lái)。無(wú)論是不精準(zhǔn)名也好,技術(shù)名詞也罷,歸根結(jié)底,體現(xiàn)的是同一個(gè)問(wèn)題:對(duì)業(yè)務(wù)理解我在 10x程序員工作法》專(zhuān)欄中曾經(jīng),編寫(xiě)可的代碼要使用業(yè)務(wù)語(yǔ)言怎么才知道名是否用的是業(yè)務(wù)語(yǔ)言呢?一種簡(jiǎn)單的做法就是,把這個(gè)詞講給產(chǎn)品函數(shù):publicvoidapproveChapter(longchapterId,longuserId)3這個(gè)函數(shù)的意圖是,確認(rèn)章節(jié)內(nèi)容審核通過(guò)。這里有一個(gè)問(wèn)題,chapterId是審核章節(jié)的ID,這個(gè)沒(méi)問(wèn)題,但userId是什么呢?了解了一下背景,我們才知道,之所以這里要有一個(gè)userId,是因?yàn)檫@里需要記錄一下審核人的信息,這個(gè)userId就是審核人的userId。你看,通過(guò)業(yè)務(wù)的分析,我們會(huì)發(fā)現(xiàn),這個(gè)userId并不是一個(gè)好名,因?yàn)樗€需要更多的解釋?zhuān)妹莚eviewerUserId,之所以起這個(gè)名字,因?yàn)檫@個(gè)用戶在這個(gè)場(chǎng)景publicvoidapproveChapter(longchapterId,longreviewerUserId)3從某種意義上來(lái)說(shuō),這個(gè)壞味道也是一種不精準(zhǔn)名,但它不是那種一眼可見(jiàn)的壞味不精準(zhǔn)名;命名是軟件開(kāi)發(fā)中兩件難事之一(另一個(gè)難事是緩存失效),不好名本質(zhì)上是增好名要體現(xiàn)出這段代碼在做的事情,而無(wú)需展開(kāi)代碼了解其中的細(xì)節(jié),這是最低的要求。再進(jìn)一步,好名要準(zhǔn)確地體現(xiàn)意圖,而不是實(shí)現(xiàn)細(xì)節(jié)。更高的要求是,用業(yè)務(wù)語(yǔ)前面我們提到了一些代碼中常見(jiàn)的不精準(zhǔn)名所用的詞匯,你還能想到哪些詞呢?歡迎在留言區(qū)你的想法。也歡迎你把這節(jié)課給你身邊對(duì)命名問(wèn)題感到困惑的朋友。參考資料 你的代碼為誰(shuí)而寫(xiě) 不得售賣(mài)。頁(yè)面已增加防盜追蹤,將依法其上一 課前熱身|這些需求給到你,你會(huì)怎么寫(xiě)代碼下一 02|亂用英語(yǔ):站人的視角來(lái)看英文命2 8命名其實(shí)就是對(duì)抽象的定義。不能描述業(yè)務(wù)含義名往往是由于抽象的角度不正確或1 53 3 s…1 21 2222等。老師課程中舉的變量名bookList的例子,在Rails中約定名就是books?,F(xiàn)在已經(jīng)不再使用ROR拿要采用哪種的時(shí)候會(huì)想,如果這種場(chǎng)景在Ra下會(huì)怎樣處,這個(gè)時(shí)通常展開(kāi)11publicResult<List< equestParamStringyear){ panyDTO>list 作者回復(fù):名字長(zhǎng)不是問(wèn)題,問(wèn)題是表達(dá)是否清晰,像 動(dòng)詞不應(yīng)該出現(xiàn)在URI里,分詞應(yīng)該是“-”,byYear實(shí)際上是一個(gè)過(guò)濾條件等等。1 1感謝大大用我的代碼做經(jīng)典案例。1寫(xiě)了很多1性)、可讀性、可性、可擴(kuò)展性,多思考、常重構(gòu)...多看書(shū)去看看《重構(gòu)》《代碼整ory來(lái)命名,實(shí)際上,這里的application對(duì)應(yīng)著DDD中的應(yīng)用服務(wù),service對(duì)應(yīng)著領(lǐng)域服務(wù),在很多團(tuán)隊(duì)里,這些都放到了service里面。reso

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論