系統(tǒng)架構(gòu)設(shè)計(jì)師學(xué)習(xí)筆記 第八章 系統(tǒng)分析與設(shè)計(jì)方法

第八章 系統(tǒng)分析與設(shè)計(jì)方法

8.1 定義問題與歸結(jié)模型

定義問題的過程包括:理解真實(shí)世界中的問題和用戶的額需要,并提出滿足這些需要的解決方案的過程。

8.1.1 問題分析

目標(biāo)就是在開發(fā)之前對要解決的問題有一個更透徹的理解。為了達(dá)到這一目標(biāo),通常需要經(jīng)過在問題定義上達(dá)成共識,理解問題的本質(zhì),確定項(xiàng)目干系人和用戶,定義系統(tǒng)的邊界和確定系統(tǒng)實(shí)現(xiàn)的約束這五個步驟。

1. 在問題定義上達(dá)成共識

應(yīng)當(dāng)將問題用標(biāo)準(zhǔn)的格式寫出來,根據(jù)UP的建議,應(yīng)當(dāng)包括以下幾個方面的要素。

  • 問題概述:用簡短的幾句話,將所理解的問題本質(zhì)描述出來;
  • 影響:說明該問題將會對哪些項(xiàng)目干系人(風(fēng)險(xiǎn)承擔(dān)者)產(chǎn)生影響;
  • 結(jié)果:確定問題對項(xiàng)目干系人和商業(yè)活動或產(chǎn)生什么樣的影響;
  • 優(yōu)點(diǎn):概要性的提出解決方案,并列舉出該解決方案的主要優(yōu)點(diǎn)。

在問題定義上達(dá)成共識,能夠有效的將開發(fā)團(tuán)隊(duì)的理解與用戶的需求達(dá)成一致,這樣就能夠使得整個系統(tǒng)的開發(fā)沿著合理的方向發(fā)展。

2. 理解問題的本質(zhì)

一種技術(shù)是“根本原因”分析,這是一種提示問題或其表象的根本原因的系統(tǒng)化方法。在實(shí)際的應(yīng)用中,長使用因果魚骨圖和累托圖兩種方法。

因果魚骨圖

是一種有效的探尋問題根源的技術(shù),它通過直觀的圖形找出問題或現(xiàn)象的所有潛在原因,從而追蹤出問題的根源。提供了一種運(yùn)用集體智慧解決問題的方法。在使用時,通常按照以下步驟進(jìn)行。

  • 將問題簡明扼要的寫在右邊的方框里;
  • 確定問題潛在原因的主要類別,把它們連到魚的脊骨上;
  • 用頭腦風(fēng)暴方法尋找原因并歸類。
帕累托法

是采用釋放圖的形式,根據(jù)問題的相對頻率或大小從高往低將序排列,幫助設(shè)計(jì)師將精力集中在重要的問題上。它為80%的問題找到關(guān)鍵的20%的 原因,可以一目了然的顯示出各個問題的相對重要程度,有助于預(yù)防在解決了一些問題后,卻使另外一些問題變得更糟的現(xiàn)象發(fā)生。在使用時,通常按照以下步驟進(jìn)行:

  • 明確問題:也就是前面達(dá)成共識的問題定義
  • 找出問題的各種可能原因
  • 選擇評價(jià)標(biāo)準(zhǔn)和考察期限:最常用的評價(jià)標(biāo)準(zhǔn)包括頻率(占總原因的百分比)和費(fèi)用(產(chǎn)生的影響),而考察的期限則應(yīng)具有相應(yīng)問題的代表性,并不是越長越好。
  • 收集各種原因發(fā)生的頻率及費(fèi)用數(shù)據(jù);
  • 將原因按照發(fā)生的頻率或費(fèi)用從大到小排列起來;
  • 將原因排在橫軸上,頻率或費(fèi)用排列在縱軸上。

3. 確定項(xiàng)目干系人和用戶

要想有效的解決問題,必須了解用戶和其他相關(guān)的項(xiàng)目干系人(任何將從新系統(tǒng)或應(yīng)用的實(shí)現(xiàn)中受到實(shí)質(zhì)性影響的人)的需要。

4. 定義系統(tǒng)的邊界

系統(tǒng)的邊界是指解決方案系統(tǒng)和現(xiàn)實(shí)世界之間的邊界。在系統(tǒng)邊界中,信息以輸入和輸出的形式流入系統(tǒng)并由系統(tǒng)流向系統(tǒng)外的用戶,所有和系統(tǒng)的交互都是通過系統(tǒng)和外部的接口進(jìn)行的。在定義系統(tǒng)邊界時,將世界分為兩個部分:系統(tǒng)及與系統(tǒng)進(jìn)行交互的事物。

要描述系統(tǒng)的邊界有兩種方法:一種是結(jié)構(gòu)化分析中的“上下文范圍圖”,另一種則是面向?qū)ο蠓治鲋械摹坝美P汀薄?/p>

  1. 上下文范圍圖。也就是數(shù)據(jù)流圖中的頂層圖,他是一個反映領(lǐng)域信息的模型,能夠清晰的顯示出系統(tǒng)的工作職責(zé)和相鄰系統(tǒng)的職責(zé)起止支出,從而讓讀者能夠從宏觀的層面去了解系統(tǒng)。
  2. 用例模型。通過引入?yún)⑴c者來描述“和系統(tǒng)進(jìn)行交互的事物”

然后,在根據(jù)每個參與者的功能需求,識別出代表系統(tǒng)功能的用例,從而界定系統(tǒng)的邊界。

5. 確定系統(tǒng)實(shí)現(xiàn)的約束

由于各種因素的存在,會對解決方案的選擇造成一定的限制,成這種限制為約束。每條約束都將影響到最后的解決方案的形成,甚至?xí)绊懯欠衲軌蛱岢鼋鉀Q方案。

8.1.2 問題定義

對于一個問題的完整定義,通常應(yīng)包括目標(biāo)、功能需求和非功能需求三個方面。

1. 目標(biāo)

指構(gòu)建系統(tǒng)的原因,他是最高層次的用戶需求,是業(yè)務(wù)上的需要,而功能、性能需求則必須是以某種形式對該目標(biāo)作出貢獻(xiàn)。在描述目標(biāo)時,應(yīng)該注意一下幾個方面。

  • 優(yōu)勢:目標(biāo)應(yīng)該不僅僅是解決問題,還要提供業(yè)務(wù)上的優(yōu)勢;
  • 度量:不僅要說明業(yè)務(wù)的優(yōu)勢,而且還必須提供度量這種優(yōu)勢的標(biāo)準(zhǔn);
  • 合理性:要確保完成解決方案所需的工作量少于所獲得的業(yè)務(wù)優(yōu)勢,這才是合理的解決方案;
  • 可行性:要探尋能夠滿足度量標(biāo)準(zhǔn)的解決方案;
  • 可達(dá)成性:對于組織而言,是否具備獲取該系統(tǒng)的技能,構(gòu)件完成狗是否能夠操作它。

2. 功能需求

是用來指明系統(tǒng)必須做的事情,只有這些行為的存在,才有系統(tǒng)存在的價(jià)值。功能需求是在與用戶或某個業(yè)務(wù)人員交談時,他們所描述的內(nèi)容是為了完成他們某部分的工作而必須做的事情。而在設(shè)計(jì)解決方案時,會遇到一些限制條件,這些東西也是“系統(tǒng)需求”的一部分,不過應(yīng)該以設(shè)計(jì)約束或非功能需求形式指定。

需求的二義性主要體現(xiàn)在以下幾個方面:

  1. 同名異義的詞。
  2. 代詞。

3. 非功能需求

是系統(tǒng)必備的屬性,這些屬性可以看做是一些使產(chǎn)品更有吸引力、易用、快速或可靠的特征或?qū)傩浴7枪δ苄枨蟛⒉桓淖儺a(chǎn)品的功能,它是為工作賦予特征的。功能需求是以動詞為特征的,而非功能需求則是以副詞為特征的。非功能需求主要包括以下幾種。

  1. 敏感需求:即產(chǎn)品外觀的精神實(shí)質(zhì),也就是與用戶界面的觀感相關(guān)的一組屬性。
  2. 易用性需求:也就是產(chǎn)品的易用程度,以及特殊的可用性考慮,通常包括用戶的接受率、因?yàn)橐朐摦a(chǎn)品而提高的生產(chǎn)效率、錯誤率、特殊人群的可用性等指標(biāo);
  3. 性能需求:也就是關(guān)于功能實(shí)現(xiàn)要求有多快、多可靠、多少處理量及多精確的約束。
  4. 可操作性需求:衡量產(chǎn)品的操作環(huán)境,以及對該操作環(huán)境必須考慮的問題;
  5. 可維護(hù)性和可移植性需求:期望的改變,以及完成改變允許的時間;
  6. 安全性需求:產(chǎn)品的安全保密性,通常體現(xiàn)為保密性、完整性和可獲得性;
  7. 文化和政策需求:由產(chǎn)品的開發(fā)者和使用者所帶來的特別需求;
  8. 法律需求:哪些法律和標(biāo)準(zhǔn)適用于本產(chǎn)品。

8.2 需求分析與軟件設(shè)計(jì)

8.2.1 需求分析的任務(wù)與過程

需求分析主要就是確定待開發(fā)軟件的功能、性能、數(shù)據(jù)、界面等要求。需求分析的實(shí)現(xiàn)步驟通常包括:獲取當(dāng)前系統(tǒng)的物理模型、抽象出當(dāng)前系統(tǒng)的邏輯模型、建立目標(biāo)系統(tǒng)的邏輯模型三個部分。具體來說,修分析階段可以分成4個方面:

  1. 問題識別:用于發(fā)現(xiàn)需求、描述需求,以此來預(yù)先估計(jì)以后系統(tǒng)可能達(dá)到的目標(biāo)。
  2. 分析與綜合:對問題進(jìn)行分析,然后在此基礎(chǔ)上整合出解決方案。這個步驟是經(jīng)常進(jìn)行的,常用的方法有面向數(shù)據(jù)流的結(jié)構(gòu)化分析方法,面向數(shù)據(jù)結(jié)構(gòu)的Jackson方法,面向?qū)ο蟮姆治龇椒ㄒ约坝糜诮討B(tài)模型的狀態(tài)遷移圖和Petri網(wǎng)。
  3. 編制需求分析的文檔:也就是對已經(jīng)確定的需求進(jìn)行文檔化描述,該文檔通常稱為“需求規(guī)格說明書”。
  4. 需求分析與評審:主要是對功能的正確性、完整性和清晰性,以及其它需求給予評價(jià)。

1. 需求的分類

  • 功能需求:指系統(tǒng)必須完成的,為了向它的用戶提供有用的功能,產(chǎn)品必須執(zhí)行的動作。
  • 非功能需求:指產(chǎn)品必須具備的屬性或品質(zhì),如性能、響應(yīng)時間、可靠性、容錯性、擴(kuò)展性等。
  • 設(shè)計(jì)約束:也稱為限制條件、補(bǔ)充規(guī)約。

除了三種需求之外,還有業(yè)務(wù)需求、用戶需求、系統(tǒng)需求這三個處于不同層面的概念

  • 業(yè)務(wù)需求:指反映組織結(jié)構(gòu)或客戶對系統(tǒng)、產(chǎn)品高層次的目標(biāo)需求,通常問題定義本身就是業(yè)務(wù)需求。
  • 用戶需求:指描述用戶使用產(chǎn)品必須要完成什么任務(wù),怎么完成的需求,通常是在問題定義的基礎(chǔ)上進(jìn)行用戶訪談、調(diào)查,對用戶使用的場景進(jìn)行整理,從而建立從用戶角度出發(fā)的需求。
  • 系統(tǒng)需求:是從系統(tǒng)的角度來說明軟件的需求,它包括用特性說明的功能需求、質(zhì)量屬性、肺功能需求及設(shè)計(jì)約束。

2. 需求工程

就是包括創(chuàng)建和維護(hù)系統(tǒng)需求文檔所必須的一切活動的過程,主要包括需求開發(fā)和需求管理兩大工作。

  1. 需求開發(fā):包括需求捕獲、需求分析、編寫規(guī)格說明書和需求驗(yàn)證4個階段。在這個階段需要完成確定產(chǎn)品所期望的用戶類型,獲取每種用戶類型的需求,了解實(shí)際用戶任務(wù)和目標(biāo)這些任務(wù)所支持的業(yè)務(wù)需求、分析源于用戶的信息、對需求進(jìn)行優(yōu)先級分類、將所收集的需求編寫成為軟件規(guī)格說明書和需求分析模型,對需求進(jìn)行評審等工作。
  2. 需求管理:通常包括定義需求基線、處理需求變更、需求跟蹤等方面的工作。

這兩個方面是相輔相成的,需求開發(fā)是主線,是目標(biāo);需求管理是支持,是保障。換句話說,需求開發(fā)是努力更清晰,更明確的掌握客戶對系統(tǒng)的需求;而需求管理管理則是對需求的變化進(jìn)行管理的過程。

需求分析方法

  1. 結(jié)構(gòu)化分析方法。
  2. 軟系統(tǒng)方法
  3. 面向?qū)ο蠓治龇椒?/li>
  4. 面向問題域的分析PDOA

8.2.2 如果進(jìn)行系統(tǒng)設(shè)計(jì)

優(yōu)秀的系統(tǒng)設(shè)計(jì)一般在以下幾個方面都很出色。

  1. 組件的獨(dú)立性。審視自己設(shè)計(jì)的系統(tǒng),是否做到了高內(nèi)聚、低耦合?
  2. 例外的識別和處理。
  3. 防錯和容錯。

8.2.3 軟件設(shè)計(jì)的任務(wù)與活動

軟件設(shè)計(jì)是一個把軟件需求變換成軟件表示的過程,最初這種表示只是描繪出軟件的總體框架,然后再進(jìn)一步細(xì)化,并在此框架中填入細(xì)節(jié)。

1. 軟件設(shè)計(jì)的兩個階段

  1. 概要設(shè)計(jì)。也稱為高層設(shè)計(jì),將軟件需求轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)和軟件的系統(tǒng)結(jié)構(gòu)。例如,如果采用結(jié)構(gòu)化設(shè)計(jì),則將從宏觀的角度講軟件劃分成各個組成模塊,病確定模塊的功能及模塊之間的調(diào)用關(guān)系。
  2. 詳細(xì)設(shè)計(jì)。也稱為低層設(shè)計(jì),將對結(jié)構(gòu)表示進(jìn)行細(xì)化,得到詳細(xì)的數(shù)據(jù)結(jié)構(gòu)與算法。同樣的,如果采用結(jié)構(gòu)化設(shè)計(jì),則詳細(xì)設(shè)計(jì)的任務(wù)就是為每個模塊進(jìn)行設(shè)計(jì)。

2. 主要的設(shè)計(jì)方法比較

8.3 結(jié)構(gòu)化分析與設(shè)計(jì)

8.3.1 結(jié)構(gòu)化分析

結(jié)構(gòu)化分析方法的基本思想是自頂向下逐層分解。分解和抽象是人們控制問題復(fù)雜性的兩種基本手段。將一個大問題逐層逐級分解為最底層的問題,就是分解過程。

結(jié)構(gòu)化分析與面向?qū)ο蠓治龇椒ㄖg的最大差別是:結(jié)構(gòu)化分析方法把系統(tǒng)看做一個過程的集合體,包括人完成的和電腦完成的;而面向?qū)ο蠓椒▌t把系統(tǒng)看成一個相互影響的對象集。結(jié)構(gòu)化分析方法的特點(diǎn)是利用數(shù)據(jù)流圖來幫助人們理解問題,對問題進(jìn)行分析。

結(jié)構(gòu)化分析方法一般包括以下工具:數(shù)據(jù)流圖DFD、數(shù)據(jù)字典DD、結(jié)構(gòu)化語言、判定表、判定樹。

結(jié)構(gòu)化系統(tǒng)分析方法從總體上看是一種強(qiáng)烈依賴數(shù)據(jù)流圖的自頂向下的建模方法。

1. 結(jié)構(gòu)化分析的工作步驟

  1. 研究“物質(zhì)環(huán)境”:首先,應(yīng)畫出當(dāng)前系統(tǒng)(可能是非計(jì)算機(jī)系統(tǒng),或是半計(jì)算機(jī)系統(tǒng))的數(shù)據(jù)流圖,說明系統(tǒng)的輸入、輸出數(shù)據(jù)流,說明系統(tǒng)的數(shù)據(jù)流情況,以及經(jīng)歷了哪些處理過程。這個過程可以幫助分析員有效的理解業(yè)務(wù)環(huán)境,在與用戶的充分溝通與交流中完成。
  2. 建立系統(tǒng)邏輯模型。當(dāng)物理模型建立之后,接下來的工作就是畫出相對于真實(shí)系統(tǒng)的等價(jià)邏輯數(shù)據(jù)流圖。在前一步驟建立的數(shù)據(jù)流圖的基礎(chǔ)上,將所有自然數(shù)據(jù)流都轉(zhuǎn)成等價(jià)的邏輯流。
  3. 劃清人機(jī)界限。最后,確定在系統(tǒng)邏輯模型中,哪些將采用自動化完成,哪些仍然保留手工操作。

2. 數(shù)據(jù)流圖

DFD是一種圖形化的系統(tǒng)模型,它在一張圖中展示信息系統(tǒng)的主要需求,即輸入、輸出、處理(過程)、數(shù)據(jù)存儲。DFD包括以下幾個基本元素

  • 過程:也稱為加工,一步步的執(zhí)行指令,完成輸入到輸出的轉(zhuǎn)換。
  • 外部實(shí)體:也稱為源/宿,系統(tǒng)之外的數(shù)據(jù)源或目的。
  • 數(shù)據(jù)存儲:也稱為文件,存放數(shù)據(jù)的地方,一般是以文件、數(shù)據(jù)庫等形式出現(xiàn)。
  • 數(shù)據(jù)流:從一處到另一處的數(shù)據(jù)流向,數(shù)從數(shù)據(jù)或數(shù)據(jù)到一個過程的數(shù)據(jù)流。
  • 實(shí)時連接:當(dāng)過程執(zhí)行時,外部實(shí)體與過程之間的來回通信。
  1. 數(shù)據(jù)流圖的層次。數(shù)據(jù)流圖提供一種表現(xiàn)系統(tǒng)高層和低層概念的機(jī)制,也就是先繪制一張較高層次的數(shù)據(jù)流圖,然后再次基礎(chǔ)上,對其中過程(處理)進(jìn)行分解,分解成為若干獨(dú)立的、低層次的、詳細(xì)的數(shù)據(jù)流圖,而且可以這樣逐一分解下去,知道系統(tǒng)被清晰的描述出來。
  2. Context圖。也就是系統(tǒng)上下文范圍關(guān)系圖。這是描繪系統(tǒng)最高層結(jié)構(gòu)的DFD圖。它的特點(diǎn)是:將整個待開發(fā)的系統(tǒng)表示為一個過程,將所有的外部實(shí)體和進(jìn)出系統(tǒng)的數(shù)據(jù)流都畫在一張圖中。用來描述系統(tǒng)有什么輸入、輸出數(shù)據(jù)流,與哪些外部實(shí)體直接相關(guān),可以把整個系統(tǒng)的范圍勾畫出來。
  3. 逐級分解。當(dāng)完成了Context圖的建模之后,就可以在此基礎(chǔ)上進(jìn)行進(jìn)一步的分解。
  4. 如何畫DFD。DFD的繪制是一個自頂向下、由外到里的過程,通常按照以下幾個步驟進(jìn)行。
  • 畫系統(tǒng)的輸入和輸出:就是在圖的邊緣標(biāo)出系統(tǒng)的輸入、輸出數(shù)據(jù)流。這一步其實(shí)是絕地你個研究的內(nèi)容和系統(tǒng)的范圍。在畫的時候,可以先將盡可能多的輸入、輸出畫出來,然后再刪除多余的,增加遺漏的。
  • 畫數(shù)據(jù)流圖的內(nèi)部:將系統(tǒng)的書、輸出用一系列的處理連接起來,可以從輸入數(shù)據(jù)流花香輸出數(shù)據(jù)流,也可以從中間畫出去。
  • 為每一個數(shù)據(jù)流命名:命名的好壞與數(shù)據(jù)流圖的可理解性密切相關(guān),應(yīng)避免使用空洞的名字。
  • 為加工命名:注意應(yīng)使用動賓短語。
  • 不考慮初始化也重點(diǎn),暫不考慮出錯路徑等細(xì)節(jié),不畫控制流和控制信息。

3. 細(xì)化記錄DFD部件

為了更好的描述DFD的部件,結(jié)構(gòu)化分析方法還引入了數(shù)據(jù)字典、結(jié)構(gòu)化語言及決策樹、決策表等方法。其中數(shù)據(jù)字典應(yīng)用最為廣泛。

數(shù)據(jù)字典技術(shù)是一種很實(shí)用、有效的表達(dá)數(shù)據(jù)格式的手段。他是對所有與系統(tǒng)相關(guān)的數(shù)據(jù)元素的一個有組織的列表和精確嚴(yán)格的定義。使得用戶和系統(tǒng)分析員對于輸入、輸出、存儲層粉和中間計(jì)算機(jī)有共同的理解。通常數(shù)據(jù)字典的每一個條目中包括以下信息。

  1. 名稱:數(shù)據(jù)或控制箱、數(shù)據(jù)存儲或外部實(shí)體的主要名稱,如果有別名的還應(yīng)該將別名列出來。
  2. 何處使用/如何使用
  3. 內(nèi)容描述:說明該條目的內(nèi)容組成,通常采用以下符號進(jìn)行說明
  • =:由...構(gòu)成
  • +:和,代表順序連接的關(guān)系。
  • [|]:或,代表從中選一個
  • {}*:n次重復(fù)
  • ():代表可選的數(shù)據(jù)項(xiàng)
  • *...*:表示特定限制的注釋
  1. 補(bǔ)充信息:關(guān)于數(shù)據(jù)類型、默認(rèn)值、限制等信息。

8.3.2 結(jié)構(gòu)化設(shè)計(jì)

結(jié)構(gòu)化設(shè)計(jì)包括架構(gòu)設(shè)計(jì)、接口設(shè)計(jì)、數(shù)據(jù)設(shè)計(jì)和過程設(shè)計(jì)等任務(wù)。他是一種面向數(shù)據(jù)流的設(shè)計(jì)方法,是以結(jié)構(gòu)化分析階段所產(chǎn)生的成果為基礎(chǔ),進(jìn)一步自頂向下、逐步求精和模塊化的過程。

1. 概要設(shè)計(jì)與詳細(xì)設(shè)計(jì)的主要任務(wù)

概要設(shè)計(jì)階段的主要任務(wù)是設(shè)計(jì)軟件的結(jié)構(gòu)、確定系統(tǒng)是由哪些模塊組成,以及每個模塊之間的關(guān)系。它采用結(jié)構(gòu)圖來描述程序的結(jié)構(gòu),此外還可以使用層次圖和HIPO(層次圖加輸入/處理/輸出圖)。

整個過程主要包括:復(fù)查基本系統(tǒng)模型、復(fù)查并精化數(shù)據(jù)流圖、確定數(shù)據(jù)流圖的信息流類型(包括交換流和事務(wù)流)、根據(jù)流類型分別實(shí)施變換分析或事務(wù)分析、根據(jù)軟件設(shè)計(jì)原則對得到的軟件結(jié)構(gòu)圖進(jìn)一步優(yōu)化。

而詳細(xì)設(shè)計(jì)階段的主要任務(wù)則是確定應(yīng)該如何具體的實(shí)現(xiàn)所要求的系統(tǒng),得出對目標(biāo)系統(tǒng)的精確描述。它采用自頂向下、逐步求精的設(shè)計(jì)方式和單入口單出口的控制結(jié)構(gòu)。

2. 結(jié)構(gòu)圖

結(jié)構(gòu)圖的基本成分包括模塊、調(diào)用(模塊之間的調(diào)用關(guān)系)和數(shù)據(jù)(模塊間傳遞及處理數(shù)據(jù)信息)。

結(jié)構(gòu)圖是在需求分析階段產(chǎn)生的數(shù)據(jù)流圖的基礎(chǔ)上進(jìn)行進(jìn)一步的設(shè)計(jì)。它將DFD圖中的信息流分為兩種類型。

  • 交換流:信息首先沿著輸入通路進(jìn)入系統(tǒng),并將其轉(zhuǎn)換為內(nèi)部表示,然后通過變換中心(加工)的處理,再沿著輸出轉(zhuǎn)換為外部形式離開系統(tǒng)。具有這種特性的加工流就是交換流。
  • 事務(wù)流:信息首先沿著輸入通路進(jìn)入系統(tǒng),事務(wù)中心根據(jù)輸入信息的類型在若干個動作序列(活動流)中選擇一個執(zhí)行,這種信息流稱為事務(wù)流。

3. 程序流程圖和盒圖

程序流程圖和盒圖都是用來描述程序的細(xì)節(jié)邏輯的。

程序流程圖的特點(diǎn)是簡單、直觀、易學(xué),但它的缺點(diǎn)是由于其隨意性而使得畫出來的流程圖容易成為非結(jié)構(gòu)化的流程圖。

盒圖的主要特點(diǎn)是功能域明確、無法任意轉(zhuǎn)移控制、容易確定全局?jǐn)?shù)據(jù)和局部數(shù)據(jù)的作用域、容易表示嵌套關(guān)系、可以表示模塊的層次結(jié)構(gòu)。但它的缺點(diǎn)是修改相對比較困難。

4. PAD和PDL

PAD是問題分析圖的縮寫,它符合自頂向下、逐步求精的原則,也符合結(jié)構(gòu)化程序設(shè)計(jì)的思想,最大的特點(diǎn)在于能夠很方便的轉(zhuǎn)換為程序語言的源程序代碼。

PDL這是語言描述工具的縮寫,它和高級程序語言很相似,也包括數(shù)據(jù)說明部分和過程部分,還可以帶注釋等成分,但它是不可執(zhí)行的。PDL是一種形式化語言,其控制結(jié)構(gòu)的描述是確定的,但內(nèi)部的描述語法是不確定的。PDL通常也被稱為偽碼。

8.3.3 模塊設(shè)計(jì)

模塊是執(zhí)行某一特定任務(wù)的數(shù)據(jù)結(jié)構(gòu)和程序代碼。通常將模塊的接口和功能定義為其外部特性,將模塊的局部數(shù)據(jù)和實(shí)現(xiàn)該模塊的程序代碼稱為內(nèi)部特性。而在模塊設(shè)計(jì)中,最重要的原則就是實(shí)現(xiàn)信息隱蔽和模塊獨(dú)立。

1. 信息隱蔽原則

信息隱蔽是開發(fā)整體程序結(jié)構(gòu)時使用的法則,即將每個程序的成分隱藏或封裝在一個單一的設(shè)計(jì)模式中,并且盡可能少的暴露其內(nèi)部的處理。通常將難的決策、可能修改的決策、數(shù)據(jù)結(jié)構(gòu)的內(nèi)部連接以及對它所做的操作細(xì)節(jié)、內(nèi)部特征碼、與計(jì)算機(jī)硬件有關(guān)的細(xì)節(jié)等隱蔽起來。

通過信息隱蔽可以提高軟件的可修改性、可測試性和可移植性。

2. 模塊獨(dú)立性原則

模塊獨(dú)立是指每個模塊完成一個相對獨(dú)立的特定子功能,并且與其他模塊之間的聯(lián)系最簡單。保持模塊的高度獨(dú)立性,也是設(shè)計(jì)過程中的一個很重要的原則。通常用耦合(模塊之間聯(lián)系的緊密程度)和內(nèi)聚(模塊內(nèi)部各元素之間聯(lián)系的緊密程度)兩個標(biāo)準(zhǔn)來衡量,設(shè)計(jì)的目標(biāo)是高內(nèi)聚、低耦合。

模塊的內(nèi)聚類型如下圖,根據(jù)內(nèi)聚度從高到低排序

內(nèi)聚類型 描述
功能內(nèi)聚 完成一個單一功能,各個部分協(xié)同工作,缺一不可
順序內(nèi)聚 處理元素相關(guān),而且必須順序執(zhí)行
通信內(nèi)聚 所有處理元素集中在一個數(shù)據(jù)結(jié)構(gòu)的區(qū)域上
過程內(nèi)聚 處理元素相關(guān),并且必須按特定的次序執(zhí)行
瞬時內(nèi)聚 所包含的任務(wù)必須在同一時間間隔內(nèi)執(zhí)行(如初始化模塊)
邏輯內(nèi)聚 完成邏輯上相關(guān)的一組任務(wù)
偶然內(nèi)聚 完成一組沒有關(guān)系或松散關(guān)系的任務(wù)

模塊的耦合類型如下圖,根據(jù)耦合度從低到高排序

耦合類型 描述
非直接耦合 沒有直接聯(lián)系,互相不依賴對方
數(shù)據(jù)耦合 借助參數(shù)表傳遞簡單數(shù)據(jù)
標(biāo)記耦合 一個數(shù)據(jù)結(jié)構(gòu)的一部分借助于模塊接口來傳遞
控制耦合 模塊間傳遞的信息中包含用于控制模塊內(nèi)部邏輯的信息
外部耦合 與軟件以外的環(huán)境有關(guān)
公共耦合 多個模塊引用同一個全局?jǐn)?shù)據(jù)區(qū)
內(nèi)容耦合 一個模塊訪問另外一個模塊的內(nèi)部數(shù)據(jù)<br />一個模塊不通過正常入口轉(zhuǎn)入到另一個模塊的內(nèi)部<br />兩個模塊有一部分程序代碼重疊<br />一個模塊有多個入口

除了滿足以上兩大基本原則外,通常在模塊分解時還需要注意:保持模塊的大小適中,盡可能減少調(diào)用的深度,直接調(diào)用該模塊的個數(shù)應(yīng)該盡量大,但調(diào)用其他模塊的個數(shù)則不宜過大;保證模塊是單入口、單出口的;模塊的作用域應(yīng)該在控制域之內(nèi);功能應(yīng)該是可預(yù)測的。

8.4 面向?qū)ο蟮姆治雠c設(shè)計(jì)

8.4.1 面向?qū)ο蟮幕靖拍?/h3>

1. 對象和類

對象是系統(tǒng)中用來描述客觀事物的一個實(shí)體,它由對象標(biāo)識(名稱)、屬性(狀態(tài)、數(shù)據(jù)、成員變量)和服務(wù)(操作、行為、方法)三個要素組成,它們被封裝為一個整體,以接口的形式對外提供服務(wù)。

類是對具有相同屬性和服務(wù)的一個或一組對象的抽象。類與對象是抽象描述和具體實(shí)例的關(guān)系,一個具體的對象被稱為類的一個實(shí)例。

在系統(tǒng)設(shè)計(jì)過程中,類可以分為三種類型,分別是實(shí)體類、邊界類和控制類。

  1. 實(shí)體類:實(shí)體類映射需求中的每個實(shí)體,實(shí)體類保存需要存儲在永久存儲體重的信息。實(shí)體類通常是永久性的,它們所具有的屬性和關(guān)系是長期需要的,有時甚至在系統(tǒng)的整個生存周期都需要。
    實(shí)體類通常采用業(yè)務(wù)領(lǐng)域術(shù)語命名,一般來說是一個名詞,在用例模型向領(lǐng)域模型的轉(zhuǎn)化中,一個參與者一般對應(yīng)于實(shí)體類。通常可以從SRS中的那些與數(shù)據(jù)庫表(需要持久存儲)對應(yīng)的名詞著手來尋找實(shí)體類。通常情況下,實(shí)體類一定有屬性,但不一定有操作。
  2. 控制類:控制類是用于控制用例工作的類,一般是由動賓結(jié)構(gòu)的短語(“動詞+名詞”或“名詞+動詞”)轉(zhuǎn)化來的名詞。控制類用于對一個或幾個用例所特有的控制行為進(jìn)行建模,控制對象(控制類的實(shí)例)通常控制其他對象,因此,它們的行為具有協(xié)調(diào)性。
    通常情況下,控制類沒有屬性,但一定有方法
  3. 邊界類:用于封裝在用例內(nèi)、外流動的信息或數(shù)據(jù)流。邊界類位于系統(tǒng)與邊界的交界處,包括所有窗體、報(bào)表、打印機(jī)和掃描儀等硬件的接口,以及與其他系統(tǒng)的接口。每個參與者與用例交互至少要有一個邊界類。
    邊界類用于系統(tǒng)接口與系統(tǒng)外部進(jìn)行交互,邊界對象將系統(tǒng)與其外部環(huán)境的變更分隔開,使這些變更不會對系統(tǒng)的其他部分造成影響。通常情況下,邊界類可以既有屬性也有方法。

2. 繼承與泛化

繼承用來說明特殊類(子類)與一般類(父類)的關(guān)系,而通常用泛化來說明一般類和特殊類的關(guān)系,也就是說它們是一對多關(guān)系。

3. 多態(tài)與重載

多態(tài)性(即多種形式)一般是指一般類中定義的屬性被特殊類繼承后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為,通常是使用重載和改寫兩項(xiàng)技術(shù)來實(shí)現(xiàn)的

多態(tài)類型 描述
重載(專用多態(tài)) 描述一個函數(shù)名稱有多種不同實(shí)現(xiàn)方式,通常可以在編譯時基于類型簽名來區(qū)分各個重載函數(shù)的名稱
改寫(包括多態(tài)) 是重載的一種特殊情況,只發(fā)生在有關(guān)父類和子類之間關(guān)系中。通常簽名相同,內(nèi)容不一樣。
多態(tài)變量(賦值多態(tài)強(qiáng)制多態(tài)) 聲明為一種類型,但實(shí)際上卻可以包含另一種類型數(shù)值的變量
泛型(模板,參數(shù)多態(tài)) 它提供了一種創(chuàng)建通用工具的方法,可以在特定的場合將其特化

重載是編譯時進(jìn)行的(靜態(tài)綁定),而改寫則是運(yùn)行時選擇的(動態(tài)綁定)。

4. 模板類

也稱類屬類,用來實(shí)現(xiàn)參數(shù)多態(tài)機(jī)制。一個類屬類是關(guān)于一組類的特性抽象,強(qiáng)調(diào)的是這些類的成員特征中與具體類型無關(guān)的那些部分,而用變元來表示與具體類型有關(guān)的那些部分。

5. 消息和消息通信

消息就是向?qū)ο蟀l(fā)出的服務(wù)請求,通常包括提供服務(wù)的對象標(biāo)識、消息名、輸入信息和回答消息。消息通信則是面向?qū)ο蠓椒▽W(xué)中的一個重要原則,它與對象的封裝原則密不可分,為對象間提供了唯一合法的動態(tài)聯(lián)系的途徑。

8.4.2 面向?qū)ο蠓治?/h3>

1. OOA/OOD方法

OOA模型中包括主題、對象類、結(jié)構(gòu)、屬性和服務(wù)5個層次,需經(jīng)過標(biāo)識對象類、標(biāo)識結(jié)構(gòu)與關(guān)聯(lián)、劃分主題、定義屬性、定義服務(wù)5個步驟來完成整個分析同坐。

OOD中將貫穿OOA中的5個層次和5個活動,它由人機(jī)交互部件、問題域部件、任務(wù)管理部件、數(shù)據(jù)管理部件4個部分組成,其主要的活動就是這4個部件的設(shè)計(jì)工作。

  • 設(shè)計(jì)問題域部分:OOA的結(jié)果恰好是OOD的問題域部件,分析的結(jié)果在OOD中可以被改動或增補(bǔ),但基于問題域的總體組織框架是長時間穩(wěn)定的;
  • 設(shè)計(jì)人機(jī)交互部件:人機(jī)交互部件在上述結(jié)果中加入人機(jī)交互的設(shè)計(jì)和交互的細(xì)節(jié),包括窗口和輸出服務(wù)的設(shè)計(jì)。可以用原型來幫助實(shí)際交互機(jī)制進(jìn)行開發(fā)和選擇;
  • 設(shè)計(jì)任務(wù)管理部分:這部分主要是識別事件驅(qū)動任務(wù),識別時鐘驅(qū)動任務(wù),識別優(yōu)先任務(wù)和關(guān)鍵任務(wù),識別協(xié)調(diào)者,審查每個任務(wù)并定義每個任務(wù)。
  • 設(shè)計(jì)數(shù)據(jù)管理部分:數(shù)據(jù)管理部分提供了在數(shù)據(jù)管理系統(tǒng)中存儲和檢索對象的基本結(jié)構(gòu),其目的是隔離數(shù)據(jù)管理方法對其他部分的影響。

2. Booth方法

Booth任務(wù)軟件開發(fā)是一個螺旋上升的過程,每個周期中包括標(biāo)識類和對象、確定類和對象的含義、標(biāo)識關(guān)系、說明每個類的接口和實(shí)現(xiàn)四個步驟。

/ 靜態(tài)模型 動態(tài)模型
邏輯模型 類圖<br />對象圖 狀態(tài)轉(zhuǎn)換圖<br />時序圖
物理模型 模塊圖<br />進(jìn)程圖

Booth方法的挨罰過程是一個迭代的、漸進(jìn)式的系統(tǒng)開發(fā)過程,它可以分為宏過程和微過程兩類。宏過程用于控制微過程,是覆蓋幾個月或幾周所進(jìn)行的活動。它包括負(fù)責(zé)建立核心需求的概念化,為所期望的行為建立模型的分析,建立架構(gòu)的設(shè)計(jì),形成實(shí)現(xiàn)的進(jìn)化,以及管理軟件交付使用的維護(hù)等5個主要活動。

而微過程則基本上代表了開發(fā)人員的日常活動,它由4個重要、沒有順序關(guān)系的步驟組成:在給定的抽象層次上識別出類和對象,識別出這些類和對象的語義,識別出類間和對詳見的關(guān)系,實(shí)現(xiàn)類和對象。

3. OMT方法

OMT是對象建模技術(shù)的縮寫,主要用于分析、系統(tǒng)設(shè)計(jì)和對象設(shè)計(jì)。包括對象模型(靜態(tài)的、結(jié)構(gòu)化的系統(tǒng)的“數(shù)據(jù)”性質(zhì),通常采用類圖)、動態(tài)模型(瞬時的、行為化的系統(tǒng)“控制”性質(zhì),通常使用狀態(tài)圖)和功能模型(表示變化的系統(tǒng)的“功能”性質(zhì),通常使用數(shù)據(jù)流圖)。OMT方法的三大模型如下表

模型 說明 主要技術(shù)
對象模型 描述系統(tǒng)中對象的靜態(tài)結(jié)構(gòu)、對象之間的關(guān)系、屬性、操作。它表示靜態(tài)的、結(jié)構(gòu)上的、系統(tǒng)的“數(shù)據(jù)”特征 對象圖
動態(tài)模型 描述與時間和操作順序有關(guān)的系統(tǒng)特征,如激發(fā)事件、事件序列、確定事件先后關(guān)系的狀態(tài)。它表示瞬時、行為上的、系統(tǒng)的“控制”特征 狀態(tài)圖
功能模型 描述與值的變換有關(guān)的系統(tǒng)特征:功能、映射、約束和函數(shù)依賴 數(shù)據(jù)流圖

4. OOSE方法

面向?qū)ο筌浖こ痰目s寫。它在OMT的基礎(chǔ)上,對功能模型進(jìn)行了補(bǔ)充,提出了“用例”的概念,最終取代數(shù)據(jù)流圖進(jìn)行需求分析和建立功能模型。

8.4.3 統(tǒng)一建模語言

1. UML是什么

  • UML是一種語言。為軟件開發(fā)人員之間提供給了一種用于交流的詞匯表和一種用于軟件藍(lán)圖的標(biāo)準(zhǔn)語言。
  • UML是一種可視化語言
  • UML是一種可用于詳細(xì)描述的語言:UML所建的模型是精確的、無歧義和完整的,因此適合于對所有重要的分析、設(shè)計(jì)和實(shí)現(xiàn)決策進(jìn)行詳細(xì)描述。
  • UML是一種構(gòu)造語言
  • UML是一種文檔化語言:適合于建立系統(tǒng)架構(gòu)及其所有的細(xì)節(jié)文檔。

2. UML的結(jié)構(gòu)

UML由構(gòu)造快、公共機(jī)制和架構(gòu)三個部分組成。

  1. 構(gòu)造塊。構(gòu)造塊也就是基本的UML建模元素(事物)、關(guān)系和圖。
  • 建模元素:包括結(jié)構(gòu)事物(類、接口、協(xié)作、用例、活動類、組件、節(jié)點(diǎn)等)、行為事物(交互、狀態(tài)機(jī))、分組事物(包)、注釋事物。
  • 關(guān)系:包括關(guān)聯(lián)關(guān)系、依賴關(guān)系、泛化關(guān)系、實(shí)現(xiàn)關(guān)系。
  • 圖:UML2.0包括14中不同的圖,分為表示系統(tǒng)靜態(tài)結(jié)構(gòu)的靜態(tài)模型(包括類圖、對象圖、包圖、構(gòu)件圖、部署圖、制品圖),以及表示系統(tǒng)動態(tài)結(jié)構(gòu)的動態(tài)模型(包括對象圖、用例圖、順序圖、通信圖、定時圖、狀態(tài)圖、活動圖、交互概覽圖)。
  1. 公共機(jī)制。指達(dá)到特定目標(biāo)的公共UML方法。
  • 規(guī)格說明:規(guī)格說明是元素語義的文本描述,它是模型的重要組成部分。
  • 修飾:UML為每一個模型元素設(shè)置了一個簡單的記號,還可以通過修飾來表達(dá)更多的信息。
  • 公共分類:包括類元與實(shí)體(類元表示概念,而實(shí)體表示具體的實(shí)體)、接口和實(shí)現(xiàn)(接口用來定義契約,而實(shí)現(xiàn)就是具體的內(nèi)容)兩組公共分類。
  • 擴(kuò)展機(jī)制:包括約束(添加新規(guī)則來擴(kuò)展元素的語義)、構(gòu)造型(用于定義新的UML建模元素)、標(biāo)記值(添加新的特殊信息來擴(kuò)展模型元素的規(guī)格說明)。
  1. 架構(gòu)。UML對系統(tǒng)架構(gòu)的定義是:系統(tǒng)的組織結(jié)構(gòu),包括系統(tǒng)分解的組成部分、它們的關(guān)聯(lián)性、交互、機(jī)制和指導(dǎo)原則,這些提供系統(tǒng)設(shè)計(jì)的信息。而具體來說,就是指5個系統(tǒng)視圖。
  • 邏輯視圖:以問題域的詞匯組成的類和對象集合。
  • 進(jìn)程視圖:可執(zhí)行縣城和進(jìn)程作為活動類的建模,它是邏輯視圖的一次執(zhí)行實(shí)例。
  • 實(shí)現(xiàn)視圖:對組成基于系統(tǒng)的物理代碼的文件和組件進(jìn)行建模
  • 部署視圖:把組件物理的部署到一組物理的、可計(jì)算的節(jié)點(diǎn)上。
  • 用例視圖:最基本的需求分析模型

3. 用例圖基礎(chǔ)

用例實(shí)例實(shí)在系統(tǒng)中執(zhí)行的一系列動作,這些動作將生成特定參與者可見的價(jià)值結(jié)果。一個用例定義一組用例實(shí)例。

用例模型描述的是外部參與者所理解的系統(tǒng)功能。用例模型用于需求分析階段,它的建立是系統(tǒng)開發(fā)者和用戶反復(fù)討論的結(jié)果,表明了開發(fā)者和用戶對需求規(guī)格達(dá)成的共識。

  1. 參與者。參與者代表與系統(tǒng)接口的任何事物或人,是指代表某一種特定功能的角色。因此,參與者都是虛擬的概念。在UML中,用一個小人表示參與者
  2. 用例。用例是對系統(tǒng)行為的動態(tài)描述,它可以促進(jìn)設(shè)計(jì)人員、開發(fā)人員與用戶的溝通,理解正確的需求、還可以劃分系統(tǒng)和外部實(shí)體的界限,是系統(tǒng)設(shè)計(jì)的起點(diǎn)。
  3. 包含和擴(kuò)展。兩個用例之間的關(guān)系可以主要概況為兩種情況。一種是用于重用的包含關(guān)系,用構(gòu)造型<<include>>或者<<use>>表示;另一種是用于分離出不同的行為,用構(gòu)造型<<extend>>表示。
  • 包含關(guān)系:當(dāng)可以從兩個或兩個以上的原始用例中提取公共行為,或者發(fā)現(xiàn)能夠使用一個組件來實(shí)現(xiàn)某一個用例的部分功能是很重要的事時,應(yīng)該使用包含關(guān)系來表示。所提取出來的公共行為稱為抽象用例。
  • 擴(kuò)展關(guān)系:如果一個用例明顯的混合了兩種或兩種以上的不同場景,即根據(jù)情況可能發(fā)生多種事情。可以將這個用例分為一個主用例和一個或多個輔用例,描述可能更加清晰。

4. 類圖和對象圖基礎(chǔ)

在面向?qū)ο蠼<夹g(shù)中,將客觀世界的實(shí)體映射為對象,并歸納成一個個類。類、對象和它們之間的關(guān)聯(lián)是面向?qū)ο蠹夹g(shù)中最基本的元素。對于一個想要描述的系統(tǒng),其類型和對象模型揭示了系統(tǒng)的結(jié)構(gòu)。在UML中,類和對象模型分別由類圖和對象圖表示。類圖是OO方法的核心。

  1. 類和對象。通常用對象描述客觀世界中某個具體的實(shí)體。類是對一類具有相同特征的對象的描述。對象是類的實(shí)例。在UML中,類的可視化表示為一個劃分成三個格子的長方形(下面兩個格子可省略)。
  • 類的獲取和命名:最頂部的格子包含類的名稱。
  • 類的屬性:中間的格子包含類的屬性,用以描述該類對象的共同特點(diǎn)。該項(xiàng)可省略。UML規(guī)定類的屬性的語法為:“可見性 屬性名:類型 = 默認(rèn)值 {約束特性}”。
    可見性包括Public、Private和Protected,分別用+、-、#表示。
    類型表示該類的種類,它可以是基本數(shù)據(jù)類型,例如整數(shù)、實(shí)數(shù)、布爾型等,也可以使用戶自定義的類型。一般它由所涉及的程序設(shè)計(jì)語言確定。
    約束特性則是用戶對該屬性性質(zhì)的一個約束說明。例如“{只讀}”說明該屬性是只讀屬性。
  • 類的操作:該項(xiàng)可省略。操作用于修改、檢索類的屬性或執(zhí)行某些動作。操作通常也被稱為功能,但是它們被約束在類的內(nèi)部,只能作用到該類的對象上。操作名、返回類型和參數(shù)表組成操作界面。UML規(guī)定操作的語法為“可見性:操作名(參數(shù)表):返回類型 {約束特性}”。
    類圖描述了類和類之間的靜態(tài)關(guān)系。
  1. 類之間的關(guān)系。關(guān)系是事物間的連接,在面向?qū)ο蠼V校?個很重要的關(guān)系。
  • 依賴關(guān)系。有兩個元素X、Y,如果修改元素X的定義可能會引起對另一個元素Y的定義的修改,則稱元素Y依賴于元素X。在UML中,使用帶箭頭的虛線表示依賴關(guān)系。
  • 泛化關(guān)系。描述了一般事物與該事物中的特殊種類之間的關(guān)系,也就是父類與子類之間的關(guān)系。繼承關(guān)系是泛化關(guān)系的反關(guān)系。也就是說子類是從父類中集成的,而父類則是子類的泛化。在UML中,使用帶空心箭頭的實(shí)線表示,箭頭指向父類。
    在UML中,對泛化關(guān)系有三個要求:
    a. 子類應(yīng)與父類完全一致,父類所具有的關(guān)聯(lián)、屬性和操作,子類都應(yīng)具有。
    b. 子類中除了與父類一致的信息外,還包括額外的信息。
    c. 可以使用父類實(shí)例的地方,也可以使用子類實(shí)例。
  • 關(guān)聯(lián)關(guān)系。關(guān)聯(lián)表示兩個類之間存在某種語義上的聯(lián)系。在UML中,用一條實(shí)線來表示關(guān)聯(lián)關(guān)系。
    a. 聚合關(guān)系:聚合表示類之間的關(guān)系是整體和部分的關(guān)系。在UML中,用一個帶空心菱形的實(shí)線表示,空心菱形指的是代表“整體”的類。
    b. 組合關(guān)系:如果聚合關(guān)系中的表示“部分”的類存在,與表示“整體”的類有著緊密的關(guān)系,那么就應(yīng)該使用“組合”關(guān)系來表示。在UML中,用帶有實(shí)心菱形的實(shí)線表示,菱形指向的是代表“整體”的類。
  • 實(shí)現(xiàn)關(guān)系。是用來規(guī)定接口和實(shí)現(xiàn)接口的類或組件之間的關(guān)系的。接口是操作的集合,這些操作用于規(guī)定類或組件的服務(wù)。在UML中,用一個帶空心箭頭的虛線表示。
  1. 多重性問題:重復(fù)性又稱多重性,多重性表示為一個整數(shù)范圍n...m,整數(shù)n定義所連接的最少對象的數(shù)目,而m則為最多對象數(shù)(當(dāng)不知道確切的最大數(shù)時,最大數(shù)用表示)。最常見的多重性有:0...1;0...;1...1;1...;
    多重性是用來說明關(guān)聯(lián)的兩個類之間的數(shù)量關(guān)系的。
  2. 類圖。對于軟件系統(tǒng),其類模型和對象模型類圖描述類和類之間的靜態(tài)關(guān)系。與數(shù)據(jù)模型不同,它不僅顯示了信息的結(jié)構(gòu),同時還描述了系統(tǒng)的行為。類圖是定義其他圖的基礎(chǔ)。
  3. 對象圖。UML中對象圖與類圖有相同的表示形式。對象圖可以看做是類圖的一個實(shí)例。對象是類的實(shí)例;對象之間的鏈?zhǔn)穷愔g的關(guān)聯(lián)的實(shí)例。對象與類的圖形表示相似,均為劃分成兩個格子的長方形(下面的格子可省略)。上面的格子是對象名,對象名下有下劃線;下面的格子記錄屬性值。鏈的圖形表示與關(guān)聯(lián)相似。對象圖常用于表示復(fù)雜類圖的一個實(shí)例。

5. 交互圖基礎(chǔ)

交互圖是表示各組對象如何依賴某種行為進(jìn)行寫作的模型。通常可以使用一個交互圖來表示和說明一個用例的行為。

  1. 順序圖。用來描述對象之間動態(tài)的交互歡喜,著重體現(xiàn)對象間消息傳遞的時間順序。順序圖允許直觀的表示出對象的生存期,在生存期內(nèi),對象可以對輸入消息作出響應(yīng),并且可以發(fā)送信息。
    對象間的通信通過在對象的生命線上畫消息來表示。消息的箭頭知名消息的類型。順序圖中的消息可以使信號、操作調(diào)用或類似于C++中的RPC和JAVA中的RMI。當(dāng)收到消息時,接收對象立即開始執(zhí)行活動,即對象被激活了。通過在對象生命線上顯示一個細(xì)長矩形框來表示激活。
    消息可以用消息名及參數(shù)來標(biāo)識,消息也可帶有順序號。消息還可以帶有條件表達(dá)式,表示分支或決定是否發(fā)送消息。如果用于表示分支,則兩個分支是相互排斥的,即在某一時刻僅可發(fā)送分支中的一個消息。
  2. 通信圖。用于描述相互合作的對象間的交互關(guān)系和鏈接關(guān)系。順序圖著重體現(xiàn)交互的時間順序,通信圖則著重體現(xiàn)交互對象間的靜態(tài)鏈接關(guān)系。
  3. 定時圖。著重表示定時約束的定時圖。
    根據(jù)UML的定義,定時圖實(shí)際上是一種特殊形式的順序圖,它與順序圖的區(qū)別主要在幾個方面:
  • 坐標(biāo)軸交換了位置,改為從左到右來表示時間的推移。
  • 用生命線的“凹下凸起”來表示狀態(tài)的變化,每個水平位置代表一種不同的狀態(tài),狀態(tài)的順序可以有意義、也可以沒有意義。
  • 生命線可以跟在一根線后面,在這根線上顯示一些不同的狀態(tài)值。
  • 可以顯示一個度量時間值得標(biāo)尺,用刻度表示時間間隔。
    定時圖的土元包括生命線、狀態(tài)、狀態(tài)變遷、消息、時間刻度。

6. 狀態(tài)圖基礎(chǔ)

用來描述一個特定對象的所有可能狀態(tài)及其引起狀態(tài)轉(zhuǎn)移的事件。一個狀態(tài)圖包括一系列狀態(tài)及狀態(tài)之間的轉(zhuǎn)移。

狀態(tài)圖包括以下部分:

  • 狀態(tài):又稱為中間狀態(tài),用圓角矩形框表示
  • 初始狀態(tài):又稱為初態(tài),用一個黑色的實(shí)心圓圈表示,在一張狀態(tài)圖中只能夠有一個初始狀態(tài)。
  • 結(jié)束狀態(tài):又稱為終態(tài),在黑色的實(shí)心圓圈外面套上一個空心圓,在一張狀態(tài)圖中可能有多個結(jié)束狀態(tài)。
  • 狀態(tài)轉(zhuǎn)移:用箭頭說明狀態(tài)的轉(zhuǎn)移情況,并用文字說明引發(fā)這個狀態(tài)變化的相應(yīng)事件是什么。

一個狀態(tài)也可能被細(xì)分成為多個子狀態(tài),那么如果將這些子狀態(tài)都描繪出來的話,那么這個狀態(tài)就是符合狀態(tài)。

7. 活動圖基礎(chǔ)

活動圖是由狀態(tài)圖變化而來的。活動圖依據(jù)對象狀態(tài)的變化來捕獲動作(將要執(zhí)行的工作或活動)與動作的結(jié)果。活動圖中一個活動結(jié)束后將立即進(jìn)入下一個活動(在狀態(tài)圖中狀態(tài)的變遷可能需要事件的觸發(fā))。

  1. 基本活動圖。活動圖與狀態(tài)圖類似,包括了初始狀態(tài)、終止?fàn)顟B(tài),以及中間的活動狀態(tài),每個活動之間也就是一種狀態(tài)的變遷。在活動圖中,還引入了以下幾個概念:
  • 判定:說明基于某些表達(dá)式的選擇性路徑,在UML中用菱形表示。
  • 分支與組合:處理并發(fā)流,UML中使用粗線表示。
  1. 帶泳道的活動圖。將活動圖的邏輯描述與順序圖、協(xié)作圖的責(zé)任描述結(jié)合起來。
  2. 對象流:在活動圖中可以出現(xiàn)對象。對象可以作為活動的輸入或輸出,對象與活動間的輸入/輸出關(guān)系用虛線箭頭來表示。如果僅表示對象受到某一活動的影響,則可用不帶箭頭的虛線來連接對象與活動。
  3. 信號:在活動途中可以表示信號的發(fā)送與接收,分別用發(fā)送與接收標(biāo)識來表示。發(fā)送和接收標(biāo)識也可與對象相連,用于表示消息的發(fā)送者和接收者。

8. 構(gòu)件圖基礎(chǔ)

構(gòu)件圖是面向?qū)ο笙到y(tǒng)的物理方面進(jìn)行建模要用的兩種圖之一。它可以有效的顯示一組構(gòu)件,以及他們之間的關(guān)系。構(gòu)件圖中通常包括構(gòu)件、接口及各種關(guān)系。

通常構(gòu)件值得是源代碼文件、二進(jìn)制代碼文件和可執(zhí)行文件等。而構(gòu)件圖就是用來顯示編譯、鏈接或執(zhí)行時構(gòu)件之間的依賴關(guān)系的。通常來說,可以使用構(gòu)件圖完成以下工作:

  • 對源代碼進(jìn)行建模:這樣可以清晰地表示出各個不同源程序文件之間的關(guān)系。
  • 對可執(zhí)行體的發(fā)布建模:將清晰地表示出各個可執(zhí)行文件、DLL文件之間的關(guān)系。
  • 對物理數(shù)據(jù)庫建模:用來表示各種類型的數(shù)據(jù)庫、表之間的關(guān)系。
  • 對可調(diào)整的系統(tǒng)建模

在繪制構(gòu)件圖時,應(yīng)該注意側(cè)重于描述系統(tǒng)的靜態(tài)實(shí)現(xiàn)視圖的一個方面,圖形不要過于簡化,應(yīng)該為構(gòu)件圖取一個直觀的名稱,在繪制時避免產(chǎn)生線的交叉。

9. 部署圖基礎(chǔ)

也成為實(shí)施圖,和構(gòu)件圖一眼個,是面向?qū)ο笙到y(tǒng)的物理方面建模的兩種圖之一。構(gòu)件圖說明構(gòu)建之間的邏輯關(guān)系,而部署圖是在此基礎(chǔ)上更進(jìn)一步的描述系統(tǒng)硬件的物理拓?fù)浣Y(jié)構(gòu)及在此結(jié)構(gòu)上運(yùn)行的軟件構(gòu)件,常用于幫助理解分布式系統(tǒng)。通常包括以下一些關(guān)鍵的組成部分:

  1. 節(jié)點(diǎn)和連接。節(jié)點(diǎn)代表一個物理設(shè)備及其上運(yùn)行的軟件系統(tǒng)。在UML中,使用一個立方體表示一個節(jié)點(diǎn),節(jié)點(diǎn)名放在左上角。節(jié)點(diǎn)之間的連線表示系統(tǒng)之間進(jìn)行交互的通信路徑,在UML中被稱為連接。通信類型則放在連接旁邊的“《》”之間,表示所用的通信協(xié)議或網(wǎng)絡(luò)類型
  2. 構(gòu)件和接口。在部署圖中,構(gòu)件代表可執(zhí)行的物理代碼模塊,如一個可執(zhí)行程序。
    在面向?qū)ο蠓椒ㄖ校惡蜆?gòu)件等元素并不是所有的屬性和操作都對外可見。他們對外提供了可見操作和屬性,稱之為類和構(gòu)件的接口。界面可以表示為一頭是一個小圓圈的直線。

8.5 用戶界面設(shè)計(jì)

接口設(shè)計(jì)主要包括三個方面的內(nèi)容:一是設(shè)計(jì)軟件構(gòu)件間的接口;二是軟件設(shè)計(jì)模塊和其他非人的信息生產(chǎn)者和消費(fèi)者(如外部實(shí)體)的接口;三是人(如用戶)和計(jì)算機(jī)間的界面設(shè)計(jì)。

8.5.1 用戶界面設(shè)計(jì)的原則

設(shè)計(jì)時必須遵從三個黃金法則

  • 置用戶與控制之下:具體來說就是以不強(qiáng)迫用戶進(jìn)入不必要的或不希望的動作的方式來定義交互模式、提供靈活的交互、允許用戶交互時可以被中斷和撤銷、當(dāng)技能級別增長時可以使交互流水化并允許定制交互、使用戶隔離內(nèi)部細(xì)節(jié)、設(shè)計(jì)應(yīng)允許用戶和出現(xiàn)在屏幕上的對象直接交互。
  • 減少用戶的記憶負(fù)擔(dān):具體來說就是減少對短期記憶的要求、建立有意義的默認(rèn)、定義直覺性的捷徑、界面的視覺布局應(yīng)該基于對真實(shí)世界的隱喻、以不斷進(jìn)展的方式提示信息。
  • 保持界面的一致性:具體來說就是允許用戶將當(dāng)前任務(wù)放入有意義的語境、在應(yīng)用系列內(nèi)保持一致性,如果過去的交互模型已經(jīng)建立了用戶期望,除非有不得已的理由,否則不要改變它。

用戶界面設(shè)計(jì)原則如下:

原則 描述
用戶熟悉 界面所使用的術(shù)語和概念應(yīng)該來自于用戶的經(jīng)驗(yàn),這些用戶是將來要使用系統(tǒng)最多的人。
意外最小化 永遠(yuǎn)不要讓用戶對系統(tǒng)的行為感到吃驚。
可恢復(fù)性 界面應(yīng)該有一種機(jī)制來允許用戶從錯誤中恢復(fù)
用戶指南 在錯誤發(fā)生時,界面應(yīng)該提供有意義的反饋,并有上下文感知能力的用戶幫助功能。
用戶差異性 界面應(yīng)該為不同類型用戶提供合適的交互功能

8.5.2 用戶界面設(shè)計(jì)過程

用戶界面的設(shè)計(jì)過程也應(yīng)該是迭代的,它通常包括4個不同的框架活動:

  1. 用戶、任務(wù)和環(huán)境分析:著重于分析將和系統(tǒng)交互的用戶的特點(diǎn),記錄下技術(shù)級別、業(yè)務(wù)理解和對新系統(tǒng)的一般感悟,并定義不同的用戶類別。然后對用戶將要完成什么樣的任務(wù)進(jìn)行詳細(xì)的標(biāo)識和描述。最后對用戶的物理工作環(huán)境進(jìn)行了解和分析。
  2. 界面設(shè)計(jì):主要包括建立任務(wù)的目標(biāo)和意圖,為每個目標(biāo)或意圖定制特定的動作序列,按在界面上執(zhí)行的方式對動作序列進(jìn)行規(guī)約,指明系統(tǒng)狀態(tài),定義控制機(jī)制,指明控制機(jī)制如何影響系統(tǒng)狀態(tài),指明用戶如何通過界面上的信息來解釋系統(tǒng)狀態(tài)。
  3. 實(shí)現(xiàn):就是根據(jù)界面設(shè)計(jì)進(jìn)行實(shí)現(xiàn),前期可以通過原型工具來快速實(shí)現(xiàn),減少返工的工作量。
  4. 界面確認(rèn):界面實(shí)現(xiàn)后就可以進(jìn)行一些定性和定量的數(shù)據(jù)收集,以進(jìn)行界面的評估,以調(diào)整界面的設(shè)計(jì)。

8.6 工作流設(shè)計(jì)

8.6.1 工作流設(shè)計(jì)概述

工作流是一類能夠完全或者部分自動執(zhí)行的經(jīng)營過程,根據(jù)一系列過程規(guī)則、文檔、信息或任務(wù)在不同的執(zhí)行者之間傳遞、執(zhí)行。

  1. 工作流。是現(xiàn)實(shí)中的具體工作從開始到結(jié)束過程的抽象和概括。這個過程包括了眾多因素:任務(wù)順序、路線規(guī)則、時間時限約束等。
  2. 流程定義。是指對業(yè)務(wù)過程的形式化表示,定義了過程運(yùn)行中的活動和所涉及的各種信息。這些信息包括過程的開始和完成條件、構(gòu)成過程的活動和進(jìn)行活動間導(dǎo)航的規(guī)則、用戶所需要完成的任務(wù)、可能被調(diào)用的應(yīng)用、工作流間的引用關(guān)系,以及工作流數(shù)據(jù)的定義。
  3. 流程實(shí)例。常稱為工作,是一個流程定義的運(yùn)行實(shí)例。
  4. 工作流管理系統(tǒng)。與數(shù)據(jù)庫管理系統(tǒng)類似,是一個軟件系統(tǒng)。這個程序存儲流程的定義,按照所使用的流程定義來觸發(fā)流程狀態(tài)的改變,推動流程的運(yùn)轉(zhuǎn)。這個推動的依據(jù)常常被稱為工作流引擎。
  5. 流程定義工具。同樣是一套軟件系統(tǒng)。可能是獨(dú)立的軟件,也可能是工作流管理系統(tǒng)的一部分。
  6. 參與者。回答業(yè)務(wù)流程中“誰”這個問題。
  7. 活動。活動是流程定義中的一個元素,一次活動可能改變流程處理數(shù)據(jù)的內(nèi)容、流程的狀態(tài),并可能將流程推動到其他活動中去。活動可以有人來完成,也可以是系統(tǒng)自動的處理過程。
  8. 活動所有者。參與者之一,它有權(quán)決定該活動是否結(jié)束,當(dāng)他決定活動結(jié)束時,將活動推動到其他活動中,可能是下一個活動,也可能是前一個活動。
  9. 工作所有者。是有權(quán)整體控制流程實(shí)例執(zhí)行過程的參與者。
  10. 工作項(xiàng)。代表流程實(shí)例中活動的參與者將要執(zhí)行的工作。

要分析現(xiàn)實(shí)中的處理流程,必須首先描述目標(biāo)系統(tǒng)的流程,這個過程也可以稱為建模。

8.6.2 工作流管理系統(tǒng)

是一種“在工作流形式化表示的驅(qū)動下,通過軟件的執(zhí)行而完成工作流定義、管理及執(zhí)行的系統(tǒng)”,其主要目標(biāo)是對業(yè)務(wù)過程中各活動發(fā)生的先后次序及與活動相關(guān)的相應(yīng)人力或信息資源的調(diào)用進(jìn)行管理,而實(shí)現(xiàn)業(yè)務(wù)過程的自動化。工作流管理系統(tǒng)的六個基本模塊的參考模型如下:

  1. 流程定義工具。這部分軟件提供圖形化或者其他方式的界面給設(shè)計(jì)者。由設(shè)計(jì)者將實(shí)際工作流程進(jìn)行抽象,并將設(shè)計(jì)者提交的流程定義轉(zhuǎn)換為形式化語言描述,提供給計(jì)算機(jī)工作流執(zhí)行服務(wù)進(jìn)行流程實(shí)例處理的一句。
  2. 工作流執(zhí)行服務(wù)。這個服務(wù)程序是工作流管理系統(tǒng)的核心,它使用一種或多種數(shù)據(jù)流引擎,對流程定義進(jìn)行解釋,激活有效的流程實(shí)例,推動流程實(shí)例在不同的活動中運(yùn)轉(zhuǎn)。和客戶應(yīng)用程序、其他工作流服務(wù)執(zhí)行程序進(jìn)行交互,從而完成流程實(shí)例的創(chuàng)建、執(zhí)行和管理工作。同時這部分軟件為每個用戶維護(hù)一個活動列表告訴用戶當(dāng)前必須處理的任務(wù)。如果有必要,還可以通過電子郵件甚至短消息的形式提醒用戶任務(wù)的到達(dá)。
  3. 其他工作流執(zhí)行服務(wù)。
  4. 客戶應(yīng)用程序。這是給最終用戶的界面,用戶通過使用這部分軟件對工作流的數(shù)據(jù)進(jìn)行必要的處理,如果用戶是當(dāng)前活動的擁有者,還可以通過客戶應(yīng)用程序改變流程實(shí)例的活動,將流程實(shí)例推動到另一個活動中。
  5. 被調(diào)用應(yīng)用程序。
  6. 管理和監(jiān)控工具。

8.7 簡單分布式計(jì)算機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)

8.8 系統(tǒng)運(yùn)行環(huán)境的集成和設(shè)計(jì)

1. 集中式系統(tǒng)

所有操作都集中于一臺主機(jī)中,而操作員必須在主機(jī)的附近操作。集中式系統(tǒng)常見于銀行、保險(xiǎn)、證券行業(yè)。集中式系統(tǒng)由以下幾個部分組成:

  1. 單計(jì)算機(jī)結(jié)構(gòu);這種結(jié)構(gòu)簡單、容易維護(hù),但是處理能力受到限制。
  2. 集群結(jié)構(gòu):由多個計(jì)算機(jī)組成,這些計(jì)算機(jī)具有類似的硬件平臺、操作系統(tǒng)等。通常采用負(fù)載均衡、資源共享等方式實(shí)現(xiàn)更大的處理能力和容量。
  3. 多計(jì)算機(jī)結(jié)構(gòu):由多個計(jì)算機(jī)組成,這些計(jì)算機(jī)之間操作環(huán)境可能不同。適用于當(dāng)系統(tǒng)可以分解成多個不同的子系統(tǒng)時。

2. 分布式系統(tǒng)

3. C/S結(jié)構(gòu)

4. 多層結(jié)構(gòu)

這種結(jié)構(gòu)是C/S結(jié)構(gòu)的擴(kuò)展,典型的分為由存儲數(shù)據(jù)的數(shù)據(jù)庫服務(wù)器作為數(shù)據(jù)層、實(shí)現(xiàn)商業(yè)規(guī)則的程序作為邏輯層、管理用戶輸入輸出的視圖層所組成的三層結(jié)構(gòu)。

多層結(jié)構(gòu)形式復(fù)雜、工鞥多余,實(shí)現(xiàn)多層結(jié)構(gòu)常常需要來實(shí)現(xiàn)不同層次建通信的專門程序——管件,也稱為中間件。中間件大多數(shù)實(shí)現(xiàn)遠(yuǎn)程程序調(diào)用、對象請求調(diào)度等功能。

5. Internet、Intranet和Extranet

Internet是全球的網(wǎng)絡(luò)集合,使用通用的TCP/IP協(xié)議來相互連接。Internet提供了電子郵件、文件傳輸、遠(yuǎn)程登錄等服務(wù)。Intranet是私有網(wǎng)絡(luò),只限于內(nèi)部使用,也使用TCP/IP協(xié)議。Extranet是一個擴(kuò)展的Intranet。它包括企業(yè)之外的和企業(yè)密切相關(guān)合作的其他企業(yè)。Extranet允許分離的組織交換信息并進(jìn)行合作,這樣就形成了一個虛擬組織,現(xiàn)在的VPN技術(shù)允許在公用網(wǎng)絡(luò)上架構(gòu)支隊(duì)組織內(nèi)部開發(fā)服務(wù)。

8.9 系統(tǒng)過渡計(jì)劃

1. 直接過渡

當(dāng)新系統(tǒng)運(yùn)行時,立即關(guān)閉原來的系統(tǒng)

2. 并行過渡

讓新系統(tǒng)和舊系統(tǒng)在一段時間里同時運(yùn)行

3. 階段過渡

適用于分階段開發(fā)的系統(tǒng)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內(nèi)容