摘要:本文根據(jù)個(gè)人經(jīng)驗(yàn)和實(shí)踐,詳細(xì)地討論和分析在面向?qū)ο蟮脑O(shè)計(jì)過(guò)程中,需要注意的問(wèn)題。
1.面向?qū)ο蠹夹g(shù)
思維方式?jīng)Q定解決問(wèn)題的方式,傳統(tǒng)軟件開(kāi)發(fā)采用自頂向下的思想指導(dǎo)程序設(shè)計(jì),即將目標(biāo)劃分為若干子目標(biāo),子目標(biāo)再進(jìn)一步劃分下去,直到目標(biāo)能被編程實(shí)現(xiàn)為止。面向?qū)ο蠹夹g(shù)給軟件設(shè)計(jì)領(lǐng)域帶來(lái)極大的變化,它利用軟件對(duì)象來(lái)進(jìn)行程序開(kāi)發(fā),所謂對(duì)象是包含數(shù)據(jù)和對(duì)數(shù)據(jù)操作的代碼實(shí)體,或者說(shuō)是在傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)中加入一些被稱(chēng)為成員函數(shù)的過(guò)程,因而賦予對(duì)象以動(dòng)作。而在程序設(shè)計(jì)中,對(duì)象具有與現(xiàn)實(shí)世界的某種對(duì)應(yīng)關(guān)系,我們正是利用這種關(guān)系對(duì)問(wèn)題進(jìn)行分解。
從程序語(yǔ)言角度來(lái)看,在一個(gè)對(duì)象中代碼和(或)數(shù)據(jù)可以是這個(gè)對(duì)象私有的,不能被對(duì)象外的部分直接訪問(wèn)。因而對(duì)象提供了一種高級(jí)保護(hù)以防止程序被無(wú)關(guān)部分錯(cuò)誤修改或錯(cuò)誤地使用了對(duì)象的私有部分。當(dāng)從對(duì)象外部試圖直接對(duì)受保護(hù)的內(nèi)部數(shù)據(jù)進(jìn)行修改時(shí),將被程序拒絕,只有通過(guò)對(duì)象所提供的對(duì)外服務(wù)函數(shù)才能夠?qū)ζ鋬?nèi)部數(shù)據(jù)進(jìn)行必要的加工,從而保證了數(shù)據(jù)加工的合法性。從這一意義上講,把這種代碼和數(shù)據(jù)的聯(lián)系稱(chēng)為"封裝"。換句話說(shuō),封裝是將對(duì)象封閉保護(hù)起來(lái),是將內(nèi)部細(xì)節(jié)隱蔽起來(lái)的能力。
2.面向?qū)ο笤O(shè)計(jì)要點(diǎn)
下面是根據(jù)我個(gè)人的設(shè)計(jì)經(jīng)驗(yàn),總結(jié)的在面向?qū)ο笤O(shè)計(jì)時(shí)需要注意的問(wèn)題。
(1)為實(shí)際工作設(shè)計(jì):軟件是一種工具,一種實(shí)現(xiàn)目標(biāo)的方法,所以我們的軟件設(shè)計(jì)一定要建立在軟件需求基礎(chǔ)上,根據(jù)需求確定軟件的工作范圍,再根據(jù)確定的工作范圍來(lái)進(jìn)行軟件設(shè)計(jì),另外,我們不要迷失在各種技術(shù)的誘惑之中,不能為了嘗試某些新技術(shù)而試圖解決實(shí)際不存在的問(wèn)題,這樣會(huì)使軟件設(shè)計(jì)處于一片混亂之中。
(2)理解要實(shí)現(xiàn)的東西:我們應(yīng)該在建立模型上花大量的時(shí)間,偶爾寫(xiě)一些源代碼來(lái)驗(yàn)證設(shè)計(jì)過(guò)程中所遇到的問(wèn)題,這樣做可以使我們的設(shè)計(jì)方案更加可行。如果我們不了解我們的軟件設(shè)計(jì)要實(shí)現(xiàn)什么目標(biāo),這個(gè)設(shè)計(jì)注定是失敗的。
(3)需求的重要性:留出時(shí)間努力去充分收集相關(guān)信息和分析軟件用戶的需求。讓用戶參與到這個(gè)過(guò)程中,但不要盲目接受用戶或客戶提出的功能需求。保證在開(kāi)發(fā)過(guò)程中引入一種有效的方法去收集、組織、驗(yàn)證支撐工作的信息,要學(xué)習(xí)問(wèn)題領(lǐng)域的描述語(yǔ)言和掌握相關(guān)工作的流程。如果沒(méi)有需求,就不要?jiǎng)邮肿鋈魏问虑?,成功的軟件取決于時(shí)間、預(yù)算和是否滿足用戶的需求,如果不能確切地知道用戶需要的是什么,那么所做的軟件必定是失敗的。
(4)在現(xiàn)有任務(wù)中應(yīng)用多個(gè)模型:當(dāng)收集需求的時(shí)候,應(yīng)該考慮使用用例模型、用戶界面模型和領(lǐng)域級(jí)的類(lèi)模型。當(dāng)設(shè)計(jì)軟件時(shí),應(yīng)該考慮制作類(lèi)模型、順序圖、狀態(tài)圖、協(xié)作圖和最終的軟件實(shí)際物理模型。僅僅使用一個(gè)模型而實(shí)現(xiàn)的軟件要么不能滿足用戶的需求,要么很難擴(kuò)展。
(5)用例的重要性:在一個(gè)軟件系統(tǒng)中,用例可大可小,但它必須是對(duì)一個(gè)具體的用戶目標(biāo)實(shí)現(xiàn)的完整描述。通過(guò)用例圖把系統(tǒng)和外界的交互描述出來(lái),以便來(lái)鑒別和劃分系統(tǒng)功能。
(6)文檔的重要性:擁有準(zhǔn)確的技術(shù)文檔不僅對(duì)于整個(gè)開(kāi)發(fā)小組非常有益,而且也能讓客戶從中受益。由于軟件開(kāi)發(fā)在某種程度上要依賴(lài)技術(shù)文檔來(lái)進(jìn)行說(shuō)明,因此文檔必須十分準(zhǔn)確可靠。在編寫(xiě)文檔時(shí),要明確該文檔的目的和對(duì)象,同時(shí),要保證文檔之間的前后一致性。
(7)證明軟件的設(shè)計(jì)在實(shí)踐中是可行的:在設(shè)計(jì)的時(shí)候應(yīng)先建立一個(gè)技術(shù)模型,或者稱(chēng)為"點(diǎn)到點(diǎn)"的原型,用此來(lái)證明我們的設(shè)計(jì)是可行的。如果軟件的設(shè)計(jì)方案是不可行的,在編碼時(shí)采用任何策略都是毫無(wú)用處的。
(8)應(yīng)用已知的模式:一般來(lái)說(shuō),應(yīng)該避免重新設(shè)計(jì)已經(jīng)成熟的并被廣泛使用的設(shè)計(jì)方法或者設(shè)計(jì)模式。
(9)類(lèi)的內(nèi)聚性:一個(gè)類(lèi)應(yīng)該有且僅有一個(gè)職責(zé)。所謂一個(gè)類(lèi)的職責(zé)是指引起該類(lèi)變化的原因,如果一個(gè)類(lèi)具有一個(gè)以上的職責(zé),那么就會(huì)有多個(gè)不同的原因引起該類(lèi)變化,其實(shí)就是耦合了多個(gè)互不相關(guān)的職責(zé),降低這個(gè)類(lèi)的內(nèi)聚性。
(10)充分考慮軟件的可移植性:當(dāng)使用了某個(gè)操作系統(tǒng)的特性,或者利用某個(gè)數(shù)據(jù)庫(kù)專(zhuān)用語(yǔ)言寫(xiě)了存儲(chǔ)過(guò)程,這個(gè)軟件和特定產(chǎn)品的結(jié)合度就已經(jīng)很高了。所以,為了增強(qiáng)軟件的可移植性,應(yīng)該把這些特有的實(shí)現(xiàn)細(xì)節(jié)封裝在一個(gè)類(lèi)中,這樣,當(dāng)它們改變的時(shí)候,只需要更改那個(gè)類(lèi)的代碼就可以了。
(11)建立對(duì)象數(shù)據(jù)辭典:為了便于內(nèi)部重用和共享,應(yīng)該建立電子化的對(duì)象數(shù)據(jù)辭典,以便對(duì)對(duì)象進(jìn)行統(tǒng)一歸類(lèi)管理。
1.面向?qū)ο蠹夹g(shù)
思維方式?jīng)Q定解決問(wèn)題的方式,傳統(tǒng)軟件開(kāi)發(fā)采用自頂向下的思想指導(dǎo)程序設(shè)計(jì),即將目標(biāo)劃分為若干子目標(biāo),子目標(biāo)再進(jìn)一步劃分下去,直到目標(biāo)能被編程實(shí)現(xiàn)為止。面向?qū)ο蠹夹g(shù)給軟件設(shè)計(jì)領(lǐng)域帶來(lái)極大的變化,它利用軟件對(duì)象來(lái)進(jìn)行程序開(kāi)發(fā),所謂對(duì)象是包含數(shù)據(jù)和對(duì)數(shù)據(jù)操作的代碼實(shí)體,或者說(shuō)是在傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)中加入一些被稱(chēng)為成員函數(shù)的過(guò)程,因而賦予對(duì)象以動(dòng)作。而在程序設(shè)計(jì)中,對(duì)象具有與現(xiàn)實(shí)世界的某種對(duì)應(yīng)關(guān)系,我們正是利用這種關(guān)系對(duì)問(wèn)題進(jìn)行分解。
從程序語(yǔ)言角度來(lái)看,在一個(gè)對(duì)象中代碼和(或)數(shù)據(jù)可以是這個(gè)對(duì)象私有的,不能被對(duì)象外的部分直接訪問(wèn)。因而對(duì)象提供了一種高級(jí)保護(hù)以防止程序被無(wú)關(guān)部分錯(cuò)誤修改或錯(cuò)誤地使用了對(duì)象的私有部分。當(dāng)從對(duì)象外部試圖直接對(duì)受保護(hù)的內(nèi)部數(shù)據(jù)進(jìn)行修改時(shí),將被程序拒絕,只有通過(guò)對(duì)象所提供的對(duì)外服務(wù)函數(shù)才能夠?qū)ζ鋬?nèi)部數(shù)據(jù)進(jìn)行必要的加工,從而保證了數(shù)據(jù)加工的合法性。從這一意義上講,把這種代碼和數(shù)據(jù)的聯(lián)系稱(chēng)為"封裝"。換句話說(shuō),封裝是將對(duì)象封閉保護(hù)起來(lái),是將內(nèi)部細(xì)節(jié)隱蔽起來(lái)的能力。
2.面向?qū)ο笤O(shè)計(jì)要點(diǎn)
下面是根據(jù)我個(gè)人的設(shè)計(jì)經(jīng)驗(yàn),總結(jié)的在面向?qū)ο笤O(shè)計(jì)時(shí)需要注意的問(wèn)題。
(1)為實(shí)際工作設(shè)計(jì):軟件是一種工具,一種實(shí)現(xiàn)目標(biāo)的方法,所以我們的軟件設(shè)計(jì)一定要建立在軟件需求基礎(chǔ)上,根據(jù)需求確定軟件的工作范圍,再根據(jù)確定的工作范圍來(lái)進(jìn)行軟件設(shè)計(jì),另外,我們不要迷失在各種技術(shù)的誘惑之中,不能為了嘗試某些新技術(shù)而試圖解決實(shí)際不存在的問(wèn)題,這樣會(huì)使軟件設(shè)計(jì)處于一片混亂之中。
(2)理解要實(shí)現(xiàn)的東西:我們應(yīng)該在建立模型上花大量的時(shí)間,偶爾寫(xiě)一些源代碼來(lái)驗(yàn)證設(shè)計(jì)過(guò)程中所遇到的問(wèn)題,這樣做可以使我們的設(shè)計(jì)方案更加可行。如果我們不了解我們的軟件設(shè)計(jì)要實(shí)現(xiàn)什么目標(biāo),這個(gè)設(shè)計(jì)注定是失敗的。
(3)需求的重要性:留出時(shí)間努力去充分收集相關(guān)信息和分析軟件用戶的需求。讓用戶參與到這個(gè)過(guò)程中,但不要盲目接受用戶或客戶提出的功能需求。保證在開(kāi)發(fā)過(guò)程中引入一種有效的方法去收集、組織、驗(yàn)證支撐工作的信息,要學(xué)習(xí)問(wèn)題領(lǐng)域的描述語(yǔ)言和掌握相關(guān)工作的流程。如果沒(méi)有需求,就不要?jiǎng)邮肿鋈魏问虑?,成功的軟件取決于時(shí)間、預(yù)算和是否滿足用戶的需求,如果不能確切地知道用戶需要的是什么,那么所做的軟件必定是失敗的。
(4)在現(xiàn)有任務(wù)中應(yīng)用多個(gè)模型:當(dāng)收集需求的時(shí)候,應(yīng)該考慮使用用例模型、用戶界面模型和領(lǐng)域級(jí)的類(lèi)模型。當(dāng)設(shè)計(jì)軟件時(shí),應(yīng)該考慮制作類(lèi)模型、順序圖、狀態(tài)圖、協(xié)作圖和最終的軟件實(shí)際物理模型。僅僅使用一個(gè)模型而實(shí)現(xiàn)的軟件要么不能滿足用戶的需求,要么很難擴(kuò)展。
(5)用例的重要性:在一個(gè)軟件系統(tǒng)中,用例可大可小,但它必須是對(duì)一個(gè)具體的用戶目標(biāo)實(shí)現(xiàn)的完整描述。通過(guò)用例圖把系統(tǒng)和外界的交互描述出來(lái),以便來(lái)鑒別和劃分系統(tǒng)功能。
(6)文檔的重要性:擁有準(zhǔn)確的技術(shù)文檔不僅對(duì)于整個(gè)開(kāi)發(fā)小組非常有益,而且也能讓客戶從中受益。由于軟件開(kāi)發(fā)在某種程度上要依賴(lài)技術(shù)文檔來(lái)進(jìn)行說(shuō)明,因此文檔必須十分準(zhǔn)確可靠。在編寫(xiě)文檔時(shí),要明確該文檔的目的和對(duì)象,同時(shí),要保證文檔之間的前后一致性。
(7)證明軟件的設(shè)計(jì)在實(shí)踐中是可行的:在設(shè)計(jì)的時(shí)候應(yīng)先建立一個(gè)技術(shù)模型,或者稱(chēng)為"點(diǎn)到點(diǎn)"的原型,用此來(lái)證明我們的設(shè)計(jì)是可行的。如果軟件的設(shè)計(jì)方案是不可行的,在編碼時(shí)采用任何策略都是毫無(wú)用處的。
(8)應(yīng)用已知的模式:一般來(lái)說(shuō),應(yīng)該避免重新設(shè)計(jì)已經(jīng)成熟的并被廣泛使用的設(shè)計(jì)方法或者設(shè)計(jì)模式。
(9)類(lèi)的內(nèi)聚性:一個(gè)類(lèi)應(yīng)該有且僅有一個(gè)職責(zé)。所謂一個(gè)類(lèi)的職責(zé)是指引起該類(lèi)變化的原因,如果一個(gè)類(lèi)具有一個(gè)以上的職責(zé),那么就會(huì)有多個(gè)不同的原因引起該類(lèi)變化,其實(shí)就是耦合了多個(gè)互不相關(guān)的職責(zé),降低這個(gè)類(lèi)的內(nèi)聚性。
(10)充分考慮軟件的可移植性:當(dāng)使用了某個(gè)操作系統(tǒng)的特性,或者利用某個(gè)數(shù)據(jù)庫(kù)專(zhuān)用語(yǔ)言寫(xiě)了存儲(chǔ)過(guò)程,這個(gè)軟件和特定產(chǎn)品的結(jié)合度就已經(jīng)很高了。所以,為了增強(qiáng)軟件的可移植性,應(yīng)該把這些特有的實(shí)現(xiàn)細(xì)節(jié)封裝在一個(gè)類(lèi)中,這樣,當(dāng)它們改變的時(shí)候,只需要更改那個(gè)類(lèi)的代碼就可以了。
(11)建立對(duì)象數(shù)據(jù)辭典:為了便于內(nèi)部重用和共享,應(yīng)該建立電子化的對(duì)象數(shù)據(jù)辭典,以便對(duì)對(duì)象進(jìn)行統(tǒng)一歸類(lèi)管理。

