变量的草率运用会让代码更难理解
1. 减少变量
1)没有价值的临时变量
1 now = datetime.datetime.now() 2 root_message.last_view_time = now 3 4 #上面的 now 没有拆分复杂的表达式;没有更多的澄清;只用了一次。因此是冗余的。 5 root_message.last_view_time = datetime.datetime.now()
2)减少中间结果
1 var remove_one = function (array, value_to_remove) { 2 var index_to_remove = null; 3 for (var i = 0; i < array.length; i += 1) { 4 if (array[i] === value_to_remove) { 5 index_to_remove = i; 6 break; 7 } 8 } 9 if (index_to_remove !== null) { 10 array.splice(index_to_remove, 1); 11 } 12 }; 13 14 //速战速决,移除index_to_remove 15 var remove_one = function (array, value_to_remove) { 16 for (var i = 0; i < array.length; i += 1) { 17 if (array[i] === value_to_remove) { 18 array.splice(i, 1); 19 return; 20 } 21 } 22 };
3)减少控制流变量
微软的Eric Brechner曾说过,一个好的面试问题起码要涉及三个变量,这会强迫你努力思考。
你希望你的同事在读你的代码时感觉就像你在面试他们吗?
1 boolean done = false; 2 while (/* condition 1 */ && !done) { 3 if (/* condition 2 */) { 4 done = true; 5 continue; 6 } 7 } 8 9 // 上面的done成为控制流变量,唯一的作用就是控制程序执行 10 // 通常来说,可以通过更好的运用结构化编程来消除 11 while (/* condition */) { 12 if (/* condition 2 */) { 13 break; 14 } 15 }
2. 缩小变量作用域
让你的变量对尽量少的代码行“可见”。这样可以有效减少读者同时需要考虑的变量个数。
1)尽量使方法变成静态的,这相当于缩小函数的作用域
2)把大类拆分成小类。这只有在这些小类相互独立时才有很好的效果。如果小类之间的成员还是需要相互访问,那什么目的也没达到。
3)把大文件拆分成小文件,或者把大函数拆分成小函数也是同样的道理,即数据分离,缩小变量作用域。
class LargeClass { string str_; void Method1() { str_ = ...; Method2(); } void Method2() { // Uses str_ } // Lots of other methods that don't use str_ ... }; // 把str_“降格”为局部变量,更便于跟踪 class LargeClass { void Method1() { string str = ...; Method2(str); } void Method2(string str) { // Uses str } // Now other methods can't see str. };
3. C++中if 语句的作用域
1 PaymentInfo* info = database.ReadPaymentInfo(); 2 if (info) { 3 cout << "User paid: " << info->amount() << endl; 4 } 5 // Many more lines of code below ... 6 7 // 如果info只在if中用到,实际上可以定义如下,if语句块之后,读者就不用记着info这个变量了 8 if (PaymentInfo* info = database.ReadPaymentInfo()) { 9 cout << "User paid: " << info->amount() << endl; 10 }
4. 把定义向下移
原来的C语言要求所有的变量放在语句块顶端,这强迫读者思考这些变量,即使要到很久之后才会用到它们。
C99和C++去掉了这个要求。
5. 只写一次的变量更好
“永久固定”的变量更容易思考,例如const修饰的常量。