iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0
自我挑戰組

易讀程式之美學系列 第 3

富含資訊的名稱--避免通用性名稱

  • 分享至 

  • twitterImage
  •  

tmp、retval或是foo之類的名稱式「懶的想個適當名字」的藉口,應該要「選個能夠說明實體數值或目的的名稱」。
以JavaScript用了retval的函數為例:

var euclidean_norm = function(v){
    var retval = 0.0;
    for (var i = 0;i < v.length; i += 1)
        retval += v[i]*v[i];
    return Math.sqrt(retval);
};

已範例而言,變數是v陣列中數值的平方和,所以sum_squares會更加適當。
如果迴圈內部不小心寫成:

sum_squares += v[i]; //名稱裡的square怎麼不見了?有問題!

建議
retval這類名稱不含任何有意義的資訊,應該使用能說明變數值意義的名稱

然而,在有些情況下通用名稱的確有其意義,

String tmp = user.name();
tmp += " " + user.phone_number();
tmp += " " + user.email();
...
template.set("user_info",tmp);

建議
tmp這樣的名稱只適用於變數生命周期很短且作為暫存用途的變數。

迴圈循環子(iterator)

i、j、iter或是it是常用來作為迴圈索引或是循環子的名稱。

for (int i = 0;i < clubs.size(); i++)
   for (int j = 0;j < clubs[i].member.size(); j++)
      for (int k = 0;k < users.size(); k++)
         if(club[i].members[k] == user[j])
           count << "user[" << j << "] is in club[" << j << "]" << endl;

if 敘述中,members[]users[] 用錯誤的索引,在這種情況下,使用更清楚的名稱會更有幫助,可以使用 (ci,mi,ui) ,便可以清楚看出bug:

if(clubs[ci].member[ui] == user[mi]) #索引的第1個字元不符

正確使用後,便可以看到第1個字元與陣列第1個字元一致:

if(clubs[ci].member[mi] == user[ui]) #OK,第1個字元一致

總結

要有充份理由才使用tmp,it,或retval等通用性名稱。

Reference

  • <<易讀程式之美學-提升程式碼可讀性的簡單法則 >>(The Art of Readable Code)

上一篇
富含資訊的名稱--選擇辭彙
下一篇
富含資訊的名稱--優先使用具體名稱而非抽象名稱
系列文
易讀程式之美學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言