97超级碰碰碰久久久_精品成年人在线观看_精品国内女人视频免费观_福利一区二区久久

軟件技術(shù)方案設(shè)計原則

時間:2022-07-03 07:11:43 輔助設(shè)計與工程計算 我要投稿
  • 相關(guān)推薦

軟件技術(shù)方案設(shè)計原則

  軟件開發(fā)是一項高強度的腦力勞動過程,到目前為止尚沒有辦法使軟件開發(fā)完全機械化,只能靠人腦去設(shè)計,也無法保證一個軟件完全沒有錯誤。同硬件產(chǎn)品相比,一方面是同功能的軟件產(chǎn)品不再需要一個生產(chǎn)過程,只需要拷貝就行了,而硬件產(chǎn)品卻需要重復(fù)生產(chǎn);另一方面,軟件產(chǎn)品功能需求的變化遠比硬件產(chǎn)品多。這就造成軟件產(chǎn)品和硬件產(chǎn)品在成型之后面臨的問題是不同的,軟件產(chǎn)品主要是應(yīng)付用戶功能需求的變化和擴展,硬件產(chǎn)品主要著眼于如何大規(guī)模地生產(chǎn)。硬件產(chǎn)品的大規(guī)模生產(chǎn)可以交給機器去執(zhí)行,而軟件產(chǎn)品的需求變化還是要靠人腦去完成。以下是軟件技術(shù)方案設(shè)計原則,歡迎閱讀。

軟件技術(shù)方案設(shè)計原則

  如何快速開發(fā)出符合用戶功能需求的軟件,如何保證開發(fā)出的軟件盡可能少地出現(xiàn)錯誤,如何使開發(fā)出的軟件能夠容易地適應(yīng)用戶功能需求的變化和擴展,是所有軟件開發(fā)人員追求的目標(biāo);我想,也正是為了實現(xiàn)上述目標(biāo),才有了軟件設(shè)計原則和設(shè)計模式。

  軟件開發(fā)是起始于面向過程的,為什么會這樣呢?我想是因為面向過程地解決問題更直接,軟件本身就是一個解決問題的過程;面向過程的最大問題就是不容易把問題進行分解,再大的問題都要在一個過程里面解決,從第一步直到最后一步;最多是把一個大過程分解成幾個順序執(zhí)行的小過程,很考驗人的邏輯推理能力,開發(fā)出的軟件不容易維護、重用和擴展。面象對象的方法沒那么直接,需要有一個抽象的過程,要把問題抽象成一個個對象,每個對象解決一個小問題,不同對象的組合就可解決不同的大問題;而且把對象跟日常的事物聯(lián)系起來,產(chǎn)生了屬性、事件、方法這樣的概念,增加了對象的直觀性。

  設(shè)計原則和設(shè)計模式都是針對面向?qū)ο蟮脑O(shè)計方法而提出來的,如果在軟件開發(fā)中還完全采用面向過程的方法,是無所謂設(shè)計原則和設(shè)計模式的。在軟件開發(fā)中,面向過程是起步,是基礎(chǔ),沒什么好研究的了;面向?qū)ο蟛攀巧钊耄峭醯,需要不斷地去總結(jié)方法;下面的軟件設(shè)計都是指面向?qū)ο蟮脑O(shè)計方法。

  根據(jù)前人總結(jié)的經(jīng)驗,在軟件開發(fā)中,遵循一定的設(shè)計原則,靈活地采用一些設(shè)計模式,可以提高軟件的易維護性、可擴展性以及重用的機率。關(guān)于這方面最權(quán)威的著作恐怕就是Robert C. Martin寫的敏捷軟件開發(fā)一書了;關(guān)于這本書,個人閱讀的理解如下:

  一、設(shè)計原則,該書提出了如下設(shè)計原則:

  1、單一職責(zé)原則(SRP):一個類只實現(xiàn)一個功能;換一種說法,一個類只能有一個引起它變化的原因;在軟件工程中有一個要求,叫做高內(nèi)聚;一個類只實現(xiàn)一個功能,無凝內(nèi)聚度是最高的了;這一原則可以使一個類更好地被重用;當(dāng)然,“一個功能”是相對的,在某種情況下,MODEM功能是一個單一功能,而在另一種情況下,可能就要把MODEM功能再分解成多個小功能;

  2、開放封閉原則(OCP):開放是指一個類能夠擴展功能,封閉是指這個類對于功能修改是封閉的,也就是說不能修改其已有的代碼和功能;要實現(xiàn)這一目標(biāo),關(guān)鍵是抽象;在客戶類中只使用抽象基類,在應(yīng)用中子類繼承基類,并按實際需要擴展基類的功能;按更通俗的說法就是:接口不能改變,功能可以擴展;

  3、子類替換原則(LSP):就是一個子類在任何情況下,都能替換掉它的基類;這是面向?qū)ο笤O(shè)計方法中實現(xiàn)繼承和多態(tài)必須遵循的一條基本原則,顯然也是開放封閉原則能夠?qū)崿F(xiàn)的基礎(chǔ);如何實現(xiàn)這一原則呢?那就是子類必須要有比基類相同或更弱的前置條件,相同或更強的后置條件;前置條件就是調(diào)用一個方法之前必須滿足的條件,后置條件就是一個方法執(zhí)行之滿足的條件;為了更清楚地說明這一個問題,見下面的函數(shù)表達式:

  Y = F(X);

  F是一個函數(shù),X是一個整型的輸入?yún)?shù),Y是一個整型的返回值,如果F要求X>0,返回值Y>1,則X>0和Y>1就分別是F的前置條件和后置條件;如果F是基類A中的一個函數(shù),B是A的一個子類,并擴展了F的功能,則B類中F的前置條件必須跟A類中的相同或更弱,也就B類中的F必須至少能接受X>0,如果能同時接收X<=0的條件更好,但不能要求X>1,這是一個X>0更強的條件;B類中的F必須保證返回值Y>1,當(dāng)然如果能保證Y>10更好,但不能使返回值Y<=1,這樣就不滿足A類中F返回值Y>1的條件;不滿足子類替換原則最直接的后果就是使應(yīng)用程序產(chǎn)生BUG;必須說明的是,在實際中是很難完全遵循子類替換原則的,必須作合理的假設(shè),在這個假設(shè)的前提下遵循子類替換原則,這就是所謂契約設(shè)計;

  4、依賴倒置原則(DIP):就是上層模塊不能依賴于下層模塊,兩者都應(yīng)該依賴抽象;抽象不能依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象;對這一原則要靈活看待,因為這一原則和當(dāng)前開發(fā)中常用組件開發(fā)方式看起來是相矛盾的;首先明確定義一下上層模塊和下層模塊,所謂上層模塊是調(diào)用別人的模塊,也可稱之為客戶模塊,下層模塊是被別人調(diào)用的模塊,也可稱之為服務(wù)模塊;顯然這是一個相對的概念,因為一個模塊很可能同時即調(diào)用別的模塊,又被另外的模塊調(diào)用;依賴倒置原則告訴我們客戶模塊和服務(wù)模塊不能互相依賴,而只能依賴于一個抽象的基類;另外這個抽象基類的接口是由客戶模塊決定,而不是由服務(wù)模塊決定;也就是說客戶模塊需要什么,服務(wù)模塊就提供什么,而不是服務(wù)模塊提供什么,客戶模塊就使用什么;這頗有點當(dāng)前企業(yè)信奉的一個原則:客戶就是上帝,客戶需要什么,我們就提供什么;而我們當(dāng)前常用的組件編程中,每一個組件都是一個被別人調(diào)用的具體類,顯然是屬于細(xì)節(jié)和服務(wù)模塊,我們調(diào)用組件,實際上就依賴了這些組件的模塊;根據(jù)依賴倒置原則是不是就不能調(diào)用這些組件呢?當(dāng)然不能這么呆板,在設(shè)計中還有另一條原則,穩(wěn)定依賴是沒有害處的;說到底,這些組件也是根據(jù)客戶需求制定出來的,只不過是已經(jīng)固化了的需求;而且這些組件經(jīng)過了嚴(yán)密測試,是穩(wěn)定的,依賴它們沒有害處;依賴倒置原則是針對我們自己的設(shè)計來說的;當(dāng)然,如果我們自己設(shè)計的某一個服務(wù)類經(jīng)過了嚴(yán)格的測試和大量的使用,都已經(jīng)驗證沒有問題,也可以作為一個通用的組件,別人可以調(diào)用它,依賴它,沒有問題;

  5、接口隔離原則(ISP):這一原則好象是單一職責(zé)原則的升級版,接口隔離原則強調(diào)的是當(dāng)一個服務(wù)類需要被即有共同功能需求又有不同功能需求的客戶類使用時,不能在服務(wù)類中加進它的客戶不需要的方法,比如在服務(wù)類A的客戶中, B類客戶需要F方法,而C類客戶則不需要F方法,這時不能簡單地把F方法加到服務(wù)類A中以滿足B類客戶的需求,而應(yīng)分離接口;比如另設(shè)計一個服務(wù)類D,其中包含F(xiàn)方法,并把共用的功能委托給A實現(xiàn),這樣B客戶可以使用D,而C客戶繼續(xù)使用A;對這一原則我有所保留的是:如果F方法對C類沒有影響,直接加到A類中也無防,而且這種情況是很普遍;

  6、共同封閉原則:這是針對包的;一個包對應(yīng)用一個程序文件,包含一到多個類,這些類具有共同的封閉性,要么是都不能修改,要么是只能由同一原因引起修改;

  7、共同重用原則:也是針對包的;不同類的通用性也是不一樣的,通用性最高的就是在所有項目中都可使用,比如我們用到的集成開發(fā)工具中的組件;有些類可能包含些行業(yè)特征,只能這一行業(yè)類的軟件中使用,有些類包含了某一個項目的特征,就可能在該項目中使用;但是一個包中的所有類的通用性都應(yīng)該是一樣的,這樣才能保證包的重用度最大化;

  二、設(shè)計模式,該書列出了以下常用的設(shè)計模式;

  1、策略模式(STRATEGY):在一個擁有通用算法的具體類中,把一些調(diào)用的方法委托給一個接口類實現(xiàn),通過接口的不同實現(xiàn),擴展不同的功能;策略模式能夠重用通用具體類,又易于擴展功能;

  2、工廠模式(FACTORY):在一個工廠類中,傳入不同的參數(shù),可生成不同的類(相同的接口,不同的實現(xiàn));工廠模式易于擴展功能;

  3、封裝模式(FAADE):對一個具有復(fù)雜接口的類(或API函數(shù))進行封裝,并提供幾個簡單的接口供外部調(diào)用;封裝模式可以隔離復(fù)雜的接口,并使其使用變得簡單;

  4、命令模式(COMMAND):上層模塊要操作一組COMMAND對象,這些COMMAND對象都具有同樣的方法(不同的實現(xiàn)),上層模塊在操作COMMAND對象時,只需要調(diào)用它們的方法,而不用關(guān)心方法的實現(xiàn);在某些情況下,這種模式會極大地簡化系統(tǒng);

  5、組合模式(COMPOSITE):當(dāng)A調(diào)用B,一對一的關(guān)系,需要改變?yōu)锳調(diào)用多個B(或B的子類對象)時,不更改A的代碼(比如在A中創(chuàng)建一個B或B的子類對象的列表,再依次從列表中取出對象調(diào)用),而是從B繼續(xù)一個子類C,在C類中創(chuàng)建B或B的子類對象的列表,重寫C類中相應(yīng)的方法為依次調(diào)用列表中對象的方法,從而用A和C一對一的關(guān)系代替A和B之間一對多的關(guān)系,并保持A的代碼不用更改;

  6、觀察者模式(OBSERVER):在被觀察者中提供注冊接口(Register)用于注冊觀察者,所有注冊的觀察者都放入一個列表中,在觀察者中提供觀察接口(Update),用于接收被觀察者發(fā)出的通知;當(dāng)被觀察者發(fā)生變化時,依次調(diào)用列表中的觀察者的觀察接口(Update),觀察者在觀察接口(Update)中,對感興趣的被觀察者變化進行處理;

  7、代理模式(PROXY):主要用于代理數(shù)據(jù)庫操作,可以實現(xiàn)數(shù)據(jù)庫操作和業(yè)務(wù)操作的代碼分離;實現(xiàn)模式如下:

  應(yīng)用程序調(diào)用一個接口A,B和C都實現(xiàn)A中的所有接口,其中B是知曉數(shù)據(jù)庫的代現(xiàn),利用一個數(shù)據(jù)庫類D進行數(shù)據(jù)庫操作,然后委托相應(yīng)的方法給C;代理模式使用不多,主要是在B類中把方法再委托給C,在大多數(shù)情況下都沒有必要;

  8、適配器模式(ADAPTER):在一個穩(wěn)定的架構(gòu)中,增加一個外部組件,但該組件的接口不符合架構(gòu)的規(guī)范,這時就可創(chuàng)建一個適配器類對外部組件進行封裝,適配器的接口符合架構(gòu)的規(guī)范(這樣才能納入架構(gòu)),相應(yīng)的方法委托給外部組件實現(xiàn);這樣就可把外部組件納入到已有的架構(gòu)中;另外,也可能是需要提供一個具有不同接口的組件給另外的客戶端使用,同時又要把該組合件的功能納入到已有的架構(gòu)中,通過一個適配器把組件納入架構(gòu),另外的客戶端直接使用組件;

  最后說明:使用設(shè)計模式是有代價的,可能需要增加新的類,編寫額外的代碼,增加復(fù)雜度;優(yōu)勢就是,可以使系統(tǒng)更適應(yīng)于功能需求的變化,包括功能修改和擴展,隔離變化等;可以提高代碼的重用率;所以對于設(shè)計模式,不能生搬硬套,而應(yīng)是順勢而為。


【軟件技術(shù)方案設(shè)計原則】相關(guān)文章:

技術(shù)方案設(shè)計原則04-25

軟件技術(shù)專業(yè)自我評價07-05

選股票的原則07-04

MBA的面試原則07-01

股票成交原則07-02

股票的成交原則07-02

春分養(yǎng)生原則07-12

立冬養(yǎng)生原則07-05

面試的原則解析07-13

堅持HR的原則07-09