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這樣的名稱只適用於變數生命周期很短且作為暫存用途的變數。
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等通用性名稱。