編程的時候 命名 方法或變數 詞窮了怎麼辦?


「計算機科學的兩件難事:緩存失效和命名。」

當然這裡的命名有著更深層的意思,比如W3C的各種術語。已經有很多教我們如何命名的規範 Naming convention (programming) ,每個編程語言都有各式各樣的命名規範【像CSS就有幾套非常有效的規範(OOCSS,BEM,SMACSS,SUITCSS,Atomic...)】但這些規範並不能消除我們的問題,每個程序員或多或少都在編程過程中為變數和函數命名苦惱過。

借用網路上的一個例子試著解釋一下:

你要開發一個遊戲,有人,可以開槍。人的對象有個走的行為,你把方法命名為Walk(),很簡單。槍的對象有個射擊的行為,你把方法命名為Fire(),還是很簡單。不過這兩個對象在畫布里需要動起來,你給他們命名為update()。當另一個人看到這個方法時他會有些疑問,這個update是更新什麼?要不要持久化到資料庫?https://www.quora.com/Why-is-naming-things-hard-in-computer-science-and-how-can-it-can-be-made-easier

這是ITworld發起的一個投票,其中不分年齡不分經驗接近半數的人認為命名是最頭疼的事情。

Programmers" hardest tasks : ProgrammerHumor

程序員最頭疼的事:命名

母語是英文的開發者為命名苦惱,非英文母語的開發者更加為此苦惱。當你到github上參與開源項目的貢獻的時候,或者準備開源自己的作品的時候,或者設計一個框架的時候,命名會是一個一直伴隨你的不大不小的問題。

但開發語言跟語言一樣除了語法外當然要堆辭彙了,有各種計算機術語大全的書,還有計算機專用詞典。但有趣的是開發語言也有很多「方言的辭彙」,甚至不同的編程語言還有自己的」方言辭彙「,要讓別人看懂你的代碼你還不得不用上這些方言常用的辭彙。如果不是有了解你根本不可能想起這些辭彙【好比說初始化就有很多方言(init,boot,launch...)】這就得堆經驗了,要多看堆經驗是很慢長的過程。

我們平時當然會先查單詞,再比較近義詞,必要還要Google一下與我們期望表達的關聯性。但是還是沒有底,還是不滿意,對,沒有底,不滿意。就一個變數名函數名隨著迭代的進行已經被我們改了多少次。有時候你巴不得身邊有個人直接告訴你。

堆經驗的方法是很笨的,沒有捷徑,多看書和源碼。參與的越多經驗自然就越多,找個大型的開源項目參與翻譯文檔是個不錯的開始,但如果你並不用到這個項目或者說這個項目與你當前從事的領域關聯不大,收效並不明顯。因為缺乏實踐。

如何不改變我們的平時的習慣就能日積月累的收穫變數命名的經驗呢?

回顧我們平時的習慣:1.查單詞;2. 比較單詞語義;3. 比較代碼上下文;4.確定命名。

只要把這幾個步驟縮短就能節省大量時間。CODELF 就是幫我們縮短這些步驟的一個變數名搜索工具。

Solidot | Codelf通過搜索在線開源平台的項目源碼幫開發者給變數命名

Codelf 搜索開源代碼幫程序員命名_Open Source 開源_cnBeta.COM

CODELF 支持直接搜索中文,當你查中文的時候,Codelf 會直接查好單詞和單詞的近義詞給你,然後再搜索Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Project上的開源項目的源碼匹配出與這些辭彙相關的變數名和函數名。Codelf 可以選擇開發語言進行搜索,結果會把同個源碼文件里匹配的變數名排在一起,如你選擇「CSS」然後搜索「product」

你可以立即查看對應的源碼,多少能學習到別人的設計,如果代碼的業務與自己相投,對梳理自己的業務是有幫助的。

我們求知慾的本能是看到什麼想到什麼就想立即了解它知道它,過後就不了了之了,每個開發者都有想看源碼學習的本能,可惜看源碼是一件非常燒腦的過程,Codelf 有讓碎片時間看看源碼變得輕鬆有趣,隨手掏出手機一搜索就可以打發時間了。如過聖誕節,選擇JavaScript語言搜索「聖誕樹」就看到一段短小的聖誕樹代碼,很有趣的演算法呢

CODELF

當然,你還可以直接查看源碼來源的倉庫Repo;直接拷貝變數名等。

Codelf會讓你的變數命名變得有趣,如果你是個有文學細胞的人,那會更加歡樂了,讓我們來搜索一些2015年的熱詞:

CODELF

CODELF

CODELF

CODELF

CODELF

下面是一些相關連接:

  • Codelf: CODELF

  • Codelf 的 github repo: unbug/codelf · GitHub

  • Two hard things: TwoHardThings

最後是一個找到的與Codelf相關的段子,哈哈:

場景1,話說,今天產品汪又來找我了,我昨天才切完圖,肯定是改需求

場景2,尼瑪,又要改好友列表,要在裡面添加關注狀態

場景3,關注,未關注,互相關注,前面兩個好命名,後面那個怎麼寫好呢?作為一個有點英文水平的程序員肯定不會用什麼Each-follow之類的,想想就不對勁,但是用什麼我還真特么不知道

場景4,看看微博怎麼搞的唄,我先找個互相關注的按鈕瞧瞧,一點進去就是女神的,可女神沒有關注我啊,怎麼辦

場景5,女神是交互MM啊,我就找個借口說測試一個渣浪,我X,我特么好2,這麼明顯誰不知道啊,但是我特么還是幹了啊,天啦擼啊

場景6,女神關注我了也,趕緊把之前發的一些不正經的微博刪除了,別在女神山前損形象啊,我去,我怎麼轉發了那麼多蒼老師的。。。太沒品了,尼瑪,sister是什麼鬼,我竟然寂寞到轉發韓國妹

場景7,好了,回來看微博的關注按鈕吧,可是我X,這是什麼鬼命名,我實在看不懂,難道壓縮了?

場景8,難倒我了,那我看看twitter的啊,必須啊,人家歪果仁肯定有好的命名

場景9,我得翻牆啊,不然上不去,GFW草泥馬啊。

場景10,花了10塊錢買了個mz代理總算上去了,可是我特么沒人關注我啊,有注意了,叫女神上去關注我唄,這樣之前的嫌疑就可以避開了,哈哈,機智如我

場景11,好說歹說女神上去了,又花了10塊幫女神買了個代理,本來想請女神吃飯的,怕太明顯了被看出來。

場景12,我叼,女神關注我了啊,女神裡面也是唯一一個我關注了她,好像荒島上就我倆個一樣,又YY了一把。

場景13,我了個X,Twitter並沒有互相關注的按鈕,人家直接顯示「followrs you」,我去,這太明了了,我們的產品汪真是沒法比啊

場景14,我把產品汪噴了一頓,結果人家還是沒有改,因為人家給我買罐可樂,我太沒種了,竟然就讓了

場景15,明天再想吧,命名是大事,就為了這個整天啥活也沒幹,下班都不好意思走啊。。。。

場景16,我想起來了,有個叫 Codelf 的變數命名神器,我去搜搜索。

場景17,直接搜索 「相互 follow」

神器就是神器啊!!!!此時一萬隻草泥馬打了我的臉


一般都是長名字,體會一下

b_times_delta_b_parallel_array

b_times_delta_b_parallel_filtered_array

nabla_dot_j_cross_delta_b

metric_tensor_contra_tmp

管他80列什麼的,自己寫爽了最重要。當然如果變數名支持latex就最吼了。


該拆分文件了,或者放入不同的包


太正常了啊,剛開始寫測試單元的時候經常發生這樣的事啊,比較常用的fuck, dick, cock, asshole用完之後往往就不知道用什麼了,後來我學會了在前後加人名,就感覺這不是什麼讓人頭疼的事情了,寫起來感覺超爽。


說說我是怎麼給項目起名字

每做一個項目 起名字也麻煩其實

每個項目 我都以一種喜歡的植物給它起個代號

比如代號枸杞medlar(枸杞)、代號calabash(葫蘆)、代號yam(山藥)。。。。

靈感來源於上家公司 每個資料庫以星座為名字(所以我幫別人開發一個汽車相關的項目時 資料庫均以汽車品牌為名字 buick(別克)庫存儲用戶信息 ferrari(法拉利)庫存儲訂單信息)。。。

有了代號 給文件、包之類起名字方便多了

代號不要太長就好。。。


加前綴啊,一個模塊給一個名,然後此模塊的變數全部加前綴。

這時候隨便拿一本非計算機類書,翻到最後index。

比如給每個模塊命名一個哲學家。(純粹理性批判的 index)


用拼音個人覺得很糟糕,首先中文的二意性不可忽視,最經典的二意性,我去,和我去(去字拉長音就不是一個意思了)。

所以用拼音不可取,尤其是拼音簡寫,在團隊開發中這麼做,別人調試你的程序肯定想(有種下班別走,當然這是玩笑←_←)。

程序的命名要盡量避免二意性,這樣可以提高可讀性,過長無法命名時分析其主要作用,用主要作用來命名,同時輔助完整注釋給排錯和修改提供便利。

另外當你發現一個函數命名過長其實這是這個函數實現太多功能導致,嘗試分函數來寫也是一種策略。


http://www.asens.cn,fastmodel,快速定義變數名,支持中文,值得擁有


………英文命名很少出現這種問題,況且還有包這種東西存在


當然是使用多個單片語成的變數/方法名了

比如說updateCanvas,updateData,updateCanvasData,updateDataCanvas之類的


學英語。


怎麼會出現詞窮?對於命名可以使用一些表述功能性的辭彙,如果還詞窮說明功能重疊。


查詞典。


詞窮了學英語……當然了也是分情況的,比如業務上特別專業的詞是要學英語,不能自己瞎編,否則同事們會很糾結的;另外很複雜又少用的那種名字就直接上中文吧。

我之前寫統計報表的時候就遇到過,類似於要表示 「橫軸表示時間縱軸表示數量以歸屬地分類的物品統計記錄的實體類」這種,你真來個

ItemSummaryTimeXQuantityYGroupByAreaEntity

還真心挺難讀懂的。


用武器名命名。

例如:On Error Goto MG42

發現錯誤拉出去機槍掃射……


一個Haskell程序

sum :: Num a =&> [a] -&> a

sum [] = 0

sum (x:xs) = x + sum xs


藍精靈命名法


我認為,每個善於命名的程序員,都是半個產品經理。

完美的命名是個系統工程,不是單詞會得多就搞得定。命名時你只是要定義一個變數,但背後其實要考慮到整個業務流程,以及整個程序包結構、類結構。

大部分程序同學的命名都是最開始的命名很像樣,越往後越往多就開始魔幻迷離,在一些臨時修改和補丁里甚至用上了haha,f***(極端情況,僅供一笑)。這種情況就是因為沒有系統化的考慮命名規則。即使使用一些命名方法,也並不能盡善盡美的解決問題,比如會出現命名越來越長,或可讀性越來越差的情況。這也不僅僅是英文和拼音的問題,用拼音做變數,只要有規範,可讀性好,那樣未嘗不可。只要你沒有看了拼音會抓狂的老外同事。

對於命名的改善,我的建議是:

  • 寫代碼前先對業務流程和需求了解清楚。
  • 盡量先在紙上畫幾遍代碼結構,寫寫偽代碼。我是喜歡紙筆。用UML還是mind manager看個人喜好。
  • 命名前考慮好命名規則的可擴展性。不是不能追加前後綴,這樣破壞可讀性和美觀性。
  • 有興趣多分析其它軟體的邏輯結構和業務結構

如果能養成以上習慣,恭喜你,你是程序員里最有產品sense的了


命名習慣:使用wow的職業作為前綴,對應裝備為類型名,技能為函數名


像這樣用漢字……

public static List線的表 = new List();

球的類 球= new 球的類();


推薦閱讀:

學過C,如何快速上手C++?
清華大學計算機系與普通大學計算機系的區別?
自學c#目的unity遊戲開發,基礎幾乎為零,沒學過數據結構和演算法。怎麼辦?
如何通俗易懂地解釋什麼是演算法?
清理內存是否能為計算機提速?

TAG:編程 | 計算機 | 計算機科學 | CC |