999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于TDD的領域對象層對象提取方法研究

2018-05-15 08:31:14姚遠張樊黃玉蘭
軟件導刊 2018年4期

姚遠 張樊 黃玉蘭

摘 要:目前云系統服務端存在著各類分層模型架構,盡管這些分層架構通常有所差異,但始終存在著領域對象層(Domain Object Layer)。領域對象層中的對象對真實世界里的業務及角色進行抽象與映射,封裝了現實世界中的關鍵業務過程與實體狀態。因此,如何建立云服務領域對象層是面向對象開發方法中的關鍵部分。測試驅動開發(Test Driven Development ,簡稱TDD)作為一種軟件開發方法,使用一組單元測試用例作為軟件開發的基礎與手段,意在使軟件開發過程始終不偏離軟件的主要功能,以實現敏捷開發。提出一種基于TDD進行領域對象層的對象提取、構建領域對象層的方法,并通過實例對該方法進行驗證。驗證結果顯示,構建的領域對象層粒度精細,識別準確、完整。

關鍵詞:TDD;測試用例;領域對象層;對象識別;軟件建模;云系統

DOI:10.11907/rjdk.172548

中圖分類號:TP301

文獻標識碼:A 文章編號:1672-7800(2018)004-0036-03

Abstract:There are various layered model structures in the present cloud system server. Although in general these structures are different they all have domain object layer (DOL). The objects in DOL are the abstraction and reflection of operation and roles in the real world and they encapsulate the key operational process and entity status. Therefore how to establish DOL is the key part of the whole development. This paper uses test-driven development(TDD) as the software development method in which a group of unit test samples are employed as the basis to ensure basic users' needs to be met and agile development to be accomplished in the whole development process. It is proposed to do object extraction based on TDD and establish DOL. The test confirms that the logic objects in the established DOL are in very tiny particle size with accurate and complete recognition.

Key Words:TDD; test samples; domain object layer; object recognition; software model design; cloud system

1 TDD用于發現領域邏輯對象原理

軟件開發過程由面向過程開發轉向面向對象開發已有將近20年歷史,面向對象開發方法已經走過了簡單對象封裝、分組對象域、按功能職責分層進行對象劃分的歷程[1-2]。軟件組成部分不再是簡單地按功能切分,而是按照業務領域的業務過程及角色識別出相應對象,通過這些對象獨立使用或相互協作組成相應的軟件功能模塊。

面向對象分析、設計與開發已由最初的粗粒度簡單對象封裝,演化出幾種成熟的分層對象設計模型。受C/S(客戶/服務器)、N-Tier(多層架)、B/S架構、SOA(面向服務架構)等軟件開發架構的影響,以及多種開發語言進化的推動,面向對象的軟件一般可按3~5個邏輯層次劃分[3-6]。以一般云系統提供的服務端軟件架構為例,軟件層次如圖1所示。

其中領域實體層是層次架構中的核心層,業務領域的所有關鍵業務均由相應領域實體完成,同時由于領域實體是現實世界中人、物的抽象,只要是屬于該業務領域的專家即能對領域實體進行問題分析,這就為現實需求理解和軟件功能實現之間搭建了一座很好的橋梁。領域對象模型的建立也為軟件功能實現帶來了極大好處,由于領域內業務流程容易發生變化,但領域對象卻相對變化較小,所以通過先識別領域對象層,進而構建整個軟件層次對象模型,可以大大降低軟件的升級和維護成本。

一般有兩種方法實現領域實體層中的領域對象建模:①由UML統一建模過程提出的傳統方法進行識別,這種方法要求在軟件需求獲取階段使用用例圖捕捉用戶需求,并根據用例圖中的名詞、行為等進行領域實體識別;②由數據庫的ER模型導出底層數據庫結構,再由數據庫的ER模型直接向上擴展為相應的領域實體模型。

在上述兩種領域對象建模方法中,前者要求自頂向下進行面向對象設計,要求一開始就有一個宏大而全局的軟件架構,這對于軟件設計者把握架構與系統分析能力都提出了較高要求,而后者則由傳統的CS架構體系轉化而來,先做好數據庫設計再由數據表映射出領域實體。這種方式實際上是一種由面向過程開發向面向對象的過渡方式,由于數據庫先于領域實體設計出來,所以軟件開發不得不向已經成形的數據庫架構傾斜,使軟件后續設計遭遇掣肘。因此,本文提出TDD構建領域對象的方法。

TDD全稱為Test Driven Development,意即測試驅動開發。它是近幾年根據軟件開發體系極限編程(XP Programming)和敏捷開發(Agile Programming)發展而來的一種開發實踐[7]。

TDD要求使用一組單元測試用例作為軟件開發的起點。它實際上是一種迭代的軟件開發過程,在每一次軟件迭代開發過程中,開發者首先需要根據軟件功能撰寫一組測試用例,這組用例需要覆蓋所有要求開發的功能。根據這組測試用例,即可確定所需開發的功能集合,而且必定也是能夠滿足用戶需求的最小功能集合。同時,由于每次迭代開發均由測試用例先導,即使用戶需求有大的變更,也可以根據需要重新編寫測試用例,并進行功能開發。而這種重新編寫所花費的人力與時間成本相比于上述兩種傳統方法開發,有效性大大提升[8-10]。

2 通過TDD提取領域對象層的方法

在實際開發中,使用TDD結合面向對象分層開發設計技術,取得了良好效果。首先將系統劃分為服務層、業務邏輯層、領域對象層、持久化層、底層數據庫等層次。在實際開發過程中,主要進行領域對象的創建,再由它向上擴展出業務邏輯層和服務層軟件對象,向下借助O/R Mapping工具得到相應的持久化層對象及數據庫表。在實際開發過程中,針對每個用戶需求寫出一個測試用例。使用Java的JUnit框架對生成的測試用例進行自動測試。測試用例的寫法與普通Java類似,只是每個作為測試用例的方法加上[test]注記,以使該方法的JUnit框架可以進行自動調用。在測試用例中可以使用Assert類檢查測試結果,比較實際結果與期望結果的差別。當每個測試方法的結果不符合預期時,該測試用例即被認為沒有通過,此時開發者必須修改代碼,以通過該測試用例。

2.1 領域對象基本結構識別

通過將需求分解為測試用例中的期望值與期望結果,可以很直觀地找到相應的領域對象。通過需求功能編寫測試用例,測試用例將直觀表達出用戶需求的各種數據,由這些數據發現領域對象。一般的領域對象都會有創建、修改、檢索、刪除的操作(一般被稱為CRUD操作)。因此,對于一個已定義出的領域對象,可以創建4個測試用例,分別對應這4種操作。為了使這幾個測試用例通過單元測試,它們的屬性和方法必須滿足測試用例中的調用。因此,根據測試用例獲得的領域對象也可以獲得所需定義的屬性與方法,因而得到了相應領域對象的基本結構。

2.2 發現領域實體間的聯系

當進行測試用例編寫時,根據需求編寫測試用例,會發現領域實體間有很強的聯系。繼續從測試用例中發現新的實體。

2.3 發現用于規則約束與取值范圍的實體類

在定義領域實體時,對于規則約束與取值范圍的考慮是一個重要內容,屬于系統基礎架構的一部分。通過撰寫某一領域實體的CRUD測試用例,可以將一個類的屬性上升為另一個獨立的類。

根據對每個測試用例的相關操作,可以完整地定義出領域實體層中所有規則約束與取值范圍的類。

2.4 領域實體層提取

通過撰寫覆蓋需求的測試用例代碼,利用IDE的自動化測試工具和代碼生成工具,可以很快構建出領域實體層的領域實體、由于在測試用例中已對需要的領域實體的屬性和方法進行了定義,因此可以很快地構建出對應領域實體類的框架代碼,然后直接實現領域實體類的屬性,最后實現領域對象的方法體。由于針對每個領域實體,已經有對應的一組CRUD測試用例。因此,該領域對象的方法實現可以被立即驗證其功能的正確性。

3 通過TDD提取領域實體層的方法驗證

如用戶的需求為:需要將一份合同保存下來,合同信息需要保存日期、簽訂甲方、簽訂乙方、合同款項、支付方式、標的物名稱。則相應的測試用例為:

[test]

void canCreateContract(){

Contract newcontract = new Contract ();

newcontract.signdate = newdate;

newcontract.PartyA = “湖北晨星公司”;

newcontract.PartyB = “萬琪公司”;

newcontract.TradeItem = “房屋裝修”;

newcontract.Money = 2000000.00;

newcontract.PayMethod = ”銀行轉帳”;

Repository repos = Repository.getInstance();

int count = repos.getObjectCount(Contract.class);

repos.saveObject(newcontract);

Assert.assertNotEqual(newcontract.ID, null);

Assert.assertEqual(newcontract.SerialNo, 0);

Assert.assertEqual(count+1,repos,getObjectCount(Contract.class));

}

由該測試用例可得到兩個領域實體類Contract與Repository,進一步設計CRUD測試用例,得到其屬性與方法。可獲得Contract與Repository類所需要定義的屬性與方法,也因此得到相應領域對象的基本結構。

設計測試用例發現實體間的聯系,比如需要滿足需求“每份裝修施工合同必須記錄每個房間的面積、使用材質以及所需施工時間”,可發現新的領域實體類、合同明細類ContractItem。

根據規則約束與取值范圍繼續設計測試用例,則可以保證“銀行轉帳”、“現金”等之外不合法的數據被測試用例識別。得到新的實體類、交易方式類TradeMethod。

根據以上步驟,可以快速得出領域對象層的軟件類,實現系統功能。圖2是根據上述測試用例設計實現的領域對象層靜態結構圖。

主站蜘蛛池模板: 天天躁夜夜躁狠狠躁躁88| Aⅴ无码专区在线观看| 丰满的熟女一区二区三区l| 四虎成人精品在永久免费| 精品无码人妻一区二区| 香蕉在线视频网站| 亚洲欧美另类日本| 中文字幕首页系列人妻| 全部免费特黄特色大片视频| 首页亚洲国产丝袜长腿综合| 综合久久久久久久综合网| 日韩午夜伦| 57pao国产成视频免费播放| 成人伊人色一区二区三区| 日本在线亚洲| 特级精品毛片免费观看| 国产福利不卡视频| 国产成人亚洲毛片| 五月婷婷亚洲综合| 婷婷综合亚洲| 婷婷色在线视频| 亚洲国产精品无码AV| 高潮毛片免费观看| 在线免费观看a视频| 亚洲九九视频| 美女免费精品高清毛片在线视| 视频在线观看一区二区| 99免费在线观看视频| 亚洲欧洲天堂色AV| 重口调教一区二区视频| 国产日韩久久久久无码精品| 美女国产在线| 亚洲午夜18| 国产午夜看片| 国产美女久久久久不卡| WWW丫丫国产成人精品| 熟女视频91| 日韩黄色精品| 4虎影视国产在线观看精品| 青青青亚洲精品国产| 伊人激情综合网| 久久久受www免费人成| 亚洲综合久久成人AV| 国产精品hd在线播放| 日韩精品一区二区三区中文无码| 国产三级视频网站| 伊人久综合| 久久99热这里只有精品免费看| 又粗又硬又大又爽免费视频播放| 欧美成人aⅴ| 久久国产精品电影| 麻豆国产在线不卡一区二区| 亚洲第一色视频| 国产欧美日韩综合在线第一| 在线观看精品国产入口| 色综合成人| 国产经典在线观看一区| 日本一区中文字幕最新在线| 国产精品片在线观看手机版| 国产性爱网站| 啦啦啦网站在线观看a毛片 | 自拍偷拍欧美日韩| 亚洲aaa视频| 日韩精品成人网页视频在线 | 久久精品亚洲专区| 在线观看视频一区二区| 狠狠操夜夜爽| 国产呦精品一区二区三区下载 | 日韩美毛片| 精品国产99久久| 亚洲视频黄| 免费又黄又爽又猛大片午夜| 久久视精品| 亚洲天堂自拍| 国产精品男人的天堂| 欧美亚洲一区二区三区导航| 欧美日韩中文字幕二区三区| 久久五月视频| 热伊人99re久久精品最新地| 日日碰狠狠添天天爽| 免费在线观看av| 久久精品国产亚洲麻豆|