1. 程式人生 > >給程式碼起個好名字

給程式碼起個好名字

在公司裡,我有個不怎麼常用的綽號,叫“算命先生”——幫別人起名字的,準確說,幫別人的程式碼起名字,包括專案名,目錄名,類名,屬性名,方法名,變數名等。事實上,我也確確實實幫過別人起名字,起名字總歸有些套路,要避開一些坑,一個好的名字就是一個成功的開始,反之可能後面會帶來很多困擾。我跟同事說,好的名字讓你行走江湖更容易,你看“葉孤城”、“西門吹雪”、“東方不敗”這些名字一聽就知道是絕世高手,但你試著叫“王霸天”、“李二狗”、“牛春花”,不是活不過兩集就是連上鏡的機會都沒有。 下面分享一些個人的經驗及看法,所有的觀點都並非絕對,當你看完整篇文章後肯定也深以為然,我所提出的這些套路也是為了這麼個中心服務的: 使得程式碼更有條理和可讀性。

1,用英文,別用中文,別用拼音,更加別用拼音縮寫

這應該是老生常談了。 C#/Java語言挺神奇,可以用中文做識別符號,比如你建立一個類,叫“貨物訂單”,完全沒問題,但有人嘗試過之後就很快放棄了,因為可讀性實在太差了,另外在做程式碼搜尋的時候,輸入中文字身就比英文要慢,英文還方便用正則等去匹配,中文在這方面操作起來就比較困難,如果你還想把程式碼移植到別的語言去,就更加不能用中文了。 拼音也別用,因為拼音你不念出來的話你往往不知道它想表達什麼意思,漢語拼音中還有聲調,而程式碼中又表示不了,有時候真能讓閱讀者一臉懵逼。 那拼音縮寫就更加不用說了,我維護過一些老古董程式碼就全是拼音縮寫,噁心+崩潰。
不好 不好 垃圾
GoodsOrder 商品訂單 ShangPinDingDan Spdd
InventoryCheck 庫存檔點 KuCunPanDian kcpd
InvoiceManagement 發運單管理 FaYunDanGuanLi fydgl
RouteConfiguration 路由配置 LuYouPeiZhi lypz

2,不要拼寫錯誤

這不是廢話麼?但也不知道是由於不小心還是英文水平太差,我遇到的程式碼中的拼寫錯誤實在太多太多了,更有甚者把公司的名稱都寫錯的。如果你哪天用微軟的程式碼,發現名稱空間是:Micorsoft.Extensions.Logging,你會有什麼感受? 寫程式碼和做別的事情一樣,也需要用心,遇到不確定的東西時,查一下,問一下,如發現自己之前的問題,要及時修正。 隨便列舉一些拼寫錯誤(跟技術無關,純粹看英語水平和仔細程度)
錯誤 正確 描述
lable label 字母前後寫錯是常發生的事情
catched caught catch的過去分詞為不規則
loging logging 注意新增-ing的特例
IsEnable IsEnabled Enabled才是形容詞,才能用系動詞
登陸 登入 你以為中文的錯別字就少了?
SingleBox PackingList 本公司的梗,“發票箱單”,某同事翻譯成了Single(單)Box(箱),奇葩

3,用名詞充當類名

類,通常表示一個數據實體,或者一系列資料與方法的封裝,大多時候是應當使用名詞的。下面是一些例子:
名稱 不太好 不錯
登入資訊 Login(這是動詞唉) LoginReq(Req表示Request,一看就知道這是個登入請求) 或LoginUi,字尾Ui表示UI層使用的類。
出庫訂單 Order(太普遍了,且order是SQL的關鍵字,容易帶來一些不便) OutBoundOrder
全域性變數 Global(這是形容詞) GlobalData,GlobalAppConfig等
匯流排請求類 BusRequest(這是動詞) BusRequester(請求者,湊合,但仍不太好) BusReqManager(這個名字明顯更好)

4,不要使用太普遍的名詞充當類名

 如Configuration,這個詞表示配置,你打算建立這麼一個類表示系統的配置資訊,並提供相應方法。但你要注意了,一個較大的系統裡通常有很多很多的配置,比如程式的全域性配置,入庫規則配置,出庫規則配置,外部介面訪問配置,日誌配置……如果你全都叫Configuration,你很可能三天兩頭被自己搞懵。那怎麼辦?寫具體點不就行了麼?
不好 好一點 說明
Configuration GlobalApplicationConfiguration InBoundConfiguration ExteralApiConfiguration LoggingConfiguration 起碼更具體了
Param (某個外部API的引數) GenericExternalApiParam 識別符號命名沒必要再從技術上描述它是什麼東西,正如你不需要寫完“int i=1”後加個註釋“定義整型變數i並賦值1”,要使得名字符合業務邏輯
當然,也有例外的情況,比如我的專案中通常有個類叫“Fmt”,非常簡單,其實就是Format的簡寫,這個類不涉及到具體的業務邏輯,只是用來對時間日期和數值進行一些格式化操作,所以可以起個這麼簡的名字。

5,適當的簡寫與約定俗成的縮寫

 上面起的名字你是不是覺得太長了?那可不可以縮寫一些?那是肯定的,程式碼中,我們存在著很多約定俗成的“單詞”,舉個最簡單的例子:ID,ID是Identity的簡寫,為什麼我們現在都知道?因為已經“約定俗成”了,這種例子還很多,我隨便舉一些:
原本 簡寫
participant ptcp
application app
description desc
abbreviation abbr
configuration config或cfg
Machintosh Mac
縮寫的規則通常是取前面幾個字母,但也有例外的,如前面提到的participant,如果縮寫為part的話,由於part是另外一個單詞,容易引起誤會,所以就取participant中的幾個與發音相關的子音字母來組成簡寫,所以configuration也可以簡寫為cfg,關鍵是要大家都認可。

6,約定俗成的縮寫

 英文中的縮寫實在太多了,如果沒有這些縮寫,用英語就簡直無法交流,我並不誇張,隨便寫幾個縮寫的例子:
英文縮寫 英文全稱 中文
NASA National Aeronautics and Space Administration 美國國家航空和宇宙航行局
BASIC Beginner's All-purpose Symbolic Instruction Code 初學者通用符號指令程式碼
EPROM Electrically Programmable Read-Only-Memory 電可程式設計序只讀儲存器
JSON JavaScript Object Notation JavaScript物件表示式
ASN Advanced Shipment Notice 預到貨通知單
DN Delivery Number 運單號
現在你有問題了:“你前面剛說拼音縮寫‘垃圾’,為什麼這裡又允許英文縮寫?”Good question,我這樣說吧:關鍵點在於約定俗成,大家認可,英文中的縮寫詞經常能自己成為一個單詞,如ROM,我們都直接念它“[rɔm]”,而不是“R-O-M”,大家都已經認可了“ROM”這個單詞了,這就可以了。文章一開始我也說了,所有這些,都是為了這個中心服務的:使得程式碼更有條理和可讀性!所以我提出的建議也只是建議,不是鐵律。 這麼說的話,我們是不是拼音縮寫在某些時候也能用一下?——沒錯,我們公司經常就用Shwgq來表示“上海外高橋”,一來“上海外高橋”是專有名詞,只能寫拼音,二來公司同事都已經認可了,於是就可以愉快地使用了,但我又要說回來,這個是個特例,千萬不要濫用。

7,駝峰命名法

 先問這麼一個問題:UserID好,還是UserId好? 也許你有你的看法,而我的看法很明確:UserId好,因為它很好地區分出了ID這個“單詞”,前面說了ID是Identity的簡寫,但認可的人多了之後,ID本身就成為了一個單詞,根據駝峰命名法的規則,單詞首字母大寫,其餘小寫,因此應當寫UserId,可能一開始感覺有點不習慣,但後面很快就能適應。 另外還有一個問題:UserName好,還是Username好? 按規則應該是Username,因為這本身就是一個單詞,但由於歷史原因,在我的專案裡面,一律寫成UserName,以前寫錯了,慣性太大,改不了,就當是User和Name兩個單詞拼成的吧——看吧,兵無常勢水無常形,要靈活應變。 另外還要注意一點,用駝峰命名法的時候,避免連續出現大寫字母,否則很影響程式碼可讀性。

8,適當使用字尾區分

 有時候實在不知道怎麼起名字,如登入,叫“Login”,這個也許表示客戶端向伺服器提交的登入請求,但也能表示伺服器處理好登入請求後返回給客戶端的資訊, 怎麼辦? 我的辦法是加上字尾作區分:
登入 登入請求 登入響應
Login LoginReq LoginResp
這樣就非常清晰了,Req即Request,Resp即Response,這種方法還能把Login這個動詞變作一個名詞,太好用了。 再比如,員工資訊,叫EmployeeInfo,它可以是來自客戶端的提交的資訊,根據系統的分成架構,這個Model需要從UI層傳遞到業務邏輯層,但這兩個層的EmployeeInfo類是有差別的,難道都要叫EmployeeInfo,只用名稱空間來區分嗎?我的“套路”一般如下:
員工資訊 UI層的員工資訊 業務邏輯層的員工資訊
EmployeeInfo EmployeeInfoUi EmployeeInfoBl 或 EmployeeInfo
UI層加上Ui字尾(根據前面提到的規則,i小寫),業務邏輯層可以加上Bl,也可以不加,因為UI層加了,就表示可以區分開來了。

9,用謂賓結構來命名方法

 方法表示某個執行動作,通常都是謂賓結構,為什麼把主語省掉了?因為主語100%是呼叫者,根本不用問。這是一些例子:
方法
報關單作廢 CancelDeclaration
檢驗是否存在 CheckIfExisting
出庫確認 ConfirmOrder
刪除核放單 DeleteGatebill
沒太多好說的,在動詞的選擇方面,有以下這些常用動詞:
動詞 英文
建立 Create
增加 Add(注意跟“建立”語義上的差異)
更新/編輯 Update/Edit
刪除/移除 Delete/Remove
清空 Clear/RemoveAll
獲取/設定 Get/Set
傳送/接受 Send/Receive
檢查是否XXX CheckIf
生成 Generate
計算 Calculate
上傳/下載 Upload/Download
萬能動詞 Do/Make
還有很多,我不列了,否則就真的變成上英語課了,英語和漢語一樣,同義詞很多,但語義上常常會有些微小的差異,比如建立和增加,建立一個新使用者,這是一個從無到有的過程,所以通常用Create,而將這個建立好的使用者加到開發部門中去,則是Add的概念,開發部門本來就存在的,只是多了一個人,大家去體會體會。我們在選動詞的時候通常會選比較符合英文文法的詞,而不能太過於“技術”,如選擇Create而不是SQL的Insert,因為Insert是個資料庫技術中的概念,而不是業務邏輯上的概念,再如選擇Send而不是Post,也是一樣道理,但這個並不絕對,假如你開發的是一個網路訪問的基礎庫,那麼你完全可以用Post啊,因為這個情形下,Post本身就更能描述業務邏輯。 實在不知道怎麼選動詞的話可以考慮下Do和Make這兩個萬能動詞,DoXxx,可以表示幹任何事情,而Make一樣很萬能,Trump大帝競選美國總統的時候口號不是“Make American Great Again”麼?使或讓的意思,放在很多場合都適用,再比如Make money,“賺錢”的意思。

10,複數與列表

 有次我複查程式碼,看到一個“訂單”中的“訂單明細”是這麼命名的:OrderLineCounts。莫名其妙,這根本不通啊。 用“Line”表示明細是我們公司的約定俗成,一個訂單主檔中帶若干訂單明細,我說用來表示這種明細列表通常有兩種方法,一種是用複數,另一種加個List字尾:
不通
OrderLineCounts OrderLines OrderLineList
這裡還要注意一下: 1,不是所有名詞都有複數形式,英語中有些詞不可數對不?所以加個List字尾可能更通用一些 2,不是所有可數名詞都可以直接加s變成複數形式,如Data,其複數形式應該是Datum,不要寫Datas 3,有些單詞單複數同形,如Goods,商品,複數也是Goods,不要寫作Goodses

最後

 講一個東西,叫“破窗效應”(Broken Window Theory),我是許多年前在《程式設計師修煉之道》這本書上看到的(這本書強烈推薦一下),這個道理很簡單,就是說如果你一開始對系統中出現的破敗視而不見的話,更多的破敗就會出現,直到事態不可挽回。你對程式碼的命名不認真,馬馬虎虎,導致同事看不懂,同事誤會了你的意思,跟著你亂命名,你再次接手這程式碼的時候,已經凌亂不堪,你感覺已經很難維護,於是更加得過且過,直到程式沒人再敢去碰。 “宇宙的熵在升高,有序度在降低,像平衡鵬那無邊無際的黑翅膀,向存在的一切壓下來,壓下來。可是低熵體不一樣,低熵體的熵還在降低,有序度還在上升,像漆黑海面上升起的磷火,這就是意義,最高層的意義,比樂趣的意義層次要高。”——《三體:死神永生》

相關推薦

程式碼名字

在公司裡,我有個不怎麼常用的綽號,叫“算命先生”——幫別人起名字的,準確說,幫別人的程式碼起名字,包括專案名,目錄名,類名,屬性名,方法名,變數名等。事實上,我也確確實實幫過別人起名字,起名字總歸有些套路,要避開一些坑,一個好的名字就是一個成功的開始,反之可能後面會帶來很多困擾。我跟同事說,好的名字讓你行走江

所有程式設計師_名字是成功的一半

時隔我做程式設計師兩年了,現在才意識到為檔案,為變數,為函式起個好名字的重要,我倍感慚愧,但又為現在意識到這點感到幸運。 1.沒意義的名字 例子: int a = 1; int b = 2; int c = a + b; System.out.prin

外貿B2C系列:如何自己英文名字

    對外貿B2C來說,在facebook、youtube或twitter上做營銷是必須的,那麼起個好聽英文名稱就至關重要。 1.如何取英文名字找一個與華文名字音相近的英文名字,例如名字裡有「萱」的人,就可以找sh開頭的名字,如Sharon、Shari、Shanna等。

如何為你的APP一個名字?

部分 關於 組成 不但 post 分析 分享 重要性 有一個  一個新APP誕生,想要未來有一個好的知名度,獲取大量用戶的話,名字是極為重要的事情之一,就像品牌名一樣,一個名字的好壞有時候在一些關鍵時刻就為成與敗埋下了種子。   APP有一個好名字的重要性,我想大家眾

數碼相機的充電器太麻煩了?你推薦

近年來,邁進攝影這道大 門 的朋友是越來越多了,不論是專業攝影還是當做一種興趣愛好,攝影都成了人們的最佳選擇。要想攝影出好的作品,單靠手機或者卡片機是遠遠不夠的,人們一般都會選擇數碼相機或者是單反相機,而單反相機常用的充電模式有時候不能滿足數碼或單反相機的使用,行動式電器則有效地解決了這一大問題,為

編碼之道:取名字很重要

程式碼就是程式設計師的孩子,給“孩子”取個好聽的名字很重要! 我們在專案開發中,接觸到的變數、函式、類多數都是專案自己定義的,往往都是為了解決一些特定的領域的問題,引入了各種各樣的概念,程式碼裡面的名字就對應著問題領域或方案領域的這些概念,所以,對於一個命名良好,程式碼規範,設計簡潔的系統,要想

軟體設計的哲學:第十四章 選名字

目錄 14.1例子:不好的名字會導致錯誤 14.2 創造一個形象 14.3 名字要準確 14.4保持一致性 14.5 不同的觀點:Go style guide 14.6 結論

如何目錄名字

windows xp系統下,有的軟體安裝後,會出現中文名稱目錄,或者帶空格名稱的目錄,不方便在指令碼/命令列中使用這些名稱, 又不能改變這個名稱,例如:gdriver安裝後,會在“文件”目錄下,出現"Google 雲端硬碟"這個目錄,這個目錄的名稱是不能更改的。 有一個方

微創新 你會APP名字

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

大家介紹兩用的C語言編輯器

注意到很多小夥伴經常反饋在學習C語言時該選擇什麼 C語言 編輯器好呢?都說慾善其事必先利其器,網路上也有很多不同型別的編輯器,讓人很難進行抉擇!C語言 編輯器選擇哪個好? 所以我今天根據我個人的使用情況,整理了幾款C語言編輯器分享給大家,需要的看官看下文了解一下喲~ (小編推薦一個學C語

[jdbctemplate+POSTGRESQL+儲存過程]jdbc呼叫儲存過程順便勘誤同時出幾的配合方式

前言 首先採用jdbc呼叫儲存過程是因為,整合mybatis的話,對於以儲存過程為主的系統沒有多大的幫助,反而多了一個分層。 本文將給出常見的儲存過程呼叫方式。 閱讀前可以先參考一下: 關於postgresql的多結果集,或者遊標返回儲存過程請檢視上篇文章: 【

可惡的室友發zip加密檔案我!還我會Python,種子還是要看

我叫室友發幾個種子給我看看!好不容易答應我了,然後發了一個加密檔案給我,這我就很煩了!只好用Python寫一個破解教程咯! 加群:960410445  即可獲取數十套PDF! import zipfile from threading import Thread de

用Python你的程式碼進度條吧 | 【程式碼也要面子的】

微信公眾號:AI演算法與影象處理如果你覺得對你有幫助,歡迎關注、轉發以及點贊哦~( ̄▽ ̄~)~ 前言 最近在跑一些程式碼的時候,很煩。。。因為有時候不知道這段程式什麼時候能執行完,現在執行哪裡了,如果報錯或者二進入死迴圈,那不是非常的浪費時間。因此,我在想到底該怎麼辦才能知道這些,就開始找,原來

新欄目,恬淡的名字

開個新專欄吧。 又回來了。 這裡,還是留有太多的記憶。 十年的人生有此干涉。 十年,未曾感知到一個時代的開始。 十年,淡然目送一個時代的終結。 已是卅歲,一半甲子,人生翻頁。 俱往矣。螢幕前,腦海中,

用Python你的程式碼進度條吧,程式碼也要面子的!

  最近在跑一些程式碼的時候,很煩。。。 因為有時候不知道這段程式什麼時候能執行完,現在執行哪裡了,如果報錯或者二進入死迴圈,那不是非常的浪費時間。   因此,我在想到底該怎麼辦才能知道這些,就開始找,原來可以直接加入一個——進度條,發現有些程式碼

css3 奇技淫巧 - 如何小汽車換背景色談

進階 真的是 poi cdp keyword 詳解 圖片轉換 select 工具 css3 的魅力,不容小覷。曾經被她折服,再度回首,依舊拜倒在她的石榴裙下。相信在未來,她仍然魅力依舊。 站在巨人的肩上學習,不斷提升自身實力。 用 CSS 和顏色選擇工具更改圖片中的顏

@Java Web 程式設計師,我們一起程式開後門吧:讓你在保留現場,服務不重啟的情況下,執行我們的除錯程式碼

一、前言  這篇算是類載入器的實戰第五篇,前面幾篇在這裡,後續會持續寫這方面的一些東西。   實戰分析Tomcat的類載入器結構(使用Eclipse MAT驗證) 還是Tomcat,關於類載入器的趣味實驗 了不得,我可能發現了Jar 包衝突的祕密 重寫類載入器,實現簡單的熱

@Spring Boot程式設計師,我們一起程式開後門吧:讓你在保留現場,服務不重啟的情況下,執行我們的除錯程式碼

# 前言 這篇其實是對一年前的一篇文章的補坑。 [@Java Web 程式設計師,我們一起給程式開個後門吧:讓你在保留現場,服務不重啟的情況下,執行我們的除錯程式碼](https://www.cnblogs.com/grey-wolf/p/11051427.html) 當時,就是在spring mvc應

程式碼有這16習慣,可以減少80%非業務的bug

前言 每一個好習慣都是一筆財富,本文整理了寫程式碼的16個好習慣,每個都很經典,養成這些習慣,可以規避多數非業務的bug!希望對大家有幫助哈,謝謝閱讀,加油哦~ github地址,感謝每顆star ❝ https://github.com/whx123/JavaHome ❞ 公眾號:「撿田螺的小男孩」 1.

[2017.06.08] 自己定下目標把

ring 設計 現在 需要 由於 oracl 自己 6.0 聯網 需要拼搏,感覺自己是那種屬於很懶散的性格的人。 在這個社會還是不能安於現狀。 現在給自己定下個目標,在期末之前盡力去做去完成這幾個目標。 由於目標是考研,所以在這個月之內, 英語要背單詞,看句子,做閱讀。 數