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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論