課件軟件工程-第10章軟件體系結(jié)構(gòu)_第1頁
課件軟件工程-第10章軟件體系結(jié)構(gòu)_第2頁
課件軟件工程-第10章軟件體系結(jié)構(gòu)_第3頁
課件軟件工程-第10章軟件體系結(jié)構(gòu)_第4頁
課件軟件工程-第10章軟件體系結(jié)構(gòu)_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第10章軟件體系結(jié)構(gòu) 本章從面向?qū)ο蠓治龊驮O(shè)計入手,掌握的類圖設(shè)計器。以組件、模式的形式來學(xué)習(xí)和研究軟件體系結(jié)構(gòu),最后介紹在.NET環(huán)境下怎樣設(shè)計、建立和實現(xiàn)軟件體系結(jié)構(gòu)的3層結(jié)構(gòu)。 10.1面向?qū)ο蟮姆治龊驮O(shè)計面向?qū)ο蟮乃枷胧前咽澜缟系氖挛锒伎闯蓪ο?,?fù)雜的對象由簡單的對象組成。我們還可以把世界上的事物分成類,這些類就是對象的集合。類可以包含子類,類由成員組成,字段、屬性、方法、接口、事件都是成員。對象是類的實例,對象的集合是一個類。每個對象都由特定的狀態(tài)(字段值)、屬性(設(shè)置與獲取字段值)、方法(完成對象功能)、接口(對象與外界的聯(lián)系)和事件(對象與周圍的通訊和突發(fā)事件的處理)組成。面向?qū)ο蟮姆治鼍褪且獜默F(xiàn)實世界中發(fā)現(xiàn)對象、提取對象并歸類,研究類與類、類與對象、對象與對象之間的關(guān)系。

面向?qū)ο蟮姆治龊喎QOOA,面向?qū)ο蟮脑O(shè)計簡稱OOD,面向?qū)ο蠓治龊驮O(shè)計析簡稱OOAD下面給出一個準確的定義: 面向?qū)ο蠓治觯豪妹嫦驅(qū)ο蟮乃枷?,抽象出軟件中所需要的對象和分析出軟件所需實現(xiàn)的功能。 面向?qū)ο笤O(shè)計:根據(jù)軟件的功能分析出軟件對象的關(guān)系并畫出軟件設(shè)計圖(例如,UML圖)。類與類之間的關(guān)系其實只有兩種情況:一種是關(guān)聯(lián):例如,A類對象調(diào)用B類對象。一種是組合:聚合:A類中定義B類、B類中又定義了C類。繼承:A類中繼承了B類。 1面向?qū)ο蟮姆治龉ぷ?)預(yù)算和計劃2)找出對象3)分析業(yè)務(wù)流程,一般用用例圖。 2面向?qū)ο笤O(shè)計工作根據(jù)分析結(jié)果,畫出設(shè)計圖,一般用UML類圖[見UML類圖]、對象圖或數(shù)據(jù)流圖、流程圖等。 3掌握的類圖設(shè)計器的使用鼠標點擊解決方案→鼠標右擊要查看的項目→點擊“查看類關(guān)系圖”,顯示如圖10.1所示。

從圖中可以看到與類圖相關(guān)的圖有兩個,一個是類圖顯示窗口和一個是工具箱“類圖設(shè)計器”窗口,如果你還想看“類詳細信息”窗口,可以用鼠標右鍵點擊任意一個類圖,再點擊““類詳細信息”,就可以看見類的詳細信息了,如圖10.2所示。

下面設(shè)計一個有類關(guān)聯(lián)和組合的家庭類圖。如圖10.3所示。

10.2軟件的體系結(jié)構(gòu) 軟件體系結(jié)構(gòu)(softwareArchitecture)是軟件系統(tǒng)與子系統(tǒng)、組件以及它們之間相互關(guān)系的描述。換句話說,軟件體系結(jié)構(gòu)就是軟件系統(tǒng)的架構(gòu)。 面向?qū)ο蟮能浖_發(fā)就像搭積木一樣,最小的積木是類、接口、結(jié)構(gòu)等,大一點的是組件,再大一點的就是本節(jié)要討論的內(nèi)容。下面我們通過組件的定義、軟件的模式、軟件的設(shè)計和實現(xiàn)方法進行介紹。

1組件的定義 組件就是一個封裝的可執(zhí)行的軟件模塊,最小的組件就是一個類或?qū)ο?,類似一塊積木,COM、程序集是中型組件,大型組件包括工作流組件、服務(wù)組件甚至到一個軟件系統(tǒng)。組件的一個重要特性是可交換性,這一特性可用于軟件系統(tǒng)的升級、維護和更新。要做到可交換性,一方面要求兩個組件的接口完全兼容,數(shù)據(jù)類型要一致,運行此兩個組件的環(huán)境還要兼容。另一方面組件之間的依賴性越小越好,只有組件的獨立性好,才好更換。

2模式簡單說,模式就是模型和樣式。模式又分體系模式和設(shè)計模式。體系模式是設(shè)計軟件結(jié)構(gòu)時經(jīng)常使用的方案、例如,三層架構(gòu)就屬于體系模式。設(shè)計模式是指構(gòu)建一個小的組件或項目時的解決方案。設(shè)計模式可以直接影響到編碼,它可以提供給一些經(jīng)典的代碼結(jié)構(gòu)。設(shè)計模式比體系模式小。下面舉一個經(jīng)典的設(shè)計模式的例子,單例模式。它的特點是,每次運行只有一個實例。其程序如下:usingSystem;usingSystem.Text;class單例類{privatestring消息=string.Empty;privatestatic單例類實例=null;private單例類(stringmsg){消息=msg;}publicstatic單例類獲得實例(strings){//注意這里,只允許一個實例

if(實例==null)實例=new單例類(s);return實例;}publicvoid展示(){Console.WriteLine(消息);}}classProgram{staticvoidMain(string[]args){單例類例1=單例類.獲得實例("實例1");

例1.展示();

單例類例2=單例類.獲得實例("實例2");

例2.展示();}}

運行后,輸出結(jié)果為:實例1實例1下面再舉一個工廠模式的例子usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceProductDesign{enumTYPE{上汽,一汽,長安};abstractclass汽車

{publicabstractstringName{get;}publicabstractvoidRun();}

class上汽:汽車

{privatestringname=string.Empty;publicoverridestringName{get{returnname;}}publicoverridevoidRun(){Console.WriteLine("{0}起跑!",name);}public上汽(stringsname){name=sname;}}class一汽:汽車

{privatestringname=string.Empty;publicoverridestringName{get{returnname;}}publicoverridevoidRun(){Console.WriteLine("{0}起跑!",name);}public一汽(stringsname){name=sname;}}class長安:汽車

{privatestringname=string.Empty;publicoverridestringName{get{returnname;}}publicoverridevoidRun(){Console.WriteLine("{0}起跑!",name);}public長安(stringsname){name=sname;}}

abstractclassCreator{publicstatic汽車獲得汽車(TYPEtype,stringname){switch(type){caseTYPE.上汽:returnnew上汽(name);caseTYPE.一汽:returnnew一汽(name);caseTYPE.長安:returnnew長安(name);}returnnull;}}

classProgram{staticvoidMain(string[]args){

汽車車1=Creator.獲得汽車(TYPE.上汽,"朗逸");

汽車車2=Creator.獲得汽車(TYPE.一汽,"紅旗");

汽車車3=Creator.獲得汽車(TYPE.長安,"福特");List<汽車>汽車=newList<汽車>();

汽車.Add(車1);

汽車.Add(車2);

汽車.Add(車3);foreach(汽車車in汽車)車.Run();}}} 10.2

軟件的設(shè)計原則軟件的設(shè)計原則是開放軟件需要注意到的問題,是用來衡量一個軟件質(zhì)量好壞的標準,就好象國家或政黨的政策和策略(為人民服務(wù)、千萬不要忘記階級斗爭、三個代表)、一個人對社會的認識(水可載舟也可覆舟、群眾是真正的英雄。。。、人民,只有人民。。。)、道德品質(zhì)和處事原則一樣重要(例如,三好學(xué)生標準、公誠勇毅、力氣用了力氣在、勞動創(chuàng)造人類、勤勞致富)

。一定要深刻理解和貫徹執(zhí)行。下面就列舉這些設(shè)計原則:1模塊獨立性好。每個軟件元素(類或組件)表達一個單獨的意圖。模塊之間“低耦合高類聚”。2代碼易理解、可讀性高。它涉及到軟件的可維護性和開發(fā)時的合作。3一致性好。容易形成風(fēng)格、模式,團隊編程效率才高。4一次性原則。不要兩個類或代碼做相同的事情,避免邏輯上和結(jié)構(gòu)上的重復(fù)。5從簡原則。完成同樣功能,越簡單就越好。(例如,不管白貓黑貓,抓到老鼠就是好貓)6減法原則。當你不能從你的設(shè)計中去掉任何東西時,這個設(shè)計就算完成了。(多一事不如少一事)

10.3三層架構(gòu) 在軟件體系架構(gòu)設(shè)計中,分層式結(jié)構(gòu)是最常見,也是最重要的一種結(jié)構(gòu)。微軟推薦的分層式結(jié)構(gòu)一般分為三層,如圖10.4所示。從下至上分別為:數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層、表示層。所謂三層體系結(jié)構(gòu),是在客戶端與數(shù)據(jù)庫之間加入了一個“中間層”,也叫組件層。三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問、合法性校驗等工作放到了中間層進行處理。表示層業(yè)務(wù)邏輯層數(shù)據(jù)訪問層數(shù)據(jù)庫圖10.4三層架構(gòu)模型

表示層:是系統(tǒng)的用戶界面部分,負責(zé)使用者與整個系統(tǒng)的交互。在這一層中,理想的狀態(tài)是不應(yīng)包括系統(tǒng)的業(yè)務(wù)邏輯。表示層中的邏輯代碼,僅與界面元素有關(guān)。用于顯示數(shù)據(jù)和接收用戶輸入的數(shù)據(jù),為用戶提供一種交互式操作的界面。業(yè)務(wù)邏輯層:業(yè)務(wù)邏輯層(BusinessLogicLayer)無疑是系統(tǒng)架構(gòu)中體現(xiàn)核心價值的部分。它處于數(shù)據(jù)訪問層與表示層中間,起到了數(shù)據(jù)交換中承上啟下的作用。業(yè)務(wù)邏輯層的設(shè)計對于一個支持可擴展的架構(gòu)尤為關(guān)鍵,因為它扮演了兩個不同的角色。對于數(shù)據(jù)訪問層而言,它是調(diào)用者;對于表示層而言,它卻是被調(diào)用者。

數(shù)據(jù)訪問層:其功能主要是負責(zé)數(shù)據(jù)庫的訪問,可以訪問數(shù)據(jù)庫系統(tǒng)、二進制文件、文本文檔或是XML文檔。簡單的說法就是實現(xiàn)對數(shù)據(jù)表的查詢、增加、更新和刪除操作。下面介紹一個三層架構(gòu)的商務(wù)網(wǎng)站“唐風(fēng)商城網(wǎng)站”的設(shè)計和實現(xiàn)。在第9章中,我們介紹了“唐風(fēng)商城網(wǎng)站”的程序結(jié)構(gòu)(名字空間結(jié)構(gòu))、唐風(fēng)網(wǎng)站程序的9個項目以及它們之間的引用關(guān)系。并且描述了如何建立系統(tǒng)、實現(xiàn)互相引用的全部過程。下面我們著重分析系統(tǒng)是怎樣實現(xiàn)3層結(jié)構(gòu)的。從圖9.2唐風(fēng)網(wǎng)站程序的9個項目之間的引用關(guān)系看到:

網(wǎng)站W(wǎng)EB:很明顯是系統(tǒng)的表示層,用戶可以在此層輸入和展示商品信息。網(wǎng)站程序包含啟動程序(dafault.aspx,index.aspx)、配置文件(web.config)、樣式文件(*.SCC文件)、其他.NET程序(*.aspx)、*.HTML文件、圖像和動畫文件等。網(wǎng)站程序一般分為前臺和后臺。前臺為用戶使用,后臺一般由管理員和超級用戶使用。共有類418個。這些類被組織在如圖9.1所描述的那樣,是一顆樹形結(jié)構(gòu)。例如,默認(default)主頁類的詳細信息如圖10.5所示。

業(yè)務(wù)邏輯(BLL):很顯然屬于業(yè)務(wù)邏輯層。就是將每個業(yè)務(wù)(實體)定義為一個類,在該類中定義相應(yīng)的接口、構(gòu)造函數(shù)和操作方法(例如,對表中的記錄增加、修改、刪除等)。業(yè)務(wù)邏輯由9個名字空間組成,如圖9.1所示。每個名字空間又由若干類組成,唐風(fēng)整個業(yè)務(wù)模型定義了89個類。例如,類AdvertiseManage的詳細信息如圖10.6所示。

下面再給出AdvertiseManage類的程序:usingSystem;usingSystem.Data;usingSystem.Collections.Generic;usingTFShop.Model.Accessories;usingTFShop.DALFactory;usingTFShop.IDAL.Accessories;namespaceTFShop.BLL.Accessories{///<summary>///廣告管理業(yè)務(wù)邏輯層

///</summary>publicclassAdvertiseManage{privatereadonlyIAdvertiseManagedal=DataAccess.CreateAdvertiseManage();publicAdvertiseManage(){}#region成員方法

///<summary>///添加一條新廣告

///</summary>///<paramname="model"></param>///<returns></returns>

publicintAdd(TFShop.Model.Accessories.AdvertiseManagemodel){returndal.Add(model);}///<summary>///更新一條數(shù)據(jù)

///</summary>///<paramname="model"></param>///<returns></returns>publicvoidAmend(TFShop.Model.Accessories.AdvertiseManagemodel){dal.Amend(model);}///<summary>///刪除一條數(shù)據(jù)

///</summary>///<paramname="Id"></param>publicvoidDelete(intId){dal.Delete(Id);}

///<summary>///更新任意一個列

///</summary>///<paramname="id"></param>///<paramname="columnName"></param>///<paramname="value"></param>///<returns></returns>publicintAmend(intid,stringcolumnName,objectvalue){returndal.Amend(id,columnName,value);}///<summary>///得到一個實體

///</summary>///<paramname="id"></param>///<returns></returns>publicTFShop.Model.Accessories.AdvertiseManageGetModelByID(intid){returndal.GetModelByID(id);}

///<summary>///所有數(shù)據(jù)集合

///</summary>///<returns></returns>publicList<TFShop.Model.Accessories.AdvertiseManage>GetAll(){returndal.GetAll();}///<summary>///得到所有數(shù)據(jù)

///</summary>///<returns></returns>publicTF.DataBase.DataByPageGetList(){returndal.GetList();}#endregion}}

從上面的程序可以看到它使用了唐風(fēng)商城.模型.附件(TFShop.Model.Accessories)、唐風(fēng)商城.數(shù)據(jù)工廠(TFShop.DALFactory)和唐風(fēng)商城.數(shù)據(jù)接口.附件(TFShop.IDAL.Accessories)。它利用數(shù)據(jù)工廠(DALfactory)定義的數(shù)據(jù)存取類(DataAccess)的CreateAdvertiseManage()的靜態(tài)方法建立接口,然后利用這個接口的方法來完成廣告業(yè)務(wù)功能。

數(shù)據(jù)工廠(DALfactory):屬于數(shù)據(jù)訪問層。定義數(shù)據(jù)存取類(DataAccess),在該類中為每一個數(shù)據(jù)表定義一個靜態(tài)方法,該方法建立數(shù)據(jù)表對象,并將其轉(zhuǎn)換為相應(yīng)的接口返回。例如,定義廣告靜態(tài)方法,其程序如下:publicstaticTFShop.IDAL.Accessories.IAdvertiseManageCreateAdvertiseManage(){return(IAdvertiseManage)CreateObject("Accessories.AdvertiseManage");};

數(shù)據(jù)服務(wù)(SQLserverDAL):屬于數(shù)據(jù)訪問層。利用模型的參數(shù)、繼承的接口,實現(xiàn)接口中的方法,來完成對數(shù)據(jù)庫中表的增加、刪除、更新、獲取等操作。共有類85個,其中有11個類繼承了DbBase這個類。DbBase這個類是定義數(shù)據(jù)庫表名的前綴類。例如,商城類型ShopStyle

。該類的詳細信息如圖10.7所示。

對應(yīng)的程序如下:ShopStyle.cs數(shù)據(jù)接口(IDAL):就是將數(shù)據(jù)庫中的每一個表(實體)定義一個接口,每個接口定義對表的操作(例如,對表中的記錄增加、修改、刪除等),這些操作只定義方法名、參數(shù)個數(shù)和類型。所有接口由9個名字空間組成,如圖9.1所示。每個名字空間又由若干接口組成,唐風(fēng)整個定義了84個接口。例如,廣告接口IAdvertiseManage,該接口的詳細信息如圖10.8所示。

對應(yīng)程序如下:usingSystem;usingSystem.Data;usingSystem.Collections.Generic;namespaceTFShop.IDAL.Accessories{publicinterfaceIAdvertiseManage{///<summary>///增加一條數(shù)據(jù)

///</summary>intAdd(TFShop.Model.Accessories.AdvertiseManagemodel);

///更新一條數(shù)據(jù)

///</summary>voidAmend(TFShop.Model.Accessories.AdvertiseManagemodel);///<summary>///刪除一條數(shù)據(jù)

///</summary>voidDelete(intId);

///<summary> ///任意修改一個字段

///</summary>intAmend(intid,stringcolumnName,Objectvalue);///<summary>///得到一個對象實體///</summary>TFShop.Model.Accessories.AdvertiseManageGetModelByID(intid);

///<summary>///獲得所有數(shù)據(jù)集合

///</summary>///<returns></returns>List<TFShop.Model.Accessories.AdvertiseManage>GetAll();///<summary>///獲得所有數(shù)據(jù)

///</summary>///<returns></returns>TF.DataBase.DataByPageGetList();}}模型(Model):屬于數(shù)據(jù)層。就是將數(shù)據(jù)庫中的表(實體)定義為類,用C#中的屬性定義每一個字段以及構(gòu)造函數(shù)。模型由9個名字空間組成,如圖9.1所示。每個名字空間由若干類組成,唐風(fēng)整個模型定義了89個類。例如,訂單留言模型類OrderLeave的詳細信息如圖10.9所示。對應(yīng)程序如下:usingSystem;namespaceTFShop.Model.Order{[Serializable]publicclassOrderLeave{publicOrderLeave(){}#regionModelprivateintid;privateint?memberid;

privatestringorderid;privatestringcontent;privateDateTime?createdate;privateint?state;//int?:表示可空類型,就是一種特殊的值類型,它的值可以為null///<summary>///留言ID///</summary>publicintID{set{id=value;}get{returnid;}}

///<summary>///會員ID///</summary>publicint?MemberId{set{memberid=value;}get{returnmemberid;}}///<summary>///訂單ID///</summary>publicstringOrderId{set{orderid=value;}get{returnorderid;}}

///<summary>///留言內(nèi)容

///</summary>publicstringContent{set{content=value;}get{returncontent;}}///<summary>///時間(是回復(fù)則是回復(fù)時間,是發(fā)送則是發(fā)送時間)///</summary>publicDateTime?CreateDate{set{createdate=value;}get{returncreatedate;}}

///<summary>///狀態(tài)是(0代表后臺回復(fù)件,1代表會員發(fā)送件)///</summary>publicint?State{set{state=value;}get{returnstate;}}#endregionModel}}

唐風(fēng)(TF):由數(shù)據(jù)庫、唐風(fēng)網(wǎng)頁和唐風(fēng)公用3個名字空間組成。共有類29個。主要完成網(wǎng)站的核心系統(tǒng)。數(shù)據(jù)庫(DataBase):數(shù)據(jù)庫名字空間有3個類,它們與唐風(fēng)網(wǎng)頁和唐風(fēng)公用的調(diào)用結(jié)構(gòu)如圖10.10所示。其功能如下:唐風(fēng)網(wǎng)頁、唐風(fēng)公用、數(shù)據(jù)庫

唐風(fēng)網(wǎng)頁唐風(fēng)公用數(shù)據(jù)庫網(wǎng)頁數(shù)據(jù)類(DataByPage):將一個網(wǎng)頁的數(shù)據(jù)用一個類來表示。一個網(wǎng)頁是由頁面和數(shù)據(jù)組成,網(wǎng)頁數(shù)據(jù)類就是一個網(wǎng)頁的數(shù)據(jù)集合。有些數(shù)據(jù)是存在數(shù)據(jù)庫中的,通過該類可以將數(shù)據(jù)從數(shù)據(jù)庫中取到并顯示到頁面上,在運行過程中,它需要調(diào)用其它名字空間、數(shù)據(jù)助手和服務(wù)助手類。調(diào)用關(guān)系如圖10.11所示。

唐風(fēng)網(wǎng)頁唐風(fēng)公用網(wǎng)頁數(shù)據(jù)類服務(wù)助手類數(shù)據(jù)助手類服務(wù)助手類(SQLServerHelper):利用配置文件取到連接信息,利用連接信息、存儲過程和數(shù)據(jù)表生成查詢命令。利用事務(wù)、命令和參數(shù)執(zhí)行查詢語句,獲得查詢結(jié)果數(shù)據(jù)。數(shù)據(jù)助手類(DataHelper):利用數(shù)據(jù)庫的SysObjects,SysColumns,Systype和表名取到表的字段名、類型、長度等表結(jié)構(gòu)數(shù)據(jù)。利用SQL語句和參數(shù)取到表的數(shù)據(jù)集。唐風(fēng)網(wǎng)頁(WebPage):由8個類組成,它們分別為:主頁類(BasePage):加風(fēng)格(樣式)表和展示主頁的錯誤和內(nèi)容。數(shù)據(jù)表類(DataTable):建立一張數(shù)據(jù)表(數(shù)據(jù)庫中表的對應(yīng)表)和獲得數(shù)據(jù)表。數(shù)據(jù)視圖類(DataView):獲得數(shù)據(jù)視圖。頁請求類(PageRequest):獲得主頁的表(Form)和查詢(Query)信息。腳本類(Script):生成javascript語句,這些語句的作用是把信息顯示給用戶并執(zhí)行正確的轉(zhuǎn)移操作命令。表類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論