為可重用的軟件模塊創(chuàng)建一致且合適的接口是嵌入式軟件設(shè)計(jì)中最關(guān)鍵也是最容易被忽視的方面之一。接口通常是動(dòng)態(tài)開發(fā)的,很少甚至沒有預(yù)先考慮。但是,為了確保軟件可以輕松地從一個(gè)應(yīng)用程序使用到下一個(gè)應(yīng)用程序,每個(gè)嵌入式開發(fā)人員都應(yīng)該記住五個(gè)技巧。
技巧1——從所需操作的列表開始
在開始為軟件模塊編寫接口之前,開發(fā)人員應(yīng)該花一些時(shí)間寫出接口需要執(zhí)行的操作的簡(jiǎn)單列表。這個(gè)列表就像一個(gè)便箋簿,讓開發(fā)人員思考界面到底需要做什么。模塊的操作是什么?它需要哪些輸入?它將產(chǎn)生哪些輸出?這三個(gè)問(wèn)題都需要回答。列表和問(wèn)題將作為設(shè)計(jì)界面的起點(diǎn)。
技巧2——使用UML類圖
UML類圖用于表示一個(gè)類,但它也可以用于表示一個(gè)模塊,更重要的是,模塊接口。類圖的基本組件是一個(gè)由三部分組成的盒子。第一部分(頂部)包含模塊的名稱。第二部分(中間)包含模塊的屬性。第三部分也是最后一部分用于定義接口公開公開的操作和方法。
模塊的屬性可以被認(rèn)為是接口操作將操縱的私有和公共變量。屬性前面的加號(hào)表示它是公共的,直接作為接口的一部分公開。減號(hào)表示該屬性是私有的,嵌入式開發(fā)人員只能通過(guò)使用接口公開的操作在幕后操作。將這些操作視為技巧1中列出的相同操作。
技巧3——將接口與實(shí)現(xiàn)分離
當(dāng)開始開發(fā)一個(gè)模塊的接口時(shí),開發(fā)人員應(yīng)該盡一切努力將接口從模塊的實(shí)現(xiàn)中分離出來(lái)。接口的公共部分的細(xì)節(jié)都應(yīng)該包含在頭文件中,在這種情況下,頭文件定義了模塊的接口。實(shí)現(xiàn)細(xì)節(jié)應(yīng)該保存在源文件中。將實(shí)現(xiàn)的細(xì)節(jié)與接口分開,開始為開發(fā)人員提供隱藏實(shí)現(xiàn)的能力。這種隱藏導(dǎo)致了模塊類的抽象,并提供了以后重新定義實(shí)現(xiàn)而不影響接口的能力。
技巧4——使用抽象數(shù)據(jù)類型
需求總是變化的,預(yù)測(cè)需求將如何變化通常是徒勞的,即使你配備了水晶球。抽象數(shù)據(jù)類型旨在幫助開發(fā)人員處理不斷變化的需求。以頭文件中定義為接口一部分的數(shù)據(jù)結(jié)構(gòu)為例。任何引用頭文件的模塊都能夠基于該數(shù)據(jù)結(jié)構(gòu)創(chuàng)建和修改數(shù)據(jù)。當(dāng)需求和數(shù)據(jù)結(jié)構(gòu)發(fā)生變化時(shí),就需要對(duì)使用頭文件的任何文件進(jìn)行更新。
如果嵌入式開發(fā)人員創(chuàng)建了一個(gè)抽象數(shù)據(jù)類型,其中數(shù)據(jù)結(jié)構(gòu)的細(xì)節(jié)隱藏在實(shí)現(xiàn)中,那么只需要更新源文件實(shí)現(xiàn)。任何使用頭文件的模塊將簡(jiǎn)單地繼續(xù)使用公共接口,底層實(shí)現(xiàn)將處理改變的數(shù)據(jù)類型。
技巧5——封裝數(shù)據(jù)
計(jì)算機(jī)科學(xué)課程中教授的第一個(gè)概念是,變量或?qū)ο髴?yīng)該限制在盡可能小的程序范圍內(nèi)。類似地,接口如何實(shí)現(xiàn)的細(xì)節(jié)應(yīng)該限于需要知道的基礎(chǔ)上。開發(fā)人員應(yīng)該嘗試對(duì)模塊的用戶隱藏盡可能多的數(shù)據(jù)和實(shí)現(xiàn)。隱藏細(xì)節(jié)有助于防止用戶直接操作模塊的內(nèi)部數(shù)據(jù),這可能會(huì)導(dǎo)致模塊進(jìn)入未知或不一致的狀態(tài)。
總結(jié)
開發(fā)充滿了不斷變化的需求和短的開發(fā)周期。使用適當(dāng)?shù)慕缑嬖O(shè)計(jì)技術(shù)可以改進(jìn)軟件的整體設(shè)計(jì),并最小化不斷變化的需求目標(biāo)的影響。我們研究了設(shè)計(jì)界面的五個(gè)簡(jiǎn)單技巧。嵌入式開發(fā)人員在開發(fā)一個(gè)經(jīng)得起時(shí)間考驗(yàn)的界面時(shí),還需要考慮哪些因素?