当前位置:网站首页>(構造筆記)從類、API、框架三個層面學習如何設計可複用軟件實體的具體技術
(構造筆記)從類、API、框架三個層面學習如何設計可複用軟件實體的具體技術
2022-07-03 12:01:00 【Special case】
從類、API、框架三個層面學習如何設計可複用軟件實體的具體技術
複用級別:
代碼的複用
包括目標代碼和源代碼的複用。其中目標代碼的複用級別最低,曆史也最久,當前大部分編程語言的運行支持系統都提供了連接(Link)、綁定(Binding)等功能來支持這種複用。源代碼的複用級別略高於目標代碼的複用,程序員在編程時把一些想複用的代碼段複制到自己的程序中,但這樣往往會產生一些新舊代碼不匹配的錯誤。想大規模的實現源程序的複用只有依靠含有大量可複用構件的構件庫。如”對象鏈接及嵌入”(OLE)技術,既支持在源程序級定義構件並用以構造新的系統,又使這些構件在目標代碼的級別上仍然是一些獨立的可複用構件,能够在運行時被靈活的得新組合為各種不同的應用。
設計的複用
設計結果比源程序的抽象級別更高,因此它的複用受實現環境的影響較少,從而使可複用構件被複用的機會更多,並且所需的修改更少。這種複用有三種途徑,第一種途徑是從現有系統的設計結果中提取一些可複用的設計構件,並把這些構件應用於新系統的設計;第二種途徑是把一個現有系統的全部設計文檔在新的軟硬件平臺上重新實現,也就是把一個設計運用於多個具體的實現;第三種途徑是獨立於任何具體的應用,有計劃地開發一些可複用的設計構件。分析的複用
這是比設計結果更高級別的複用,可複用的分析構件是針對問題域的某些事物或某些問題的抽象程度更高的解法,受設計技術及實現條件的影響很少,所以可複用的機會更大。複用的途徑也有三種,即從現有系統的分析結果中提取可複用構件用於新系統的分析;用一份完整的分析文檔作輸入產生針對不同軟硬件平臺和其它實現條件的多項設計;獨立於具體應用,專門開發一些可複用的分析構件。測試信息的複用
主要包括測試用例的複用和測試過程信息的複用。前者是把一個軟件的測試用例在新的軟件測試中使用,或者在軟件作出修改時在新的一輪測試中使用。後者是在測試過程中通過軟件工具自動地記錄測試的過程信息,包括測試員的每一個操作、輸入參數、測試用例及運行環境等一切信息。這種複用的級別,不便和分析、設計、編程的複用級別作准確的比較,因為被複用的不是同一事物的不同抽象層次,而是另一種信息,但從這些信息的形態看,大體處於與程序代碼相當的級別。
由於軟件生產過程主要是正向過程,即大部分軟件的生產過程是使軟件產品從抽象級別較高的形態向抽象級別較低的形態演化,所以較高級別的複用容易帶動較低級別的複用,因而複用的級別越高,可得到的回報也越大,因此分析結果和設計結果在目前很受重視。用戶可購買生產商的分析件和設計件,自己設計或編程,掌握系統的剪裁、擴充、維護、演化等活動。
可複用的類:
委托和組合
委托(Delegation)
委派/委托:一個對象請求另一個對象的功能,是複用的一種常見形式。
委托可以被描述為在實體之間共享代碼和數據的低級機制
委托依賴於動態綁定,因為它要求給定的方法調用可以在運行時調用不同的代碼段。
委托和繼承的比較:
繼承:通過新操作擴展基類或覆蓋操作。
委托:把基類拿過來作為新的類的元素,可以用基類以實現的功能擴展新類的功能
委托可以替代繼承的情况:如果子類只需要複用父類中的一小部分方法,可以不需
要使用繼承,而是通過委派機制來實現
組合繼承原則
類應該通過它們的組合實現多態行為和代碼重用(通過包含實現所需功能的其他類的實例),而不是從基類或父類繼承。
組合原則:
使用接口定義系統必須對外展示的不同側面的行為,例如,一只鳥可以叫也可以飛,那麼可以定義兩個接口,quackable和flyable。
接口之間通過extends實現行為的擴展(接口組合)。然後可以定義一個接口birdable同時繼承了上述兩個接口,這樣這個新的接口就有了上述兩個接口的全部功能。
類implements 組合接口,從而規避了複雜的繼承關系。接下來,我們定義的“鳥類”就可以實現birdable,使得活動頂層接口的功能(在構造實例的過程中,同時要delegation頂層功能的接口)
可複用的API和框架:
之所以庫和框架被稱為系統層面的複用,是因為它們不僅定義了1個可複用的接口/類,而是將某個完整系統中的所有可複用的接口/類都實現出來,並且定義了這些類之間的交互關系、調用關系,從而形成了系統整體 的“架構”。
編寫一個API需要考慮以下方面:
- API應該做一件事,且做得很好
- API應該盡可能小,但不能太小
- Implementation不應該影響API
- 記錄文檔很重
- 考慮性能後果
- API必須與平臺和平共存
- 類的設計:盡量减少可變性,遵循LSP原則
- 方法的設計:不要讓客戶做任何模塊可以做的事情,及時報錯
框架
框架分為白盒框架和黑盒框架。
白盒框架:
通過子類化和重寫方法進行擴展(使用繼承);
通用設計模式:模板方法;
子類具有主要方法但對框架進行控制。
黑盒框架:
通過實現插件接口進行擴展(使用組合/委派);
常用設計模式:Strategy, Observer ;
插件加載機制加載插件並對框架進行控制。
边栏推荐
- OpenGL index cache object EBO and lineweight mode
- 4000字超详解指针
- Why can't my MySQL container start
- Capturing and sorting out external Fiddler -- Conversation bar and filter [2]
- Dynamically monitor disk i/o with ZABBIX
- Talk about the state management mechanism in Flink framework
- 网络通讯之Socket-Tcp(一)
- Web security summary
- 抓包整理外篇fiddler———— 会话栏与过滤器[二]
- (构造笔记)ADT与OOP
猜你喜欢
ArcGIS应用(二十一)Arcmap删除图层指定要素的方法
外插散点数据
Capturing and sorting out external Fiddler -- Conversation bar and filter [2]
MCDF Experiment 1
[official MySQL document] deadlock
Kubernetes three dozen probes and probe mode
VS2015的下载地址和安装教程
vulnhub之raven2
Duplicate numbers in the array of sword finger offer 03
Xml的(DTD,xml解析,xml建模)
随机推荐
STL tutorial 8-map
vulnhub之Nagini
(构造笔记)ADT与OOP
Vulnhub's cereal
DNS多点部署IP Anycast+BGP实战分析
Quantitative calculation research
After watching the video, AI model learned to play my world: cutting trees, making boxes, making stone picks, everything is good
typeScript
Unity3d learning notes 5 - create sub mesh
Go语言实现静态服务器
在CoreOS下部署WordPress实例教程
ftp登录时,报错“530 Login incorrect.Login failed”
"Jianzhi offer 04" two-dimensional array search
MySQL uses the method of updating linked tables with update
previous permutation lintcode51
OpenGL index cache object EBO and lineweight mode
Redis notes 01: Introduction
STL教程8-map
牛牛的组队竞赛
DNS multi-point deployment IP anycast+bgp actual combat analysis