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