關於軟件工程的一些基本概念

一直對軟件工程中的很多概念都混淆不清,因此查找了相關資料,對很多概念進行了總結,現在腦子終於清楚了!

1.軟件生命週期(SDLC,Software Devlopment Life Cycle)

        軟件從孕育、誕生、成長、成熟、衰亡等等段稱爲軟件生命週期。

        早在在20世紀70/80年代起系統開發的生命週期以結構化的方法具體分成了六個階段:問題的定義及規劃、需求分析、軟件設計、程序編碼、軟件測試、運行維護。

       (1)問題的定義及規劃:開發方調研用戶需求及用戶環境,開發方和需求方論證項目的技術、經濟、市場等可行性並制定項目初步計劃。

       (2)需求分析:(核心是需求總是在變化的)開發方確定系統的運行環境、建立邏輯模型、確定系統的功能和性能要求。

       (3)軟件設計:1)概要設計:建立系統總體結構、劃分功能模塊、定義各個功能模塊的接口,制定測試計劃。

                              2)詳細設計:設計各個模塊的具體實現算法,確定各個模塊間的詳細接口,制定測試方案。

      (4)程序編碼:編寫程序源代碼、進行模塊測試和調試,編寫用戶手冊。

      (5)軟件測試:集成測試、編寫測試報告

     (6)實現和運轉:對修改進行配置管理,記錄修改記錄和故障報告。

        而隨着面向對象方法和統一軟件開發過程(RUP)方法論的提出,出現統一過程的生命週期,在統一過程中重複一些列組成系統生命週期的循環,每次循環都可以向用戶提供一個產品版本作爲終結。每次迭代都包括四個階段:初始、細化、構造和移交。下文有介紹。

2.軟件開發模型(Software Development Model)

        軟件開發模型是軟件開發全過程、軟件開發活動以及他們之間關係的結構框架。它是一種策略,這種策略是由軟件工程師在具體的實踐工程活動當中設計並提煉出來,能夠覆蓋軟件生命週期的基本階段,確定設計的方法、過程及工具。

        軟件開發模型也成軟件生命週期模型(Life Cycle Model),典型的軟件開發模型有:大爆炸模型、邊寫邊改模型、瀑布模型、快速原型模型、螺旋模型、敏捷開發模型。以下簡單介紹幾種:

(1)瀑布模型(Waterfall Model)

        瀑布模型的軟件開發過程與軟件生命週期是一致的並且它是由文檔驅動,兩相鄰階段之間存在因果關係,需要對階段性的產品進行審批。瀑布模型假定用戶的需求是不變的,因此缺乏靈活性。

      

 

(2).快速原型模型(Rapid Prototype)

        快速原型模型在功能上等價於產品的一個子集。根據客戶的需要在很短的時間內解決用戶最迫切的需要,此時只是部分功能的實現,快速原型模型最重要的目的是確定用戶真正的需求並支持需求的動態變化。一般不會單獨使用,而和瀑布模型或螺旋模型一起使用。

(3).螺旋模型

        螺旋模型是瀑布模型和快速原型模型的有機結合,它是由風險驅動的,它強調了其他模型所忽略的風險分析,適合較大的系統,但是缺乏對風險的評估。

(4).迭代模型

        迭代模型是統一軟件開發過程(RUP,Rational Unified Process)推薦的軟件開發模型。迭代模型指在進行較大規模的項目任務時,將迭代開發分爲若干次,每次迭代都要從項目的管理及計劃、分析、設計、實現到運作整個過程。如圖,縱向就是每次迭代,而橫向就是每次迭代要經過的階段。

(5).敏捷開發模型

        敏捷開發模型是一種以人爲核心、迭代、循序漸進的開發框架。在敏捷開發中,軟件項目的構建被切分成多個子項目,各個子項目的成功都經過測試,具備集成和可運行的特徵。

        在上文介紹的瀑布模型、快速原型模型、螺旋模型、迭代模型等軟件開發模型中可以看出,在軟件工程實際運用中,只採用單一一種模型顯然不能適應項目負責的需求變化,採用各種模型組合開發的形式在實際運用中較爲廣泛,而敏捷開發模型是多種軟件開發項目管理方法的集合,其中包括了極限編程(XP)、迭代增量化模式(Scrum)等十幾種軟件開發模型。

3.軟件生命週期與軟件開發模型的關係

        從上文對軟件生命週期和軟件開發模型的介紹,可以總結出軟件生命週期是一定的,而軟件開發模型是在軟件生命週期中如何進行軟件開發的一種策略,它是由軟件工程師在實際的實踐工作中總結和提煉出來的一種能夠覆蓋軟件生命週期的框架。在軟件生命週期內可以選擇多個軟件開發模型來對軟件進行開發。

4.統一軟件開發過程(RUP,Rational Unified Process)

        統一軟件開發過程是一個面向對象且基於網絡的和UML建模的程序開發方法論。

        統一軟件開發過程(RUP)是一個二維的,橫向是時間組織即軟件的生命週期,在橫向利用軟件開發模型中的迭代模型進行初始、細化、構造及交付的迭代;而在縱向是內容組織,及每次迭代都要完成同樣的工作流,只是這些工作流在每次迭代的側重點不一樣。同樣,每個工作流在軟件生命週期的側重點也不一樣。 

      (1)Rup中的軟件生命週期在時間上分解爲四個階段,分別是:初始化階段(Inception)、細化階段(Elaboration)、構造階段(Construction)和交付階段(Transition)。每個階段結束於一個主要的里程碑(Major Milestone);每個階段本質上是兩個里程碑之間的時間跨度。在每個階段結尾要進行評估,只有評估通過才能進入下一個階段。

       1) 初始階段:目標是爲系統建立商業案例並確定項目邊界。初始階段結束時的第一個重要里程碑:生命週期目標(Lifecycle Objective)里程碑。這個里程碑用來評價項目基本的生存能力。

        2) 細化階段:目標是分析問題領域,建立健全的體系結構基礎、編制項目計劃、淘汰項目中最高風險的元素。爲了達到此目的,必須在理解整個系統的基礎上,對體系結構作出決策,包括範圍、主要功能、性能等非功能需求。同時爲項目監理支持環境,包括開發案例、創建模板、準備工具等。細化接管介紹時的第二個重要的里程碑:生命週期結構(Lifecycle Architecture)里程碑。生命週期結構里程碑爲系統的結構建立了管理基準並使項目小組能夠在構建階段中進行衡量。此刻,要檢驗詳細的系統目標和範圍、結構的選擇以及主要風險的解決方案。

        3) 構造階段:是一個製作過程,重點放在管理資源及控制運作以優化成本、進度和質量。構建階段結束時第三個重要的里程碑:初始功能(Initial Operational)里程碑。初始化里程碑決定了產品是否可以在測試環境中進行部署,也稱爲beta版。

        4) 交付階段:爲發佈準備產品測試,基於用戶反饋進行調整。在交付階段的重點是第四個里程碑:產品發佈(Product Release)里程碑

        (2)統一軟件開發過程的9核心工作流,分爲6個核心工作流(Core Process Workflows)和3個核心支持工作流(Core Supporting Workflows)。這些工作流在整個軟件生命週期中一次又一次被訪問。9個核心工作流在項目中輪番被使用,在每一次迭代中可以不同的重點和強調重複。

        1)商業建模(Bussiness Modeling):定義組織的過程,角色和責任來確定用例模型。

        2)需求(Requirements):描述系統應該做什麼,用例描述。

        3)分析和設計(Analysis & Design):將需求轉化爲未開系統的設計,產生一個設計模型和一個分析模型。設計模型是源代碼的抽象,由設計類和一些描述組成。可有領域類圖、設計類圖、順序圖等UML建模語言來描述。

        4)實現(Implementation)

        5)測試(Testing)

        6)部署(Deployment)

        7)配置和變更管理

        8)項目部案例(Project Management)

        9)環境(Environment)

5.結構化的軟件開發方法

        軟件工程的方法是基於軟件危機的問題提出來的,最廣泛使用的模型是結構化生命週期模型。它將軟件開發分爲幾個不同的階段:需求分析、系統設計、系統實現、系統測試、試運行及維護等。它的目的是模仿工程中的一些方法,將軟件開發規範化,每階段形成一定格式的文檔,下一階段以上一階段的文檔爲原料。這種方法可以控制軟件開發的進度,合理分配人力和資金等以實現軟件的可靠性和維護性等。

        結構化分析與設計方法是以數據流圖爲工具,實現對問題空間即需求的描述。它主要以數據流、數據變換爲考慮對象,從這個角度來描述整個系統的狀況。通過數據流圖爲藍本對系統的功能加以分解,一直到最小的功能元素單元,然後開發人員據此進行程序設計。

       結構化分析與設計方法強調的是開發方法的結構和理性,它的本質是功能分解,從代表目標系統整體功能的單個處理着手,自頂向下不斷地把複雜的處理分解爲子處理,這樣一層一層地分解下去,直到僅剩下的若干個容易實現的子處理爲止。當所分解的子處理十分簡單時,就可以寫出各個最底層處理的處理描述。但隨着軟件工程的發展,接過話分析與設計方法表現出以下弊端:

        (1)結構化分析與設計方法是圍繞現實處理功能的過程來構造系統的。然而,用戶需要的變化大部分是針對功能的,因此,用結構化方法設計出的系統結構常常不穩定。

        (2)結構化分析與設計方法定了了目標系統的邊界,且開發系統的結構依賴於對系統邊界的定義,因此,很難把系統擴展到新的邊界,系統難修改和擴充。

        (3)結構化分析與設計方法設計系統時,幾乎每開發一個新的軟件系統都要針對具體系統做大量重複和複雜的工作,代碼重用性差。

6.面向對象的軟件開發方法(Object-Oriented Method)

       面向對象方法是一種把面向對象的思想應用於軟件開發過程中,指導軟件開發活動的系統方法。

        面向對象開發方法是基於所研究的問題,對問題空間進行自然分割,識別其中的對象及其相關關係,以對象爲基礎對軟件進行處理的開發方法。它按照人類自己認識客觀世界的一般方法和一般思維去分析和解決問題,是人類認識過程的計算機模擬。

        面向對象方法(OO,Object Orientation)的基本概念

        (1)對象(Object):描述客觀事物的一個實體,是構成系統的基本單元,它由一組屬性和一組服務(操作)組成。

        (2)類(Class):是一組具有相同屬性和相同操作的對象的集合。

        (3)實例(Instance):一個具體的對象就是類的一個實例。

        (4)消息(Message):對象之間在交互的過程中傳送的通信信息。一般由三部分組成:接收消息的對象、消息名及實際變元。

        (5)封裝(Encapsulation):是面向對象方法的一個重要原則。封裝就是把對象的屬性和操作結合在一起,構成一個獨立的對象,它的內部信息對外界是隱藏的,不允許外界直接存取對象的屬性,而自能通過有限的接口與對象發生聯繫。對於對象的外界而言,只需要知道對象所表現的外部行爲,不必瞭解對象行爲的內部實現細節。即統一外部接口和不公開內部實現。

        (6)繼承(Inheritance):子類(派生類)可以自動擁有父類(超類)的全部屬性與服務。目的是爲了提高程序的可重用行。

        (7)多態(Polymorphism):在積累定義的屬性和服務被其子類繼承後,可以具有不同的數據類型或表現出不同的行爲。

        (8)抽象(Abstraction):從衆多的事物中抽取共同的、本質性的特徵,而捨棄其非本質的特徵。

 

面向對象方法的特點:

        (1)封裝性:面向對象方法中,程序和數據是封裝在一起的,對象作爲一個實體,其操作隱藏在方法中,其狀態由對象的“屬性”來描述,並且只能通過對象中的“方法”來改變,從外界無從得知。面向對象方法的創始人Codd和YouMn認爲,面向對象就是“對象+屬性+方法”

        (2)抽象性:面向對象方法中,把從具有共同特性的實體中抽象出事物本質的特徵和概念,成爲“類(Class)”,對象是類的一個實例。類中封裝了對象共有的屬性和方法,通過實例化一個類創建的對象,自動具有類中規定的屬性和方法。

        (3)繼承性:是類具有的特性,類可以派生出子類,子類自動繼承父類的屬性和方法。這樣在定義子類時,只需說明它不同於父類的特性,從而可以大大提高軟件的可重用性。

        (4)動態連接性:對象間的聯繫是通過對象間的消息傳遞動態建立的。

 

面向對象開發方法的基本思想:

        (1)客觀世界是由對象組成的

        (2)對象由屬性和操作組成

        (3)對象可按其屬性進行分類

        (4)對象之間的聯繫通過傳遞消息來實現

        (5)對象具有封裝性、繼承性和多態性。       

 

面向對象方法的開發過程:

        (1)面向對象的分析(OOA)

              1)問題領域分析(標識對象)

              分析領域的業務範圍、業務規則和業務處理過程,確定系統的責任、範圍和邊界,確定系統的需求、在分析中需要着重對系統與外部的用戶和其他系統的交互進行分析。確定交互的內容、步驟和順序。

              2)發現和定義對象、類(標識結構)

              識別對象和類,確定它們的內部特徵:屬性與服務操作。這是一個從現實世界到概念模型的抽象過程,是認識從特殊到一般的上升過程。

              3)識別對象的外部聯繫(標識主題)

              在識別和定義對象與類的過程中,需要同時識別對象與對象、類與類之間的各種外部聯繫,包括結構性的靜態聯繫和行爲性的動態聯繫,包括特殊與一般、整體與部分、實例連接、消息鏈接等聯繫。

              4)建立系統的靜態結構模型(定義屬性)

               根據系統的靜態結構,建立系統的靜態結構模型,並且把它們用圖形和文字說明表達出來。這主要是在前面對於類和對象、及其聯繫的分析基礎上,繪製對象類圖和對象圖、系統與子系統結構圖等,編制相應的說明文檔。

              5)建立系統的動態行爲模型(定義方法)

              分析系統的行爲,建立系統的動態行爲模型,並且把它們用圖形和文字說明表達出來,如繪製交互圖、狀態圖等,編制相應的說明文檔。

        (2)面向對象的設計(OOD)

             1)設計對象與類

              在OOA的對象模型的基礎上具體設計對象與類的屬性、服務操作(設計數據結構和操作的實現算法),設計對象與類的各種尾部聯繫的實現結構,設計消息與事件的內容、格式等。

             2)設計系統結構

             一個複雜的軟件系統由若干子系統組成,一個子系統由若干軟件組件組成。設計系統結構的主要任務是設計組件與子系統,以及他們的相互的靜態和動態關係,一般應用系統可由四個組成部分:問題域(業務層)、人機界面(界面層)、數據管理(數據層)、任務管理(邏輯層)。

             3)設計問題域子系統

              問題域子系統複雜應用系統的業務服務,即確定系統的主要業務。

             4)設計人機交互子系統

             人機交互子系統提供系統用戶界面,是表現層的部分。其中主要任務是設計用戶界面。設計詳細交互過程等。

             5)設計數據管理子系統

             數據管理子系統負責數據的管理,包括數據的錄入、修改、檢索、存儲,以及對永久性數據的訪問控制等。

             6)設計任務管理子系統

              任務管理子系統主要負責協調和管理進程。

             7)設計優化,提高系統的性能

              系統設計的結果需要優化,儘可能的提高系統的性能和質量。比如說優化查詢、簡化代碼等。

        (3)面向對象的編程(OOP)

        (4)面向對象的測試(OOT)

        (5)面向對象的維護(OOM)      

7.結構化方法(面向過程)和麪向對象方法的聯繫

(1)處理問題時的出發點不同

             結構化方法強調過程抽象化和模塊化,以過程爲中心;

             面向對象方法強調把問題域直接映射到對象及對象之間的接口上,用符合人們通常思維方式來處理客觀世界的問題。

(2)處理問題的基本單位和層次邏輯關係不同

             結構化方法把客觀世界的問題抽象成計算機可以處理的過程,處理問題的基本單位是能夠表達過程的功能模塊,用模塊的層次結構概括模塊或模塊間的關係和功能;

             面向對象方法是用計算機邏輯來模擬客觀世界中的物理存在,以對象的集合類作爲處理問題的基本單位,儘可能使計算機世界向客觀世界靠攏,它用類的層次結構來體現類之間的繼承和發展。

(3)數據處理方式與控制程序方式不同

              結構化方法是直接通過數據流來驅動,各個模塊程序之間存在着控制與被控制的關係;

              面向對象方法是通過用例(業務)來驅動,是以人爲本的方法,站在客戶的角度去考慮問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章