? 代碼可理解性/可讀性
可理解性
? ? 代碼的可讀性
? ? 例如:
? ? 是否遵循命名慣例?
? ? 它是自我描述和/或評論很好嗎诡延?
? ? 事物(例如奕删,課程)是否一次只做一件事或多件事奕坟?
? ? 這些方法是長還是短,并且可以在一次閱讀中理解它們的意圖罗侯,還是需要進行大量的屏幕盯著和白板分析器腋?
? ? 別名:可讀性
? ? 可讀性是指人類讀者能夠輕松理解源代碼的目的,控制流程和操作钩杰。
? ? 它影響上述質(zhì)量方面纫塌,包括便攜性,可用性和最重要的可維護性讲弄。
? ? 可讀性非常重要措左,因為程序員大部分時間都在閱讀,嘗試理解和修改現(xiàn)有的源代碼避除,而不是編寫新的源代碼怎披。
? ? 無法讀取的代碼通常會導(dǎo)致錯誤,效率低下和代碼重復(fù)瓶摆。
? 編碼規(guī)范
名字長度
? ? 名稱應(yīng)該是描述性的凉逛。 名稱越長,可能的描述就越多群井。
? ? 名稱也應(yīng)簡明扼要状飞。 名稱越長,它的效率就越低。
注釋密度(MCOMM%)
MCOMM%= MCOMM / LOC
等寬字體代碼
復(fù)雜性和LoC
復(fù)雜性
? ? 復(fù)雜的代碼不太可能是可以理解的诬辈。
? ? 代碼行(LoC)
? ? 方法越長酵使,理解起來就越難。
?在四個地方使用注釋:
? ? 標題注釋引入了類定義焙糟,重要函數(shù)口渔,宏定義包,一些其他非平凡模塊或整個源代碼文件穿撮。 對于專有程序搓劫,標題注釋通常包括版權(quán)聲明。
? ? 介紹性注釋描述了類混巧,函數(shù)或其他模塊的用途和用法。
? ? 塊注釋描述了一組相關(guān)語句的目的和策略勤揩。
? ? 單行/尾隨/行尾注釋解釋單個聲明或甚至聲明的一部分咧党。
? Programing for/with reuse
軟件重用是使用現(xiàn)有軟件組件實現(xiàn)或更新軟件系統(tǒng)的過程。
設(shè)計模式
跨應(yīng)用程序發(fā)生的泛型抽象表示為顯示抽象和具體對象和交互的設(shè)計模式陨亡。
基于組件的開發(fā)
通過集成符合組件模型標準的組件(對象集合)來開發(fā)系統(tǒng)傍衡。
應(yīng)用程序框架
可以調(diào)整和擴展以創(chuàng)建應(yīng)用程序系統(tǒng)的抽象和具體類的集合。
遺留系統(tǒng)包裝
可以通過定義一組接口并通過這些接口提供對這些遺留系統(tǒng)的訪問來“包裝”的傳統(tǒng)系統(tǒng)负蠕。
面向服務(wù)的系統(tǒng)
通過鏈接可能在外部提供的共享服務(wù)來開發(fā)系統(tǒng)蛙埂。
應(yīng)用產(chǎn)品系列
應(yīng)用程序類型圍繞通用體系結(jié)構(gòu)進行概括,以便可以針對不同客戶以不同方式進行調(diào)整遮糖。
COTS集成
COTS(商業(yè)現(xiàn)貨绣的,商務(wù)現(xiàn)貨供應(yīng))。 通過集成現(xiàn)有的應(yīng)用系統(tǒng)來開發(fā)系統(tǒng)欲账。
可配置的垂直應(yīng)用
通用系統(tǒng)的設(shè)計使其可以根據(jù)特定系統(tǒng)客戶的需求進行配置屡江。
程序庫
實現(xiàn)常用抽象的類和函數(shù)庫可供重用。
程序生成器
生成器系統(tǒng)嵌入特定類型的應(yīng)用程序的知識赛不,并且可以在該域中生成系統(tǒng)或系統(tǒng)片段惩嘉。
面向方面的軟件開發(fā)
編譯程序時,共享組件將編織到不同位置的應(yīng)用程序中踢故。
源代碼級別:方法文黎,語句等
模塊級別:類和接口
庫級別:API
? ? Java庫
? ? Maven
? ? 系統(tǒng)級:框架
? Liskov替換原則(LSP)
行為子類型
?設(shè)q(x)是可證明關(guān)于類型T的對象x的屬性。那么對于S類型的對象y殿较,q(y)應(yīng)該是可證明的耸峭,其中S是T的子類型。
?Java中編譯器強制規(guī)則:
? ? 子類型可以添加淋纲,但不能刪除方法
? ? 具體類必須實現(xiàn)所有未定義的方法
? ? 重寫方法必須返回相同的類型或子類型
? ? 重寫方法必須接受相同的參數(shù)類型
? ? 覆蓋方法可能不會引發(fā)其他異常
? ? ?也適用于指定的行為:
? ? 相同或更強的不變量
? ? 所有方法的相同或更強的后置條件
? ? 所有方法的相同或較弱的前提條件
? Delegation 委托
委托是指一個對象依賴于另外一個對象的部分功能
顯式委派:將發(fā)送對象傳遞給接收對象
隱式委派:通過語言的成員查找規(guī)則
委托可看做是在實體之間共享代碼和數(shù)據(jù)的低層機制
委派與繼承
繼承:通過新操作擴展基類或覆蓋操作抓艳。
委托:捕獲操作并將其發(fā)送到另一個對象。
許多設(shè)計模式使用繼承和委派的組合。
小結(jié):對象之間的聯(lián)系
繼承/泛化inheritance:一般與特殊的關(guān)系——is a kind of
組合composition:部分與整體的關(guān)系玷或,彼此不可分——is part of
聚合aggregation:部分與整體的關(guān)系儡首,但彼此可分——owns a
關(guān)聯(lián)association:對象之間的長期靜態(tài)聯(lián)系——has a
依賴dependence:對象之間的動態(tài)的、臨時的通信聯(lián)系——use a
類間聯(lián)系的強度:繼承>>> 組合>> 聚合>> 關(guān)聯(lián)>>> 依賴
? 接口的組合
? 白盒偏友、黑盒框架的原理與實現(xiàn)
Whitebox和Blackbox框架
Whitebox框架
? ? 通過子類化和重寫方法進行擴展
? ? 通用設(shè)計模式:模板方法
? ? 子類有主要方法但控制框架
Blackbox框架
? ? 通過實現(xiàn)插件接口進行擴展
? ? 共同設(shè)計模式:戰(zhàn)略蔬胯,觀察員
? ? 插件加載機制加載插件并控制框架
Whitebox vs. Blackbox框架
Whitebox框架使用子類
? ? 允許擴展每個非私有方法
? ? 需要了解超類的實現(xiàn)
? ? 一次只能擴展一個
? ? 匯編在一起
? ? 通常所謂的開發(fā)者框架
? ? Blackbox框架使用組合
? ? 允許擴展界面中公開的功能
? ? 只需要了解界面
? ? 多個插件
? ? 通常提供更多的模塊化
? ? 可以單獨部署(.jar,.dll位他,…)
? ? 通常所謂的最終用戶框架氛濒,平臺
? 設(shè)計模式adapter、decorator鹅髓、fa?ade舞竿、strategy、template窿冯、iterator/iterable
Adapter Pattern 適配器模式
目標:對舊的不兼容組件進行包裝骗奖,在新系統(tǒng)中使用舊的組件
適配器模式
兩種類型的適配器設(shè)計模式
? ? 繼承
? ? 委托
? ? Decorator 裝飾器模式
? ? 方案: 實現(xiàn)一個通用接口作為要擴展的對象,將主要功能委托給基礎(chǔ)對象(stack)醒串,然后添加功能(undo,secure,…)执桌。
? ? 接口:定義裝飾物執(zhí)行的公共操作
? ? 起始對象,在其基礎(chǔ)上增加功能(裝飾)芜赌,將通用的方法放到此對象中仰挣。
裝飾者與繼承
? ? ?Decorator在運行時編寫功能
? ? 繼承在編譯時組成功能
? ? ?裝飾器由多個協(xié)作對象組成
? ? 繼承產(chǎn)生一個明確類型的對象
? ? ?可以混合搭配多種裝飾品
? ? 多重繼承在概念上很難
Fa?ade 外觀模式
調(diào)用者需要一個簡化的接口來調(diào)用復(fù)雜系統(tǒng)的整體功能。
提供更高層次的接口來使子系統(tǒng)易于使用缠沈。
Strategy 整體地替換算法
針對特定任務(wù)存在多種算法膘壶,調(diào)用者需要根據(jù)上下文環(huán)境動態(tài)的選擇和切換。
示例:對客戶列表進行排序(冒泡排序洲愤,合并排序香椎,快速排序)
定義一個算法的接口,每個算法用一個類來實現(xiàn)禽篱,客戶端針對接口編寫程序畜伐。
Template Method 模板方法
不同的客戶端具有相同的算法步驟,但是每個步驟的具體實現(xiàn)不同躺率。
在父類中定義通用邏輯和各步驟的抽象方法聲明玛界。
子類中進行各步驟的具體實現(xiàn)。
在父類聲明一個通用邏輯悼吱。
模板模式用繼承+重寫的方式實現(xiàn)算法的不同部分慎框。
策略模式用委托機制實現(xiàn)不同完整算法的調(diào)用(接口+多態(tài))
Iterator 迭代模式
問題:客戶端需要以統(tǒng)一的、與元素類型無關(guān)的方式訪問容器中的所有元素