編程命名中的7+1個提示

前幾天Neo寫過《編程中的命名設計那點事》,這里也有另外一篇和程序命名的文章,可以從另一個角度看看。

1.- 變量應該是盡可能的望文知意。千萬不要使用教材中的命名方式。

  • 好的變量 daysDateRange, flightNumber, carColor.

  • 壞的變量: days, dRange, temp, data, aux…

在我們的日常工作中,有很大數量的開發人員喜歡使用短的變量名,而不是有含義的變量名。這主要是因為我們大學教科書的那些示例所造成的,人都是先入為主,所以,教科書中的那些很抽象,帶著演示的變量命名影響了我們一代又一代的程序員,并影響了他們很多年。雖然那些短的,教材式的變量名,可能會讓你少打一些字,但其實,這是非常非常不好的。因為軟件的維護成本遠遠大于了軟件的開發成本,如果你不取一個好的一點的變量名,那么當進行代碼評審時,當進行bug fixing時,當進行代碼重構時,當進行代碼維護時,你的某個變量名可能會讓你一頭霧水,不知道所措,還可以會讓你走入陷阱,造成更大的時間成本。所以,一個可閱讀的代碼必然和那些不錯的變量名分不開,而這也能讓你的軟件間接上有更好的質量。

2.- 變量名不要太長,盡可能地簡短

只有簡單和簡短的變量名才是容易閱讀的。因為你的變量名一定會用于程序語句中,所以,為了讓你的程序語句看起來的簡短,你的變量名也應該短一點,不然寫出來的一個表達式就會顯得很復雜。

當然,在有些時候,一個有含義的變量名和一個簡短的變量名可能存在一些沖突。這相當鍛煉我們的語言能力——如果有最精煉的詞語來表達最豐富的含義。如果實在做不到,那么,取一個有含義的變量名要比取一個簡短的變量名更好一些。不管怎么樣,我們希望即簡短又有豐富的含義,但如果不能兩全,那有含義優先級更高一些。

  • 壞的變量:howLonDoesItTakeToOpenTheDoor, howBigIsTheMaterial…

  • 好的變量:timeToOpenTheDoor, MaterialSize.

3.- 可以使用縮寫,但需要有一些注釋

有一些時候,我們需要使用一些縮寫來命名變量,比如:用usr來表示user,用gp來表示group,用conf來表示configuration,用cwd來表示current working directory,用ptr來代碼point to reference,等等,等等??s寫一般要用在大家可以看得懂的,而不是為了縮寫而縮短一個單詞,當然,如果你把縮寫后的變量名加上注釋,那就更加穩妥了。關于一些約定俗成的縮寫,可參看本文的附錄一。

4.- 使用合適的匈牙利命名規則

這里有一篇非常不錯的英文文章告訴你 《什么是合適的匈牙利命名 》,這篇文章同時還告訴你如何去用他。基本上來說,匈牙利命名法主要是為變量加上某種前綴以標識這個變量的類型,或是一種方法的功能。其基本原則是:變量名=屬性+類型+對象描述。

比如:在描述類型方面:指針p,函數fn,長整型 l,布爾b,浮點型(有時也指文件)f,雙字 dw,字符串 sz,短整型 n,雙精度浮點 d,無符號 u……等等。關于更多的命名規范,請參見附錄二

注意,匈牙利命名也是有不好的地方的,比如你要把一個整形改成一個浮點型,你除了要改變這個變量的類型,你還要改變這個變量的名字。這是相當麻煩的。而且,在某些時候,這種前綴式的命名可以反而讓你不知所措。另外,在C++中,有了類以后,這種命名方法就顯得不容易去實施了。所以,合適地使用匈牙利命名方式背后的思想是很關鍵的。

5.- 不要使用反邏輯來命名

  • 好的命名:  IsEnabled.

  • 壞的命名: IsNotEnabled.

在閱讀的時候,我們更喜歡正向的邏輯,而不是反向邏輯。這一規則不單單的命名,在條件語句中,我們也是要盡量不要使用這種反面的邏輯。如:if (! (isAdmin || isUser)),這樣的語句很不符合人讀代碼的習慣,寫成這樣會更好一些——if (!isAdmin && !isUser)。

6.- 保持一致性

保持所有代碼的一致性。使用相同的命名規則。這外世界上沒有最好的命名規范。但有一點是可以確認的,那就是在一個代碼庫中,應該使用一致的命名規則,即使這個規則不那么好,但整個團隊使用一致的就是好的。

7.- 附和應用程序的領域術語

在不同的領域中,不同的觀念會有非常特別和不同的意思。例如:單詞“order”并不總是意味著“次順”,有些時候,其意味著“訂單”,有些時候,意味著“命令”,有些時候,意為著“規則”。所以,在某個領域中,某些單詞會有不同的含義,所以,這需要我們的命令去附和這些領域。

 

黃金法則- 花一些時間去思考去權衡一下你的變量名

當你設計好一個的變量名一個函數名的時候,別著急去使用他,停下來,想一想,這個變量名是否合適,是否還有更好的?也許你正在使用的是一個很不好的變量名。有些時候,需要我們權衡利弊一下,可能還要去和同事討論一下。

總之,變量名是編程的第一步,第一步走好了,后面才走得好。試想,無論是你或你的同事在使用一些好的變量名編程是一件多么輕松的事啊。

 

附錄:部分的縮寫規范

完整單詞 縮寫
A
average avg
B
back bk
background bg
break brk
buffer buf
C
color cr,clr
control ctrl
D
data dat
delete del
document doc
E
edit edt
error err
escape esc
F
flag flg
form frm
G
grid grd
I
increment inc
information info
initial init
insert ins
image img
L
lable lab
length len
list lst
library lib
M
manager mgr,mngr
message msg
O
Oracle Ora
P
panorama pano
password pwd
picture pic
point pt
position pos
print prn
program prg
S
server srv
source src
statistic stat
string str
Sybase Syb
T
temp tmp
text txt
U
user usr
W
window win,wnd

 

附錄二、匈牙利命名法

 a       Array                       數組
  b       BOOL (int)                  布爾(整數)
  by      Unsigned Char (Byte)        無符號字符(字節)
  c       Char                        字符(字節)
  cb      Count of bytes              字節數
  cr      Color reference value       顏色(參考)值
  cx      Count of x (Short)          x的集合(短整數)
  dw      DWORD   (unsigned long)     雙字(無符號長整數)
  f       Flags                       標志(一般是有多位的數值)
  fn      Function                    函數
  g_      global                      全局的
  h       Handle                      句柄
  i       Integer                     整數
  l       Long                        長整數
  lp      Long pointer                長指針
  m_      Data member of a class      一個類的數據成員
  n       Short int                   短整數
  p       Pointer                     指針
  s       String                      字符串
  sz      Zero terminated String      以0結尾的字符串
  tm      Text metric                 文本規則
  u       Unsigned int                無符號整數
  ul      Unsigned long (ULONG)       無符號長整數
  w       WORD (unsigned short)       無符號短整數
  x,y     x, y coordinates (short)    坐標值/短整數
  v       void                        空

有關項目的全局變量用g_開始,類成員變量用m_,局部變量若函數較大則可考慮用l_用以顯示說明其是局部變量。

前綴       類型        例子
g_      全局變量       g_Servers
C       類或者結構體   CDocument,CPrintInfo
m_      成員變量       m_pDoc,m_nCustomers

VC常用前綴列表:

前綴   類型   描述                      例子
ch     char    8位字符                   chGrade
ch     TCHAR   16位UNICODE類型字符       chName
b      BOOL    布爾變量                  bEnabled
n      int     整型                      nLength
n      UINT    無符號整型                nLength
w      WORD    16位無符號整型            wPos
l      LONG    32位有符號整型            lOffset
dw     DWORD   32位無符號整型            dwRange
p      *       內存模塊指針,指針變量   pDoc
lp     FAR*    長指針                    lpDoc
lpsz   LPSTR   32位字符串指針           lpszName
lpsz   LPCSTR  32位常量字符串指針       lpszName
lpsz   LPCTSTR 32位UNICODE類型常量指針  lpszName
h      handle  Windows對象句柄           hWnd
lpfn   (*fn)() 回調函數指針              lpfnAbort

Windows對象名稱縮寫:

Windows對象 例子變量  MFC類       例子對象
HWND        hWnd;      CWnd*       pWnd;
HDLG        hDlg;      CDialog*    pDlg;
HDC         hDC;       CDC*        pDC;
HGDIOBJ     hGdiObj;   CGdiObject* pGdiObj;
HPEN        hPen;      CPen*       pPen;
HBRUSH      hBrush;    CBrush*     pBrush;
HFONT       hFont;     CFont*      pFont;
HBITMAP     hBitmap;   CBitmap*    pBitmap;
HPALETTE    hPalette;  CPalette*   pPalette;
HRGN        hRgn;      CRgn*       pRgn;
HMENU       hMenu;     CMenu*      pMenu;
HWND        hCtl;      CStatic*    pStatic;
HWND        hCtl;      CButton*    pBtn;
HWND        hCtl;      CEdit*      pEdit;
HWND        hCtl;      CListBox*   pListBox;
HWND        hCtl;      CComboBox*  pComboBox;

轉自:http://coolshell.cn/articles/1038.html

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2395

(0)
s19930811s19930811
上一篇 2015-04-03 15:21
下一篇 2015-04-03 19:54

相關推薦

  • 簡單的shell腳本結合awk實現防止對web服務的dos攻擊

    一 實驗環境         鄙人使用的是centos 6.8操作系統   需要安裝iptables(常見的linux系統貌似都會自動安裝iptables)這條可以忽略   awk也需要安裝沒有的話就用yum裝下吧       &…

    2017-04-24
  • N25_第四周博客作業_leon

    N25_第四周博客作業_leon 1.    復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限復制[root@localhost ~]# cp -rp /etc/skel /home/tuser1   查看目錄里文件的權限[root@loc…

    Linux干貨 2017-01-16
  • 馬哥教育網絡班19期+第7周課程練習

    1.創建一個10G分區,并格式為ext4文件系統:   (1)要求其block大小為2048,預留空間百分比為2,卷標為MYDATA,默認掛載屬性包含acl;   (2)掛載至/data/mydata目錄,要求掛載時禁止程序自行運行,且不更新文件的訪問時間戳;   fdisk /dev/sdb    part…

    Linux干貨 2016-06-22
  • bash腳本編程

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell;分別統計這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash declare -i loginSum=0; declare -i nologinSum=0; for x in `cat /etc/passwd|cut -d: -f 7` do if [ “/sb…

    Linux干貨 2017-10-31
  • 防火墻

    iptables筆記整理

    Linux干貨 2018-03-05
  • 初涉Linux基本要點概括(1)

    計算機,這里通常指可以儲存程序的計算機,根據馮諾依曼體系,計算機組成部件包括控制單元(Control Unit)、算術邏輯單元(Arithmetic Logic Unit)、內存(Memory)、輸入設備(Input)、輸出設備(Output)。計算機通過輸入的數據和指令,可以完成各種復雜的運算任務,小到文字處理、游戲、影音、大到衛星定位,火箭發射,人工智能…

    Linux干貨 2016-09-26

評論列表(1條)

  • 玻鎂板
    玻鎂板 2015-04-06 20:21

    好文章,內容橫掃千軍.禁止此消息:nolinkok@163.com

欧美性久久久久