1. 程式人生 > ><<程式碼大全>>閱讀筆記之一 使用變數的一般事項

<<程式碼大全>>閱讀筆記之一 使用變數的一般事項

一、使用變數的一般事項

1.把變數引用區域性化

變數應用區域性化就是把變數的引用點儘可能集中在一起,這樣做的目的是增加程式碼的可讀性

衡量不同引用點靠近程度的一種方法是計算該變數的跨度(span)


示例

a = 0
b = 0
c = 0
a = b + c



a的第一次引用和第二次引用之間存在兩行程式碼,因此變數的跨度是2,b的第一次引用和第二次引用之間存在一行程式碼,因此跨度是1。

平均跨度可以通過計算各個跨度的平均值得到。來看一個示例

a = 0
b = 0
c = 0
b = a + 1
b = b / c



b的第一次引用和第二次引用的跨度為1,第二次引用和第三次引用的跨度為0,因此平均跨度為(1 + 0) / 2 = 0.5。當把變數的引用點集中在一起的時候,閱讀者能每次只關注一部分程式碼,如果這些引用點之間的距離非常遠,那裡就要迫使閱讀者的目光在程式裡跳來跳去


2.儘可能縮短變數的存活時間

存活時間是指一個變數存在期間所跨越的語句總數。變數的存活時間開始於引用它的第一條語句,結束於引用它的最後一條語句。

注意:存活時間只關注第一次引用和最後一次引用,而不關注中間有多少次引用。長存活時間意味著一個變數歷經了許多條語句,而短存活時間意味著它只歷經很少的語句,跨度表明對一個變數引用的集中程度

保持較低的存活時間的好處在於能夠減小攻擊視窗,因為存活時間短,該變數被錯誤或無意修改的可能性就變小了

小結

跨度:變數兩次引用之間相隔的程式碼行數

減小跨度的好處:增強程式碼的可讀性

存活時間:變數第一次引用和最後一次引用之間的程式碼行數

減小存活時間的好處:減小攻擊視窗、增強可讀性、方便重構


3.減小作用域的一般原則

1)在迴圈開始之前再去初始化該迴圈裡使用的變數,而不是在該迴圈所屬的子程式的開始處初始化這些變數

2)直到變數即將被使用時再為其賦值,讓變數的賦值位置越明顯越好

3)拆分,把使用了類似的變數的語句放在一起

4)開始時使作用域儘可能小,之後有需要時再擴充


4.繫結時間

變數和它的值繫結在一起的時間稱為繫結時間。這一繫結是在編寫程式碼的時候還是編譯程式的時候,是在程式載入的時候還是執行的時候?

採用越晚的繫結時間越有利,繫結時間定義的越晚,程式碼就包含越多的靈活性。下面來看幾個例子



1)在編寫程式碼的時候繫結值

java示例

titleBar.color = 0xFF;  //0xFF is hex value of color blue

這是典型的硬編碼,這種硬編碼技術通常是很糟糕的,因為一旦要修改這個值,那麼這個新值就無法同程式碼中其他引用的地方保持一致了。要杜絕這種使用方式。



2)在編譯時繫結值

java示例

private static final int COLOR_BLUE = 0xFF;
private static final int TITLE_BAR_COLOR = CLOR_BLUE;
...
titleBar.color = TITLE_BAR_COLOR

TITLE_BAR_COLOR是一個具名常量,編譯器會在編譯的時候把它替換為一個數值,這種方式有兩個好處:

a. 易於修改,一處修改就能對所有位置生效

b. 可讀性更強

補充:

private是java的關鍵字,可以用來修飾成員變數和成員方法,被其修飾的成員只能在本類中訪問

static也是關鍵字,用static宣告的成員變數為靜態成員變數,也稱為類變數,類變數的生命週期和類相同,在整個應用程式執行期間都有效。

final也是關鍵字,可以用來修飾引用、方法和類。如果引用為基本資料型別,則該引用為常量,該值無法修改;如果引用為引用資料型別,如物件、陣列,則該物件陣列本身可以修改,但指向該物件或陣列的地址的引用不能修改

final修飾方法時,被修飾的方法將稱為最終方法,無法被子類重寫,但是,該方法仍然可以被繼承

final修飾類時,該類成為最終類,無法被繼承,簡稱為斷子絕孫類。


對於Python這類解釋型語言,可以這樣繫結

COLOR_BLUE = 0xFF   # 這裡可以直接寫在程式碼裡或者寫在配置檔案裡
titleBar.color = TITLE_BAR_COLOR



3)在執行時繫結值

java示例

titleBar.color = ReadTitleBarColor();

使用一個子程式在程式執行期間讀入數值的子程式,數值來源可能登錄檔或者配置檔案


小結

繫結時間的有以下幾種

1)編碼時,也就是硬編碼,應杜絕這種情況

2)編譯時,使用具名常量,推薦這種方式

3)載入時,從外部資料來源讀取資料,推薦這種方