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