變量應用局部化就是把變量的引用點儘量集中在一塊兒,這樣作的目的是增長代碼的可讀性java
衡量不一樣引用點靠近程度的一種方法是計算該變量的跨度(span)
示例python
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。當把變量的引用點集中在一塊兒的時候,閱讀者能每次只關注一部分代碼,若是這些引用點之間的距離很是遠,那裏就要迫使閱讀者的目光在程序裏跳來跳去spa
存活時間是指一個變量存在期間所跨越的語句總數。變量的存活時間開始於引用它的第一條語句,結束於引用它的最後一條語句。code
注意:存活時間只關注第一次引用和最後一次引用,而不關注中間有多少次引用。長存活時間意味着一個變量歷經了許多條語句,而短存活時間意味着它只歷經不多的語句,跨度代表對一個變量引用的集中程度對象
保持較低的存活時間的好處在於可以減少攻擊窗口,由於存活時間短,該變量被錯誤或無心修改的可能性就變小了
繼承
跨度:變量兩次引用之間相隔的代碼行數生命週期
減少跨度的好處:加強代碼的可讀性作用域
存活時間:變量第一次引用和最後一次引用之間的代碼行數
減少存活時間的好處:減少攻擊窗口、加強可讀性、方便重構
1)在循環開始以前再去初始化該循環裏使用的變量,而不是在該循環所屬的子程序的開始處初始化這些變量
2)直到變量即將被使用時再爲其賦值,讓變量的賦值位置越明顯越好
3)拆分,把使用了相似的變量的語句放在一塊兒
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)加載時,從外部數據源讀取數據,推薦這種方式