麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

診斷 Java 代碼:設計輕松的代碼維護

2019-11-18 13:34:57
字體:
來源:轉載
供稿:網友

  本月,Eric Allen 解釋了在使代碼更易于維護的同時,避免和控制無理由的變化怎么會是保持代碼健壯性的要害。他集中討論了諸如函數樣式代碼編寫之類的概念,以及標記字段、方法和類的方法來處理并防止可變性。Eric 還解釋了本任務中單元測試和重構的角色,并提供了協助實現重構的兩個工具。在相關論壇中與作者和其他讀者分享您對本文的看法。(您也可以單擊本文頂部或底部的“討論”,訪問該論壇。)
有效調試源自良好的編程。設計易于維護的程序是程序員面臨的最困難挑戰之一,其部分原因在于程序通常并不是由那些編寫代碼的程序員維護的。為了有效維護這樣的程序,新程序員必須能夠快速了解程序的工作原理,假如程序員能夠單獨理解整個程序中各個小部分,那么就可以輕易地了解程序的工作原理。

通過討論可變性、可譯碼性、私有方法、最終方法、最終類、本地代碼、單元測試以及重構問題,我們將簡述編寫程序的一些方法,以幫助使程序更易理解和維護。

可變性和可譯碼性
首先討論可變性問題。假如在一個程序的計算期間,其每一部分所處理的數據都沒有被該程序的其它、遠程部分更改,那么就很輕易單獨理解該程序的各個部分。

太多信息
例如,請考慮一個使用容器類實例的程序,可以修改其中的成分鏈接。每次將容器從程序某一部分上的方法傳遞到該程序其它部分的方法,以及每次調用 new 表達式(其中容器被作為參數傳遞)時,容器就可能脫離調用方法的控制發生改變。

在我們首先理解調用方法調用的每個方法如何修改容器之前,我們不能真正確保我們理解了調用方法,由此我們診斷錯誤的能力也就更差。假如這些被調用的每個方法都依次調用其它修改方法,那么維護程序員為了理解單個方法必須閱讀的代碼總量會迅速增加,多得無法控制。

由于這個原因,對可變容器和不可變容器使用不同類會非常有利。在不可變版本中,容器的字段可以標記成 final。

求助于函數樣式
相對于修改舊數據,為構造新數據而進行代碼編寫稱為函數樣式,因為程序的方法與數學函數相似,其行為是根據每個輸入所返回的輸出來單獨描述的。

函數樣式經常被忽略的優點是相當輕易單獨理解程序的個別組件。假如方法所操縱的數據決不會被其主體中執行的任何操作改變,那么程序員要理解該方法必須做的就是理解那些操作返回的結果。將之與前面的一個方法調用幾個其它方法的方案相對照,那個方案中的其它幾個方法都修改這一方法所操作的數據結構。

java 語言的一個相當好的特性是它答應我們使用 final 要害字(作為類型檢查器的偽指令)來聲明何時我們要使某個數據成為不可變。

使用 final 要害字來避免變化是“釘住”類的方法行為的一個好方法。每次修改字段時,都有可能改變引用該字段的方法的行為。另外,將字段標記為 final 讓閱讀程序的其他程序員立即知道:不管整個程序有多大,決不要修改該字段。例如,請考慮下列表示不可變列表的類層次結構。

清單 1. 表示不可變列表的類層次結構

abstract class List {...}
class Empty extends List {...}
class Cons extends List {
PRivate final Object first;
private final List rest;
}



這些類中的所有字段都被標記成 final。要確保這些類的實例不可變,這樣做夠了嗎?不太夠。當然,即使字段被標記成 final,該字段本身的組件可能不是 final,記住這一點很重要。當那些組件更改時,引用那些組件的程序的任何部分可能會被修改,而不管字段本身是否改變。在上面的示例中,盡管列表的組成元素不能被修改,但是我們必須檢查那些元素本身沒有包含可能被修改的非最終字段。

在這種情形中,盡管列表可能包含可變元素,但是我們可以看到存儲在給定列表中的元素序列由于以下原因而不可變:Empty 列表(即,長度為零的列表)的實例根本不包含任何元素;因此不能修改它們。Cons(非空列表)實例包含兩個字段,都是 final。第一個字段包含該列表的第一個元素,它不能被修改;第二個字段包含一個列表,其中包含所有剩余元素。假如這個列表的內容不可變,那么該包含列表也不可變。

但是包含在這第二個字段中的列表比包含列表的長度小一,所以假如我們知道長度為 n 的所有列表都不可變,那么我們就知道長度為 n + 1 的列表也不可變。因為我們已經知道長度為零的列表不可變,所以我們也知道長度為 1、2、3 等的列表同樣不可變。

跟蹤與此類似的數據結構連接會很乏味,但當您能確定這種結構的全局特性(諸如不可變性)時,這樣做是值得的。

控制變化
防止出現不期望的變化的最佳策略就是盡可能避免所有變化。只有當出現一定要改變的原因時(例如,當這樣做大大簡化了代碼結構時),我們才應該使用它。當可以避免變化時,所產生的好處是巨大的(在較低的維護費用和增強的健壯性方面)。

即使存在一定要改變數據的原因,最好還是設法控制那種變化,從而盡可能限制可能產生的破壞。迭代器和流是數據結構的極佳示例,這些數據結構明確設計成通過答應我們以常規的、定義良好的形式利用一系列元素,而不是明確修改這些元素的某個句柄來控制變化。

私有方法
就如同將字段設置成 final 有助于限制對字段值產生外部影響一樣,將它們設置成 private 有助于限制它們對程序其它部分產生的影響。假如字段是私有的,那么我們可以確信該程序的其它部分都不與它直接相關。假如我們除去了該字段,并替換了該類數據的內部表示,那么我們只要關心修正該類內部的方法,以正確訪問新數據。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日产精品久久久一区二区开放时间 | 999久久久久久 | 92精品国产自产在线 | 男女无套免费视频 | 久久99精品国产自在现线 | 欧美性生活xxxxx | 久久久久久久久久久综合 | 蜜桃视频网站www | 一区二区美女视频 | 久久国产精品久久久久久 | 色视频在线观看 | 在线a毛片免费视频观看 | 国产精品99久久99久久久二 | 在线成人影视 | 色中色在线视频 | 亚洲涩涩图 | 中文欧美日韩 | 青青草国产在线视频 | 成人不卡免费视频 | sm高h视频| 欧美精品免费一区二区三区 | 久章草影院 | 一级黄色片在线看 | 中文字幕爱爱视频 | 欧美精品一区自拍a毛片在线视频 | aa久久| 精品午夜影院 | 成人福利在线免费观看 | 亚洲午夜一区二区三区 | 国产精品久久久久久久久久东京 | 激情网站免费观看 | 免费久久精品 | 一级免费特黄视频 | 成人国产视频在线观看 | 中国fx性欧美xxxx | 91懂色| 国产精品成人免费一区久久羞羞 | 欧美精品一区自拍a毛片在线视频 | 欧洲精品色 | 国产精品久久久久久久久粉嫩 | a免费看|