国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
代碼質(zhì)量隨想錄(三):名字好,誤會少

  寫完前兩篇(、)之后,有點小倦怠,因為一方面要整理讀書筆記,一方面還要結(jié)合自己的思路加以重新表述,頗費周張。不過前兩日看到有小朋友過來贊我的文章,說對實際代碼有所幫助,還是滿欣慰的,本系列隨想錄的目的之一,就是要營造一個努力改良代碼質(zhì)量的思維環(huán)境。

  要想讓標識符的名稱更易理解,就應(yīng)該多考慮考慮此名稱是否會被誤讀。

  先看兩個很容易誤讀的例子。

Object[] results = Database.getAllObjects().filter("year <= 2011");

  到底是要選出year小于等于2011的那部分對象,還是選出year大于2011的那部分呢?filter到底是排除(exclude),還是遴選(select)呢?我自己在日常編碼中也愛用filter,多半由于習(xí)慣。現(xiàn)在自己思量,是得改正了。
再看

public String clip(String text,int length); //裁掉文本的末尾

  clip方法有歧義:到底是去掉文本后的length個字符,還是從頭開始截取最大length個字符呢?比如clip(“Java”,2);到底是”va”還是”Ja”?如果是前者應(yīng)該叫removeLast,如果是后者則應(yīng)叫truncate。而且length也有毛病,到底以什么為單位?字節(jié)?字符?還是詞語?如果是字符,應(yīng)該是truncate(String text,int maxCharCount)。

  歸納起來說,以下幾種情形應(yīng)格外注重選取避免誤解的名稱。

  1. 以常量表示包含端點的上限或下限時,應(yīng)分別用MAX與MIN做前綴

  例如CART_TOO_BIT_LIMIT=10到底是說購物車中最多放10件商品還是11件?抑或是9件?改為MAX_ITEMS_IN_CART = 10則很清楚:最多10件。

  2. 在表達包含左右端點的區(qū)間時,應(yīng)用first及l(fā)ast

public void printIntegerInRange(int start,int stop){...}...printIntegerInRange(2,6);

  到底打印[2,3,4,5]還是[2,3,4,5,6]?如果是后者,應(yīng)該是printIntegerInRange(int first,int last)。

  3. 在表達包含左端點而不含右端點的區(qū)間時,應(yīng)當(dāng)使用begin與end

  英文中沒有哪個常用詞的字面意思能表示“區(qū)段內(nèi)最后一個值的緊下一個值”這個意思,所以使用end只是約定成俗而已,并不精確。例如public void printEventsInRange(String begin,String end),可以使用如下參數(shù)來調(diào)用:printEventsInRange(“OCT 16 00:00″, “OCT 17 00:00″),這樣的話,一般人都能理解右端點(”O(jiān)CT 17 00:00″)不含在范圍內(nèi)。如果用public void printEventsInRange(String first,String last),則是printEventsInRange(“OCT 16 00:00″, “OCT 16 23:59″)。

  4. 使用判斷詞來消除boolean變量的歧義。

  為boolean變量起名時一定注意是否有歧義:

bool readPassword = true;

  到底是當(dāng)前需要讀取密碼,還是密碼已經(jīng)被讀取過了?前者應(yīng)是needPassword,后者應(yīng)是userIsAuthenticated。

  使用is、has、can、should等詞匯來讓boolean變量與方法的意圖更加清晰,尤其是在那些不需要申明方法或函數(shù)返回類型的編程語言中。例如:spaceLeft()到底是返回剩下的空間大小,還是返回是否有剩余空間?根據(jù)是簡單獲取還是復(fù)雜計算,前者應(yīng)命名為getLeftSpaceInPixel()或calcLeftSpacePx(),分別指示輕量級(get)和重量級(calculate或compute)的兩種獲取辦法;而后者則應(yīng)是hasSpaceLeft(),只說有沒有剩余空間,不談具體的量。

  5. 避免在boolean命名中使用否定形式。

  例如:

bool disableSSL = false;

  不如下面這種命名方式清晰:

bool useSSL = true;

  6. 不要同約定成俗的命名方式相違逆。

  例如getXXX()格式的方法一般有兩個隱含意義:1. 該操作為輕量級。2. 該操作返回所在類的某個成員。

  如下統(tǒng)計算數(shù)平均數(shù)的方法名稱即為不宜:

public class SampleCollector {  public void add(double sample) { ... }  public double getMean() {    ... // 疊加所有采樣值并返回“總和/樣本數(shù)”  }  ...}

  getMean()并非輕量級操作,且不返回本類某個成員。不如叫它computeMean()更好,compute會引人聯(lián)想該操作是不是稍為復(fù)雜一些,耗時一些。如果非要用getMean做名稱的話,那么mean應(yīng)被納入緩存機制。例如:

private boolean meanCached;//計算完樣本后置為true,樣本改動時置為false...public double getMean() {  if(!meanCached){    ... // 疊加所有采樣值    mean=sampleSum/sampleCount;    meanCached=true;  }  return mean;}
void ShrinkList(list<Node>& list, int max_size) {  while (list.size() > max_size) {    FreeNode(list.back());    list.pop_back();  }}

  size()操作的時間復(fù)雜度為O(1)應(yīng)是大多數(shù)人的共識,可是恰恰list的size()是時間復(fù)雜度為O(n)的操作,這導(dǎo)致整個函數(shù)的復(fù)雜度變?yōu)镺(n^2)。按理說size()應(yīng)該叫為countSize() 或countElements(),以體現(xiàn)其重量級運算的特質(zhì)來,不過,為了和其余容器類相符合,還是叫成size了。所幸新版C++規(guī)范強制要求size操作的時間復(fù)雜度為O(1)了(ARC書的作者這么說的,我未查證。大家?guī)兔υ贑++11規(guī)范中查證此事。原有規(guī)范只是“建議”它應(yīng)具有常數(shù)時間復(fù)雜度,并未強制)。

  小翔以為,如果某個抽象接口定義了一個貌似輕量級的簡單操作,如Collection的size(),則子類對象在實現(xiàn)時應(yīng)該盡量降低時間復(fù)雜度。實在不能時甚至可以考慮拋出異?;?qū)蛻籼岢鼍妗8镜慕鉀Q辦法還是學(xué)習(xí)C++規(guī)范那樣,給出一個建議的時間復(fù)雜度來。

  7. 在多個候選名稱中取舍時應(yīng)該仔細質(zhì)詢其可能帶來的歧義

  例如有兩份相似的服務(wù)器配置參數(shù)文件:

config_id: 100description: "increase font size to 14pt"traffic_fraction: 5%...
config_id: 101description: "increase font size to 13pt"[其余參數(shù)與前一份相同]

  我們現(xiàn)在想通過某個機制復(fù)用整套參數(shù),例如這樣:

config_id: 101想要復(fù)用的配置文件id: 100[其余參數(shù)與前一份相同]

  那么,這個“想要復(fù)用的配置文件id”,應(yīng)該怎么起名呢?備選關(guān)鍵詞有:template、reuse、copy和inherit。

  template很模糊:“template: 100”到底是說自己是一份名叫“100”模板,還是說使用一個名叫“100”的模板作為其基礎(chǔ)參數(shù)?況且模板這個概念太過抽象,給人感覺需要以具體內(nèi)容填充它。

  “reuse: 100”到底是說這份參數(shù)最多可以使用100次,還是說復(fù)用名為“100”的那份配置文件中的參數(shù)?

  “copy: 100”是第100份拷貝嗎?還是說拷貝自編號為“100”的那套配置?后者不如叫copy_config_from更好。

  “inherit: 100”,inherit這個詞,大多數(shù)程序員很熟悉,且與日常生活的“財產(chǎn)繼承”概念可相比擬,所以引起的誤解相對較少??梢詳U充為inherit_config_from來更精確地闡明這個意思。

  綜上,copy_config_from或inherit_config_from應(yīng)為最終中選名稱。

  總之,好的標識符名稱可以盡量消除代碼閱讀者的誤解,提高代碼可讀性與可維護性,亦能促進業(yè)務(wù)交流。所以應(yīng)當(dāng)仔細考究,盡量選取免于誤會的名稱,尤其是遇到“filter、length和limit”這些模棱兩可的詞語時。此外,區(qū)間與上下限含不含端點、boolean類型的標識符會不會引起誤解、方法名稱所隱含的意義是否符合常識,這些問題也應(yīng)該在起名時反覆考量。

  用了兩篇文章才講完給標識符起名的事情,可見其的確關(guān)乎代碼質(zhì)量的提升。下一篇我們談?wù)劥a的排版問題。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
如何給變量取個簡短且無歧義的名字
C語言中的宏定義
跟煙花入門VBA之87集:Application對象(五)
ZigBee四種綁定方式在TI Z-Stack協(xié)議棧中應(yīng)用
RESTful API 設(shè)計最佳實踐
VoLTE呼叫中S1切換準備與響應(yīng)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服