《编写可读代码的艺术》第9章 变量可读性

    变量的草率运用会让代码更难理解

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修饰的常量。

原文地址:https://www.cnblogs.com/yyqng/p/14231503.html