需求和設(shè)計(jì)之間存在差別,但應(yīng)盡量使你的規(guī)格說(shuō)明的具體實(shí)現(xiàn)無(wú)傾向性。理想情況是:
在設(shè)計(jì)上的考慮不應(yīng)該歪曲對(duì)預(yù)期系統(tǒng)的描述。需求開(kāi)發(fā)和規(guī)格說(shuō)明應(yīng)該強(qiáng)調(diào)對(duì)預(yù)期系統(tǒng)外部行為的理解和描述。讓設(shè)計(jì)者和開(kāi)發(fā)者參與需求審查以判斷需求是否可以作為設(shè)計(jì)的基礎(chǔ)。
不同的軟件設(shè)計(jì)方法常常都會(huì)滿足最終需求,而設(shè)計(jì)方法會(huì)隨著性能、有效性、健壯性以及所采用的技術(shù)上的不同而變化。如果你直接從需求規(guī)格說(shuō)明跳到編碼階段,你所設(shè)計(jì)的軟件將會(huì)是空中閣樓,其可能的結(jié)果只能是結(jié)統(tǒng)的最有效的方法??紤]一下其它的設(shè)計(jì)方案將有助于確保開(kāi)發(fā)人員遵從所提出的設(shè)計(jì)約束或遵從與設(shè)計(jì)有關(guān)的質(zhì)量屬性規(guī)格說(shuō)明。
曾經(jīng)參與一項(xiàng)項(xiàng)目,進(jìn)行了完整的需求分析,建立了詳細(xì)描述模擬攝像系統(tǒng)行為的8個(gè)變換過(guò)程的數(shù)據(jù)流程圖。經(jīng)過(guò)大量的需求分析后,我們并沒(méi)有直接進(jìn)行源代碼的編寫工作。而是以數(shù)據(jù)流程圖為表示方法,創(chuàng)建了一個(gè)設(shè)計(jì)模型。我們立刻意識(shí)到模型中有三個(gè)步驟使用了相同的計(jì)算算法,另外三個(gè)使用不同的方程集,而剩下的兩個(gè)步驟共享三分之一集合。
分析模型代表了用戶和開(kāi)發(fā)小組對(duì)我們正在解決的問(wèn)題的理解,而設(shè)計(jì)模型則描繪了我們應(yīng)該如何構(gòu)造系統(tǒng)。通過(guò)設(shè)計(jì)期間的仔細(xì)思考,我們把核心問(wèn)題簡(jiǎn)化了60%,把8個(gè)復(fù)雜的計(jì)算集合減少到3個(gè)。如果我們?cè)谛枨蠓治鲋罅⒖踢M(jìn)行編碼,那么在構(gòu)造階段必定會(huì)出現(xiàn)代碼重復(fù)。但是,由于及早發(fā)現(xiàn)了可簡(jiǎn)化問(wèn)題,節(jié)省了許多時(shí)間和金錢。設(shè)計(jì)上的返工比編碼返工可能要效率高一些。
以需求為基礎(chǔ),反復(fù)設(shè)計(jì)將產(chǎn)生優(yōu)良成果。當(dāng)你得到更多的信息或額外的思想時(shí),用不同的方法進(jìn)行設(shè)計(jì)可以精細(xì)化你最初的概念。設(shè)計(jì)上的失誤將導(dǎo)致軟件系統(tǒng)難以維護(hù)和擴(kuò)充,最終會(huì)導(dǎo)致不能滿足客戶在性能和可靠性上的目標(biāo)。在把需求轉(zhuǎn)化為設(shè)計(jì)時(shí)你所花的時(shí)間將是對(duì)建立高質(zhì)量、健壯性產(chǎn)品的關(guān)鍵的投資。
在設(shè)計(jì)產(chǎn)品時(shí),產(chǎn)品的需求和質(zhì)量屬性決定了所采用的合適的構(gòu)造方法。研究和評(píng)審所提出的體系結(jié)構(gòu)是另一種解釋需求的方法且會(huì)使需求更加明確。與原型法類似,這是一種自下而上的需求分析方法。兩種方法都圍繞著這樣一種思維過(guò)程:“如果我正確理解需求,那么這種方法可以滿足這種需求。既然我手中有一個(gè)最初的體系結(jié)構(gòu)(或原型),它是否有助于我更好地理解需求呢?”
在你可以開(kāi)始實(shí)現(xiàn)各個(gè)部分需求前,不必為整個(gè)產(chǎn)品進(jìn)行完整、詳細(xì)的設(shè)計(jì)。然而,在你進(jìn)行編碼前,必須設(shè)計(jì)好每個(gè)部分。設(shè)計(jì)規(guī)劃將有益于大難度項(xiàng)目(有許多內(nèi)部組件接口和交互作用的系統(tǒng)和開(kāi)發(fā)人員無(wú)經(jīng)驗(yàn)的項(xiàng)目)。然而,下面介紹的步驟將有益于所有的項(xiàng)目
◆ 應(yīng)該為在維護(hù)過(guò)程中起支撐作用的子系統(tǒng)和軟件組件建立一個(gè)堅(jiān)固的體系結(jié)構(gòu)。
◆ 明確需要?jiǎng)?chuàng)建的對(duì)象類或功能模塊,定義他們的接口、功能范圍以及與其它代碼單元的協(xié)作。
◆ 根據(jù)強(qiáng)內(nèi)聚、松耦合和信息隱藏的良好設(shè)計(jì)原則定義每個(gè)代碼單元的預(yù)期功能。
◆ 確保你的設(shè)計(jì)滿足了所有的功能需求并且不包括任何不必要的功能。
當(dāng)開(kāi)發(fā)者把需求轉(zhuǎn)化為設(shè)計(jì)和代碼時(shí),他們將會(huì)遇到不確定和混淆的地方。理想情況下,開(kāi)發(fā)者可沿著發(fā)生的問(wèn)題回溯至客戶并獲得解決方案。如果不能馬上解決問(wèn)題,那么開(kāi)發(fā)者所做出的任何假設(shè),猜想或解釋都要編寫成文檔記錄下來(lái),并由客戶代表評(píng)審。如果遇到許多諸如此類的問(wèn)題,那么就說(shuō)明開(kāi)發(fā)者在實(shí)現(xiàn)需求之前,這些需求還不十分清晰或具體。在這種情況下,最好安排一兩個(gè)開(kāi)發(fā)人員對(duì)剩余的需求進(jìn)行評(píng)審后才能使開(kāi)發(fā)工作繼續(xù)進(jìn)行。