氣象監(jiān)測(cè)站題庫(kù)_第1頁(yè)
氣象監(jiān)測(cè)站題庫(kù)_第2頁(yè)
氣象監(jiān)測(cè)站題庫(kù)_第3頁(yè)
氣象監(jiān)測(cè)站題庫(kù)_第4頁(yè)
氣象監(jiān)測(cè)站題庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)采集一一氣象監(jiān)測(cè)站11.1初始我們的氣象監(jiān)測(cè)系統(tǒng)是一個(gè)簡(jiǎn)單得多應(yīng)用,僅僅包含少數(shù)的類。咋一看,面向?qū)ο蟮男率謧兛赡芎芟氩捎靡环N本質(zhì)上非面向?qū)ο蟮姆绞絹?lái)解決這個(gè)問(wèn)題,即考慮數(shù)據(jù)流和不同的輸入/輸出之間的映射。然而,正如我們將要看到的那樣,即使是像這樣小的一個(gè)系統(tǒng),也可以很好地借鑒面向?qū)ο蠹軜?gòu),并在開(kāi)發(fā)過(guò)程中展示出一些面向?qū)ο箝_(kāi)發(fā)過(guò)程的基本原則。11.1.1氣象監(jiān)測(cè)站需求本系統(tǒng)應(yīng)提供各種氣象條件的自動(dòng)檢測(cè)。具體地說(shuō),它必須測(cè)量:a、風(fēng)速b、溫度c、氣壓d、濕度系統(tǒng)也應(yīng)提供一下導(dǎo)出的測(cè)量數(shù)據(jù):a、風(fēng)濕度b、露點(diǎn)溫度c、溫度趨勢(shì)d、氣壓趨勢(shì)系統(tǒng)應(yīng)有一個(gè)決定當(dāng)前時(shí)間和日期的方法,以便它能夠報(bào)告過(guò)去24小時(shí)內(nèi)4種主要測(cè)量數(shù)據(jù)的最高值和最低值。系統(tǒng)應(yīng)有一個(gè)顯示屏,不斷顯示所有8個(gè)主要數(shù)據(jù)和導(dǎo)出數(shù)據(jù),同時(shí)顯示出當(dāng)前的時(shí)間和日期。用戶可以通過(guò)小鍵盤來(lái)指揮系統(tǒng),讓它顯示任意一個(gè)主要測(cè)量數(shù)據(jù)在24小時(shí)內(nèi)的最高值和最低值,以及出現(xiàn)這些值的時(shí)間。系統(tǒng)應(yīng)該允許用戶根據(jù)已知的值來(lái)校正傳感器,并允許設(shè)置當(dāng)前的時(shí)間和日期。11.1.2定義問(wèn)題的邊界分析時(shí)首先要考慮的是軟件運(yùn)行的硬件平臺(tái),這是系統(tǒng)分析的因有問(wèn)題,涉及到制造能力和成本問(wèn)題,這些問(wèn)題遠(yuǎn)遠(yuǎn)超出本書的討論范圍。為了限定問(wèn)題邊界,以便展示軟件分析設(shè)計(jì)問(wèn)題,我們做以下戰(zhàn)略性的假定:a、處理器(即CPU采用PC或手持式備式的。b、時(shí)間和日期由一個(gè)時(shí)鐘提供。c、通過(guò)遠(yuǎn)程的傳感器來(lái)測(cè)量溫度、氣壓和濕度。d、用一個(gè)帶有風(fēng)向標(biāo)(能感知16個(gè)方向中任一方向的風(fēng))和一些風(fēng)杯(推動(dòng)計(jì)數(shù)器對(duì)回轉(zhuǎn)進(jìn)行計(jì)數(shù))的標(biāo)注來(lái)測(cè)量風(fēng)速和風(fēng)向。e、通過(guò)小鍵盤提供用戶輸入。f、顯木器是一一個(gè)現(xiàn)貨LCD圖形設(shè)備。g、計(jì)算機(jī)每1/60秒有一次定時(shí)器中斷。圖11-1提供一個(gè)部署圖來(lái)說(shuō)明這個(gè)硬件平臺(tái)在這個(gè)問(wèn)題上,我們已經(jīng)選擇放棄一些俄硬件,這樣就可以更好的聚焦在系統(tǒng)軟件上。顯然,去掉一些硬件(如去掉一些用戶輸入和圖形設(shè)備的硬件)就可能需要更多的軟件,但在這個(gè)特定的應(yīng)用中,改變硬件/軟件的界限對(duì)我們的面向?qū)ο蠹軜?gòu)來(lái)說(shuō),在很大的是無(wú)足輕重的。確實(shí),面向?qū)ο笙到y(tǒng)的特征之一就是傾向于用問(wèn)題的詞匯說(shuō)話,從而描繪出一個(gè)與問(wèn)題的關(guān)鍵實(shí)體的抽象相并行的虛擬機(jī)。改變系統(tǒng)硬件得到細(xì)節(jié)僅僅影響對(duì)系統(tǒng)底層的抽象。通過(guò)圍繞每一個(gè)這樣的接口包裝一個(gè)類,硬件接口的細(xì)節(jié)很容易從軟件抽象隔離。例如,可以設(shè)計(jì)出一個(gè)簡(jiǎn)單的類來(lái)訪問(wèn)當(dāng)前的日期。首先對(duì)這個(gè)隔離類進(jìn)行分析,考慮這個(gè)抽象應(yīng)當(dāng)扮演的角色和承擔(dān)的職責(zé)。這樣,我們就可以決定,這個(gè)類負(fù)責(zé)追蹤當(dāng)前的日期和時(shí)間,包括時(shí)、分秒、月、日和年。我們的分析可能會(huì)決定將這些職責(zé)轉(zhuǎn)變?yōu)檫B個(gè)服務(wù),分別表示為操作currentTime和currentDate。操作currentTime返回以下格式的字符串:13:56:42表示當(dāng)前的時(shí)、分和秒操作currentDate返回以下格式的字符串:6-10-93表示當(dāng)前的月、日和年。進(jìn)一步分析可以得出一個(gè)更加完善的抽象,允許客戶選擇12小時(shí)制或24小時(shí)制的時(shí)間格式,我們可以為這種抽象提供一個(gè)另外的更改操作setFormat。通過(guò)從公開(kāi)客戶的視角來(lái)指定這個(gè)抽象行為,我們將接口和實(shí)現(xiàn)做了清晰的分離。基本的思想是對(duì)每一個(gè)類建立外部視圖,就好像已經(jīng)完全控制了它下面的平臺(tái),然后將類的實(shí)現(xiàn)作為通向它內(nèi)部視圖的橋梁。這樣,在系統(tǒng)硬件/軟件邊界處的類的實(shí)現(xiàn)就將抽象的外部視圖同它下面的平臺(tái)銜接在一起,下面的平臺(tái)是受系統(tǒng)決策約束的,而系統(tǒng)的決策并不掌握在軟件工程師的手中。當(dāng)然,抽象的內(nèi)外視圖之間的鴻溝并非大的需要一個(gè)厚重而低效的實(shí)現(xiàn)來(lái)粘合它們。因此,時(shí)間和日期類的職責(zé)必須包括設(shè)定時(shí)間和日期。完成這個(gè)職責(zé)需要新的服務(wù)集來(lái)進(jìn)行,我們通過(guò)以下操作提供:setHour、setMinute、setSecond、setDay、setMonth和setYear。下面總結(jié)以下時(shí)間/日期類的抽象。類名:TimeDate職責(zé):跟蹤當(dāng)前的時(shí)間和日期。操作:currentTimecurrentDatesetFormatsetHoursetMinutesetSecondsetMonth

setYear屬性:timedate這個(gè)類的實(shí)例有動(dòng)態(tài)的生命周期,這一點(diǎn)可以從如圖11-2所示的狀態(tài)轉(zhuǎn)換圖中看出??梢钥吹剑跏蓟?,類的實(shí)例重新設(shè)置它的time和date屬性,然后無(wú)條件地進(jìn)入Running狀態(tài),運(yùn)行24-hourmode狀態(tài)下。一旦在Running狀態(tài),setFormat操作可以將對(duì)象的運(yùn)行模式在12-hourmod褥口24-hourmode之間切換。無(wú)論對(duì)象處于哪種嵌套狀態(tài),設(shè)置時(shí)間內(nèi)和日期都會(huì)引起對(duì)象重新規(guī)范化它的屬性。同樣地,請(qǐng)求時(shí)間或日期也會(huì)引起對(duì)象計(jì)算一個(gè)新的字符串值。圖對(duì)上面4個(gè)具體類(TemperatureSensor、PressureSensorHumiditySensor和WindspeesdSensor)進(jìn)行快速的領(lǐng)域分析,可以揭示另一個(gè)共同的行為:這些類都可以根據(jù)兩個(gè)已知的數(shù)據(jù)點(diǎn),用線性內(nèi)插法來(lái)校正自己。我們不是將這個(gè)行為復(fù)制到4個(gè)類中,而是創(chuàng)建一個(gè)更高一級(jí)的超類CalibratingSensor來(lái)負(fù)責(zé)這個(gè)行為,它的規(guī)格說(shuō)明如下。類名:類名:CalibratingSensor職責(zé):給定兩個(gè)已知數(shù)據(jù)點(diǎn),提供線性插值的值。操作:currentvalueseHighValuesetLowValueCalibratingSensor是HistoricalSensor的直接超類。最后一個(gè)具體傳感器一風(fēng)向傳感器有點(diǎn)不同,它既不需要校正也不需要報(bào)告歷史趨勢(shì),這個(gè)實(shí)體的抽象可以表示為下面的規(guī)格說(shuō)明。類名:windDirectionSensor職責(zé):跟蹤當(dāng)前風(fēng)向,表示為羅盤圖上的點(diǎn)。操作:currenDirection屬性:direction為了統(tǒng)一傳感器抽象,我們創(chuàng)建抽象基類Sendor,它是類windDirectionSensor和類Calibratingsensor的直接超類。圖11-4說(shuō)明了這個(gè)完整的層次結(jié)構(gòu)。雖然用于用戶輸入的小鍵盤抽象不是傳感器類層的一部分,但是它有一個(gè)簡(jiǎn)單的規(guī)格說(shuō)明。圖類名:Keypad職責(zé):跟蹤最近一次用戶輸入。操作:lastKeyPress屬性:key值得注意的是,這個(gè)類對(duì)任何特定鍵的含義一無(wú)所知,它的實(shí)例僅僅知道幾個(gè)鍵申的一個(gè)被按下。我們將解釋這些鍵的含義的職責(zé)委托給不同的類,我們將確定什么時(shí)候把這些具體的邊界類應(yīng)用到場(chǎng)景中。LCDDevice類的抽象可以將軟件與可能使用的特定硬件隔離。為了解除軟件與可能使用的特定圖形硬件之間的藕合,分析促使我們?nèi)プ鰵庀蟊O(jiān)測(cè)系統(tǒng)的一些常用顯示畫面的原型,然后確定界面需求。圖11-5提供了這樣一個(gè)原型。在這個(gè)原型中,我們省略了風(fēng)冷度和露點(diǎn)的顯示需求,也省略一些細(xì)、么例如,如何顯示主要測(cè)量數(shù)據(jù)在過(guò)去24小時(shí)內(nèi)的最高值或最低值。但是,出現(xiàn)了某些模式:我們只需要顯示文本(以兩種不同的大小和兩種不同的風(fēng)格)、圓和線(粗細(xì)不同)。此外,我們還注意到,顯示的一些元素是靜態(tài)的(如TEMP標(biāo)簽),另外一些元素是動(dòng)態(tài)的(如風(fēng)向)。我們選擇通過(guò)軟件來(lái)顯示這些靜態(tài)和動(dòng)態(tài)元素。這樣,LCD自身就不需要特別的標(biāo)簽,從而減輕硬件的負(fù)擔(dān),但同時(shí)也會(huì)稍微增加軟件的工作量。圖可以將這些需求轉(zhuǎn)換成以下的類規(guī)格說(shuō)明。類名:LCDDevice職責(zé):管理LC陽(yáng)備,為顯示某些圖形元素提供服務(wù)。操作:drawTeXtdrawLlnedrawClrclesetTeXtSIzesetTeXtStylesePenSIze正像類Keypad一樣,類LcDDevice并不知道它所操縱的元素的含義。該類的實(shí)例僅僅知道怎樣顯示文字和直線,而不知道這些圖形代表什么。這種關(guān)注分離留給我們松藕合的抽象(這正是我們想要的),但是這需要我們找到一個(gè)代理,負(fù)責(zé)協(xié)調(diào)原始的傳感器和顯示器。我們推遲創(chuàng)建這個(gè)新的抽象,直到研究這個(gè)系統(tǒng)的一些應(yīng)用場(chǎng)景之后。最后一個(gè)需要考慮的邊界類是關(guān)于定時(shí)器的。我們將做出一個(gè)簡(jiǎn)化的假定,每個(gè)系統(tǒng)中有且只有一個(gè)定時(shí)器,它每間隔1160秒向計(jì)算機(jī)發(fā)出中斷,調(diào)用一個(gè)中斷服務(wù)例程。這個(gè)細(xì)節(jié)特別鱉腳,如果能夠?qū)ζ渌能浖橄箅[藏這個(gè)實(shí)現(xiàn)細(xì)節(jié),那是最好的。我們可以設(shè)計(jì)一個(gè)類,它使用回調(diào)函數(shù),并且僅僅提供靜態(tài)成員(這樣就限制了系統(tǒng)中只有一個(gè)定時(shí)器)。圖11-6提供了一個(gè)序列圖來(lái)說(shuō)明這個(gè)抽象的一個(gè)用例。從圖中可以看出定時(shí)器如何與他的客戶合作:首先,客戶提供一個(gè)回調(diào)函數(shù),然后每隔1/60秒定時(shí)器調(diào)用這個(gè)函數(shù)。在這種方式中??蛻舨槐浦涝趺慈ソ厝《〞r(shí)事件,定時(shí)器也不必要知道當(dāng)這樣一個(gè)定時(shí)事件出現(xiàn)時(shí)該怎么做。這個(gè)協(xié)議對(duì)客戶要求的主要職責(zé)比較簡(jiǎn)單,客戶必須在1/60秒之內(nèi)執(zhí)行完其回調(diào)函數(shù),否則定時(shí)器將錯(cuò)過(guò)一個(gè)事件由于要截取定時(shí)事件,Timer類應(yīng)當(dāng)是一個(gè)主動(dòng)的抽象,,這就意味著它處于控制線程的根部。下面是這個(gè)類抽象的規(guī)格說(shuō)明。類名:Tinier職責(zé):截取定時(shí)事件,并相應(yīng)地調(diào)用一個(gè)回調(diào)函數(shù)。操作:setCallback11.1.3場(chǎng)景我們已經(jīng)在系統(tǒng)邊界處建立了抽象,現(xiàn)在通過(guò)研究幾個(gè)使用場(chǎng)景來(lái)繼續(xù)分析。首先列出一些主要用例(參見(jiàn)圖11-7),這些用例是從系統(tǒng)客戶的觀點(diǎn)來(lái)看的。監(jiān)測(cè)基本的氣象測(cè)量數(shù)據(jù),包括風(fēng)速、風(fēng)向、溫度、氣壓和濕度。.監(jiān)測(cè)導(dǎo)出的測(cè)量數(shù)據(jù),包括風(fēng)冷度、露點(diǎn)、溫度趨勢(shì)和氣壓趨勢(shì)。顯示選定測(cè)量數(shù)據(jù)的最高值和最低值。、設(shè)置時(shí)間和日期。校正選定的傳感器啟動(dòng)系統(tǒng)。在增加兩個(gè)次要用例:電源故障傳感器故障11.2細(xì)化為了闡明系統(tǒng)的行為(但不是設(shè)計(jì)),讓我們考察以下這些場(chǎng)景。氣象監(jiān)測(cè)系統(tǒng)用例監(jiān)測(cè)基本的氣象測(cè)量數(shù)據(jù)是氣象監(jiān)測(cè)系統(tǒng)的首要功能點(diǎn)。其中一個(gè)系統(tǒng)約束是:不可能在1秒內(nèi)測(cè)量60次以上。幸運(yùn)的是,大多數(shù)感興趣的氣象條件的改變要慢得多。通過(guò)分析,我們提出了以下采樣速率,這些速率能夠充分地捕獲氣象狀況的改變?!鲲L(fēng)向:每0.1秒。.風(fēng)速:每0.5秒。■溫度、氣壓和濕度:每五分鐘。早先我們已經(jīng)決定,表示每個(gè)主要傳感器的類不負(fù)擔(dān)處理定時(shí)事件的職責(zé)。因此我們的分析需要設(shè)計(jì)一個(gè)外部代理來(lái)協(xié)助這些傳感器完成這個(gè)場(chǎng)景。我們暫時(shí)推遲對(duì)代理的行為進(jìn)行規(guī)格說(shuō)明(它如何知道什么時(shí)候去初始化一個(gè)采樣屬于設(shè)計(jì)問(wèn)題而不是分析問(wèn)題)。如圖11-8所示的交互圖闡述了這個(gè)場(chǎng)景。從圖中可以看出,當(dāng)代理開(kāi)始采樣時(shí),它依次查詢每一個(gè)傳感器,但為了降低采樣速率,故意跳過(guò)了一些傳感器。我們輪詢傳感器而不是讓傳感器作為一個(gè)控制線程,這樣系統(tǒng)的執(zhí)行就是可預(yù)測(cè)的,因?yàn)榇砜梢钥刂剖录鳌_@個(gè)名字也反映了它在系統(tǒng)行為中的位置,所以我們讓這個(gè)代理成為類Sampler的一個(gè)實(shí)例。要繼續(xù)這個(gè)場(chǎng)景,我們必須詢問(wèn)交互圖的對(duì)象中哪一個(gè)對(duì)象負(fù)責(zé)將采樣值顯示在類LCDDevice的一個(gè)實(shí)例上。最終,我們有兩個(gè)選擇:要么讓每一個(gè)傳感器孕責(zé)顯示它自己(類MV歐構(gòu)中常用的模式),要么創(chuàng)建一個(gè)分離的對(duì)象負(fù)責(zé)這個(gè)行為。對(duì)這個(gè)特定的問(wèn)題,我們選擇后者,因?yàn)樗鼘⑺嘘P(guān)于顯示布局的設(shè)計(jì)決策封裝到一個(gè)類中。4這樣,就可把下面的類規(guī)格說(shuō)明加入分析產(chǎn)物中。類名:DisplayManager職責(zé):管理LCD設(shè)備上顯示項(xiàng)的布局。操作:drawStaticItemsdisplayTimedisplayDatedisplayTemperaturedisplayHumiditydisplayPressuredisplayWindChilldisplayDewPoint4這里的主要問(wèn)題是我們?cè)谑裁吹胤斤@示每一項(xiàng),而不是每一項(xiàng)看起來(lái)怎么樣。因?yàn)檫@是一個(gè)可能改變的決策,所以最好把在LCD設(shè)備何處顯示每一項(xiàng)的所有知識(shí)封裝在一個(gè)類中。因此,改變我們關(guān)于前端面板布局的假設(shè),只需要修改一個(gè)類而不是多個(gè)類。displayWindSpeeddisplayWindDirectiondisplayHighLow操作drawStaticItems用來(lái)繪制顯示的不變部分,比如用來(lái)顯示風(fēng)向的羅盤。我們也假定操作displaykmperature.和操作displayPressure負(fù)責(zé)顯示它們相應(yīng)的趨勢(shì)(因此,當(dāng)我們轉(zhuǎn)到實(shí)現(xiàn)時(shí),必須為這些操作提供一個(gè)合適的簽名)。圖11-9提供了一個(gè)類圖,展示了協(xié)作完成這個(gè)場(chǎng)景所必需的抽象。同時(shí),圖中也顯示了每一個(gè)抽象在與其他類關(guān)聯(lián)時(shí)所扮演的角色。決定在系統(tǒng)中包含一個(gè)DisplayManager類,有一個(gè)重要的附帶作用。5具體來(lái)說(shuō),就是使軟件國(guó)際化(也就是使軟件適用于不同的國(guó)家和語(yǔ)言)容易得多,因?yàn)樵鯓用睾惋@示元素的知識(shí)(如TEMP和WIND是這個(gè)類的秘密的一部分。國(guó)際化要求我們考慮隱含的需求:系統(tǒng)應(yīng)當(dāng)以攝氏還是華氏顯示溫度?類似地,系統(tǒng)應(yīng)當(dāng)以公里每小時(shí)(k/h)還是英里每小時(shí)(m/h)顯示風(fēng)速?最終,我們的軟件不5這是一個(gè)分析決策還是設(shè)計(jì)決策??jī)煞N答案都有其道理,雖然在不得不交付的產(chǎn)品軟件面前,這樣的討論主要是學(xué)術(shù)上的。如果一個(gè)決策能夠提升我們對(duì)系統(tǒng)所需行為的理解,另外還引導(dǎo)我們得到一個(gè)優(yōu)雅的架構(gòu),我們實(shí)際上并不介意它叫什么。應(yīng)受到限制。因?yàn)橐獮樽罱K用戶提供靈活性,所以必須在TemperatureSensor和WindSpeedSensor類中增加一個(gè)操作setMode。也必須給這些類增加一個(gè)新的職責(zé),使它們的實(shí)例在一個(gè)已知的穩(wěn)定狀態(tài)構(gòu)造自己。最后,必須相應(yīng)地修改操作DisplayManager::drawStaticItems的簽名,以便在改變測(cè)量數(shù)據(jù)的單位時(shí),顯示管理器能夠在需要時(shí)更新前端面面板。這個(gè)發(fā)現(xiàn)促使我們?yōu)榉治鲋械目紤]增加一個(gè)場(chǎng)景,即:.設(shè)置溫度和風(fēng)速的測(cè)量單位。我們將推遲考慮這個(gè)場(chǎng)景,直到研究處理用戶交互的其他用例之后。我們可以通過(guò)已經(jīng)建立的TemperatureSensor和PressureSensor類的協(xié)議!來(lái)監(jiān)測(cè)導(dǎo)出的溫度和壓力趨勢(shì)的測(cè)量數(shù)據(jù)。但是,為了完成所有的導(dǎo)出測(cè)量數(shù)據(jù)場(chǎng)景,需要?jiǎng)?chuàng)建兩個(gè)新類,即WindChill和DewPoint,負(fù)責(zé)計(jì)算它們各自的值。這兩個(gè)抽象都不代表傳感器,不指代系統(tǒng)中的任何有形設(shè)備。它們各自作為代理與其他兩個(gè)類協(xié)作完成各自的職責(zé)。具體地說(shuō),WindChill與TemperatureSensor和WindSpeedSensor協(xié)作,DewPoint與TemperatureSensor和HumiditySensor協(xié)作。而WindChill和DewPoim與,Samoler協(xié)作,所使用的機(jī)制與Samp1er用來(lái)監(jiān)測(cè)所有主要?dú)庀鬁y(cè)量數(shù)據(jù)的機(jī)制相同。圖11-10說(shuō)明了這個(gè)場(chǎng)景中涉及的類?;旧希@個(gè)類圖與圖11-9展示的系統(tǒng)視圖略有不同。為什么將WindChill和DewPoint定義為類,而不是通過(guò)一個(gè)簡(jiǎn)單的非成員函數(shù)來(lái)完成它們的計(jì)算?答案是這種情況通過(guò)了我們的面向?qū)ο蟪橄蟮呐袛鄿y(cè)試:WindChill和DewPoint的實(shí)例提供某種行為(即計(jì)算它們各自的值),并分裝一些狀態(tài)(每一個(gè)必須維持與兩個(gè)不同具體傳感器中的一個(gè)特定實(shí)例之間的聯(lián)系),它們各自都有唯一的標(biāo)識(shí)(每一個(gè)特定的風(fēng)速傳感器/溫度傳感器關(guān)聯(lián)必須有它自己的WindChill對(duì)象。通過(guò)“對(duì)象化”這些貌似算法的抽象,可以得出一個(gè)更加重要的架構(gòu):WindChill和DewPoint可以從這個(gè)特定應(yīng)用中提取出來(lái),因?yàn)閷?duì)于客戶它們呈現(xiàn)出清晰的契約,相對(duì)于其他抽象,它們各自提供清晰的分離關(guān)注。下一步要考慮的是涉及客戶與氣象監(jiān)控系統(tǒng)交互的不同場(chǎng)景。設(shè)計(jì)一個(gè)圖形用戶界面一樣,決定用戶與這樣的嵌入式控制器進(jìn)行交互的恰當(dāng)動(dòng)作,也是一門藝術(shù)。全面描述如何設(shè)計(jì)這樣的用戶界面超出了文本的范圍,但這是提供給軟件分析人員的基本信息是原型有效,并且從根本上有助于緩解用戶界面的風(fēng)險(xiǎn)。而且,根據(jù)面向?qū)ο罂蚣軄?lái)實(shí)現(xiàn)我們的決策,使得改變這些用戶界面決策要相對(duì)容易一些,不必破壞設(shè)計(jì)的框架。請(qǐng)考慮一些可能的用戶交互用例場(chǎng)景。用例名:DisplayMaxandMinValueofMeasurements描述:這個(gè)用例顯示所選測(cè)量數(shù)據(jù)的最高值和最低值基本步驟:(1)用戶按下SELECT1時(shí),用例開(kāi)始。(2)系統(tǒng)顯示SELECTING.(3)用戶按下WIND,TEMP,PRESSUREHUMIDITY鍵中的任何一個(gè),其他按鍵(除RUN被忽略。(4)系統(tǒng)顯示相應(yīng)的標(biāo)簽。(5)用戶按下UP或DOWN用例分別選擇顯示24小時(shí)中的最高值和最低值。(6)系統(tǒng)顯示所有值,同時(shí)顯示該值出現(xiàn)的時(shí)間。(7)控制返回步驟3或5。注意:用戶可以按下RUN8來(lái)提交或放棄操作,此時(shí),正在閃爍的信息,選擇這樣的值和SELECTING!息將消失。這個(gè)場(chǎng)景引導(dǎo)我們?cè)贒isplayManager類中增加兩個(gè)操作flashLable(它根據(jù)適當(dāng)?shù)牟僮髯兞縼?lái)識(shí)別標(biāo)簽或停止閃爍)和displayMode(它們LC陽(yáng)備上顯示一條文本信息)。設(shè)置時(shí)間和日期的場(chǎng)景與上面的場(chǎng)景相似。用例名:SetDateandTime描述:這個(gè)用例設(shè)置日期和時(shí)間?;静襟E:(1)當(dāng)用戶按下SELECT1時(shí),用例開(kāi)始。(2)系統(tǒng)顯示SELCTING(3)用戶按下TIME或DATE鍵中任一個(gè),其他按鍵(處%RUN和上面場(chǎng)景的步驟3所列出的鍵外)被忽略(4)系統(tǒng)閃爍相應(yīng)的標(biāo)簽,同時(shí)閃爍選擇項(xiàng)的第一個(gè)字段(即時(shí)間的小時(shí)字段和日期的月份字段)。(5)用戶按下LEFT或RIGHT鍵來(lái)選擇另外的字段(選擇考研來(lái)回移動(dòng)一),用戶按下UP或DOWN來(lái)升高或降低被選中的字段的值。(6)控制返回步驟3或5。注意:用戶可以按下RUN1來(lái)提交或放棄操作,此時(shí)正在閃爍的信息和SELECTIN鶴息消失,時(shí)間和日期被重置。使用以下用戶動(dòng)作的相關(guān)模式來(lái)校正特定的傳感器。用例名:CalibrateSensor描述:這個(gè)用例用于校正傳感器?;静襟E:(1)當(dāng)用戶按下CALIBRATE1時(shí),用例開(kāi)始(2)系統(tǒng)顯示CALIBRATE(3)用戶按下WINDTEMPPRESSUREHUMIDITY?中的任何一個(gè),其他按鍵(除RUN7卜)被忽略。(4)系統(tǒng)閃爍相應(yīng)的標(biāo)簽。(5)用戶按下UP或DOWN來(lái)選擇高校正點(diǎn)或低校正點(diǎn)。(6)顯示器閃爍相應(yīng)值。(7)用戶按下UP或DOWN未調(diào)整選中的值。⑹控制返回步驟3或5。注意:用戶可以按下RUN?來(lái)提交或放棄操作,此時(shí)正在閃爍的信息和CALIBRATIN嘴息消失,校正功能被重置。校正時(shí),類Sampler的實(shí)例必須被告知停止采樣所選項(xiàng),否則錯(cuò)誤的信息將被顯示給用戶。因此,這個(gè)場(chǎng)景需要我們?cè)陬怱ampler中引入兩個(gè)新的操作inhibitSample和resumeSample,它們都有一個(gè)指定特定測(cè)量的簽名。最后一個(gè)涉及用戶界面的主要場(chǎng)景是關(guān)于設(shè)置測(cè)量單位的。用例名:SetUnitofMeasurement描述:這個(gè)用例用于設(shè)置溫度和風(fēng)速的測(cè)量單位?;静襟E:(1)當(dāng)用戶按下MODE1時(shí),用例開(kāi)始。⑵系統(tǒng)顯示MODE.(3)用戶按下WIND,TEMP^中任何一個(gè),其他按鍵(除RUN外),被忽略。(4)系統(tǒng)閃爍相應(yīng)的標(biāo)簽。(5)用戶按下UP和DOWN按來(lái)切換當(dāng)前的測(cè)量單位。(6)系統(tǒng)更新選擇項(xiàng)的測(cè)量單位。⑺控制返回步驟3或5。此時(shí)正在閃注意:用戶可以按下RUN鍵來(lái)提交或放棄操作,此時(shí)正在閃爍的信息和MODE消息消失,測(cè)量項(xiàng)的當(dāng)前單位被設(shè)置用過(guò)研究這些場(chǎng)景,可以確定小鍵盤上按鍵的排列(這是一個(gè)系統(tǒng)決策),如圖11—11所示。這些用戶界面的每一個(gè)都涉及某些形式的模態(tài)或有序事件的行為,很適合用狀態(tài)轉(zhuǎn)換圖來(lái)表達(dá)。因?yàn)檫@些場(chǎng)景耦合的如此緊密,所以我們?cè)O(shè)計(jì)一個(gè)新類,InputManager來(lái)負(fù)責(zé)完成下面的契約行的規(guī)格。類名:InputManager職責(zé):管理和分派用戶輸入。操作:proecssKeyPress唯一的操作proecssKeyPress激活存活于這個(gè)實(shí)例之后的狀態(tài)機(jī)。如圖11—12所示,這個(gè)類的最外層狀態(tài)機(jī)圖包括4個(gè)狀態(tài):Running,Calibrating,Selecting和Mode。這些狀態(tài)直接對(duì)應(yīng)于前述的場(chǎng)景,根據(jù)Running狀態(tài)時(shí)截獲的第一個(gè)按鍵來(lái)轉(zhuǎn)換各自的狀態(tài),當(dāng)最后的按鍵是Run時(shí)返回Running狀態(tài)。每進(jìn)入running時(shí),顯示板上的消息被清除我們展開(kāi)了mode狀態(tài),以展示如何更正規(guī)的表達(dá)場(chǎng)景的動(dòng)態(tài)語(yǔ)義。當(dāng)進(jìn)入這個(gè)狀態(tài)時(shí),進(jìn)入動(dòng)作時(shí)顯示板上顯示適當(dāng)?shù)南?。首先是在waiting狀態(tài),此時(shí)如果截獲用戶的temp或wind按鍵事件,則轉(zhuǎn)出waiting狀態(tài)進(jìn)入一個(gè)嵌套的狀態(tài)。每次進(jìn)入processing,如果截獲的是run鍵,則轉(zhuǎn)回最外層的runnjing狀態(tài)。每次進(jìn)入processing狀態(tài)時(shí),閃爍適當(dāng)?shù)捻?xiàng),隨后進(jìn)入這個(gè)狀態(tài)時(shí),進(jìn)入以前進(jìn)入過(guò)的嵌套狀態(tài)temp或wind。在temp或wind狀態(tài),我們可以截獲五個(gè)按鍵中的任何一個(gè):up或downtemp或wind或者run。類似地,selecting和calibrating狀態(tài)也可以展開(kāi),以揭示更多的嵌套狀態(tài)。這里不給出展開(kāi)的狀態(tài)圖,因?yàn)閷?duì)于目前的問(wèn)題,不會(huì)揭示出特別有用的信息。最后一個(gè)主要的涉及系統(tǒng)啟動(dòng),它要求我們以一個(gè)有序的方式來(lái)激活所有的對(duì)象,而且要確保每個(gè)對(duì)象從一個(gè)穩(wěn)定的初始狀態(tài)開(kāi)始。下面針對(duì)這個(gè)場(chǎng)景作出分析后編寫的腳本。用例名:poweron描述:?jiǎn)?dòng)系統(tǒng)?;静襟E:1、當(dāng)電源接通時(shí),用例開(kāi)始。2、構(gòu)造每一個(gè)傳感器。有歷史數(shù)據(jù)的傳感器清除其歷史數(shù)據(jù),趨勢(shì)傳感器準(zhǔn)備好它們的斜率計(jì)算算法。3、初始化用戶輸入緩沖區(qū),無(wú)用按鍵被拋棄。

4、繪制靜態(tài)的顯示元素。5、初始化采樣過(guò)程。后置條件:每一個(gè)主要測(cè)量數(shù)據(jù)的過(guò)去高低值被設(shè)置成首次采樣的值和時(shí)間。溫度和氣壓趨勢(shì)斜率為0。inputmanager處于runnging狀態(tài)。注意,上面腳本中使用后知條件來(lái)說(shuō)明這個(gè)場(chǎng)景完成后期望的系統(tǒng)狀態(tài)。我們將會(huì)看到,系統(tǒng)中沒(méi)有代理來(lái)完成這個(gè)場(chǎng)景。這個(gè)行為是由許多對(duì)象協(xié)作產(chǎn)生的,每一個(gè)對(duì)象都被賦予職責(zé),將自己帶到一個(gè)穩(wěn)定的初始狀態(tài)。這樣就完成了對(duì)氣象監(jiān)測(cè)系統(tǒng)主要場(chǎng)景的研究。為了徹底的完成分析,需要進(jìn)入不同的次要場(chǎng)景。然而,此時(shí)已經(jīng)發(fā)現(xiàn)了足夠多的系統(tǒng)功能點(diǎn),我們想繼續(xù)進(jìn)行構(gòu)架設(shè)計(jì),這樣就可以開(kāi)始驗(yàn)證我們的戰(zhàn)略決策。每一個(gè)軟件系統(tǒng)都需要有一種簡(jiǎn)單而強(qiáng)有力的組織哲學(xué),氣象監(jiān)測(cè)系統(tǒng)也不例外。開(kāi)發(fā)過(guò)程的下一步是清楚地表達(dá)這個(gè)構(gòu)架框架,這樣就可以有一個(gè)穩(wěn)定的基礎(chǔ)來(lái)演化系統(tǒng)的功能點(diǎn)。11.2.2構(gòu)架框架在數(shù)據(jù)采集的過(guò)程控制領(lǐng)域,有許多可以遵循的構(gòu)架模式,其中兩個(gè)最普通的模式是自動(dòng)執(zhí)行者同步和基于時(shí)間幀的處理。在第一種模式中,我們的構(gòu)架也包括許多相對(duì)獨(dú)立的對(duì)象,它們中的每一個(gè)都充當(dāng)一個(gè)控制線程例如,可以創(chuàng)建若干個(gè)新的基于原中的每一個(gè)都充當(dāng)一個(gè)控制線程例如,可以創(chuàng)建若干個(gè)新的基于原始硬件/軟件抽象的傳感器對(duì)象,每個(gè)對(duì)象負(fù)責(zé)自己的采樣,然后向處理這些采樣的某個(gè)中央代理報(bào)告。這個(gè)構(gòu)架有它的優(yōu)點(diǎn);如果有一個(gè)分布式系統(tǒng),必須從許多遠(yuǎn)端收集樣本,那么這是唯一有意義的框架。這種構(gòu)架也允許進(jìn)行更多的局部采樣過(guò)程優(yōu)化。然而,這個(gè)構(gòu)架模式總體上不怎么適合于硬實(shí)時(shí)系統(tǒng)。在硬實(shí)時(shí)系統(tǒng)中,必須可以完全預(yù)測(cè)事件發(fā)生的時(shí)間。雖然氣象監(jiān)測(cè)系統(tǒng)不是硬實(shí)時(shí)系統(tǒng),但它確實(shí)需要少量可預(yù)測(cè)和有序的行為。出于這個(gè)原因,我們轉(zhuǎn)向另一種基于實(shí)時(shí)幀的處理模式。如圖11-13所示,這個(gè)模型是基于時(shí)間的,它將時(shí)間分成若干幀,幀又可以更進(jìn)一步的被分成子幀。每個(gè)子幀包括一些功能行為。從一個(gè)幀到另一個(gè)幀的活動(dòng)可能不同。例如,可以每隔10幀進(jìn)行一次風(fēng)向采樣。這種構(gòu)架模式的主要優(yōu)點(diǎn)就是能夠嚴(yán)格的的控制事件的順序。圖11-14提供了一張類圖,表達(dá)了氣象監(jiān)測(cè)系統(tǒng)的構(gòu)架。從圖中我們?cè)谠缙诜治鰰r(shí)發(fā)現(xiàn)的大多數(shù)類,主要的不同點(diǎn)是,現(xiàn)在是展現(xiàn)所有的關(guān)鍵抽象之間是怎么協(xié)作的。如不同的產(chǎn)品系統(tǒng)中常見(jiàn)的,我們不展示每個(gè)類和每個(gè)關(guān)系。例如,忽略關(guān)于所有傳感器的類層次關(guān)系。在這個(gè)構(gòu)架中,我們創(chuàng)建了一個(gè)名叫sensors的新類,他的職責(zé)是作為系統(tǒng)中所有物理傳感器的集合。由于在系統(tǒng)中至少有兩個(gè)其他代理必須與整個(gè)傳感器集合關(guān)聯(lián),把傳感器塞進(jìn)一個(gè)容器類中可以讓我們將系統(tǒng)中的傳感器作為一個(gè)邏輯整體來(lái)對(duì)待。構(gòu)造Samplersampler;Samplersampler;這個(gè)架構(gòu)的主要行為是由Sampler和Timer類協(xié)作完成的,因此子啊架構(gòu)設(shè)計(jì)期間,具體化這些類的原型是明智的做法,這樣就可以驗(yàn)證我們的設(shè)想。幀機(jī)制我們從細(xì)化類Timer的接口開(kāi)始介紹,該類調(diào)用回調(diào)函數(shù)。圖11-15展示了類設(shè)計(jì)。Timer是一個(gè)與眾不同的類,但要記住,它擁有一些不尋常的秘密。我們用第一個(gè)操作setCallback來(lái)為定時(shí)器加上一個(gè)回調(diào)函數(shù)。通過(guò)調(diào)用startTiming來(lái)啟動(dòng)定時(shí)器的行為,此后Timer實(shí)體每隔1/60秒調(diào)用該回函數(shù)。注意,這里引入一個(gè)顯示的啟動(dòng)操作,因?yàn)樵诼暶鞯募?xì)化過(guò)程中,我們不能依靠任何特定的“依賴于實(shí)現(xiàn)”的次序。在轉(zhuǎn)到Sampler類之前,先引入一個(gè)新的聲明,用來(lái)命名這個(gè)特定系統(tǒng)中的不同傳感器。枚舉類SensorNam也含了系統(tǒng)里的所有傳感器的名稱列舉,圖11-16展示了Sampler類的接口。在引入修改器setSamplingRate及其選擇器samplingRate后,用戶就可以動(dòng)態(tài)改變采樣對(duì)象的行為。為了將Timer和Sampler類黏在一起,我們需要少許的C++粘合代碼。首先聲明一個(gè)Sampler類的實(shí)例和一個(gè)非成員函數(shù),代碼如下Voidacquire(Tickt){Samlper.sampler(t);}現(xiàn)在我們可以寫一個(gè)主函數(shù)片段,它僅僅將回調(diào)函數(shù)加到定時(shí)器并啟動(dòng)采樣過(guò)程,代碼如下:Main(){Timer::setCallback(acquire);Timer::startTiming();While(1){;}Return0;}這是一個(gè)相當(dāng)電信的面相對(duì)象系統(tǒng)的主程序。它比較短(因?yàn)閷?shí)際的工作被委托給系統(tǒng)中的關(guān)鍵對(duì)象),包括一個(gè)分派循環(huán)(在這里,循環(huán)沒(méi)有做任何事情,因?yàn)闆](méi)有后臺(tái)處理需要完成)。繼續(xù)討論系統(tǒng)架構(gòu),下一步為Sensors類提供一個(gè)接口(見(jiàn)圖11-17)。我們假定存在不同的具體傳感器器類。從根本上說(shuō),這是一個(gè)集合類型的類,因此,我們使類Sensors成為基礎(chǔ)類Collection的一個(gè)子類。我們將Collection定義為一個(gè)受保護(hù)的超類,因?yàn)椴幌雽⑺拇蟛糠植僮鞅┞督oSensorsa的客戶。Sensors的聲明僅提供少量的操作,因?yàn)槲覀兊膯?wèn)題受到嚴(yán)格限制,傳感器只能增加而不能從集合中刪除。我們已經(jīng)創(chuàng)建了一個(gè)泛化的傳感器集合類,它能夠容納同一種傳感器的多個(gè)實(shí)例,每一個(gè)實(shí)例可以用唯一的ID來(lái)區(qū)分一一這些ID從0開(kāi)始。在Sampler類里指定與Sensors和DisplayManager類的關(guān)聯(lián),并修改Sampler類的一個(gè)實(shí)例的聲明,如圖11-18所示。這個(gè)類的協(xié)議是從前面的分析得來(lái)的。我們?cè)黾恿瞬僮鱥nputPending,這樣,當(dāng)存在尚未被處理的用戶時(shí),客戶就可以查詢。類InputManager有一個(gè)類似的簡(jiǎn)單接口,如圖11-28所示。正如我們將看到的,這個(gè)類大多數(shù)有趣的工作是在它的有限狀態(tài)機(jī)的實(shí)現(xiàn)中完成的。正如圖11-14中所說(shuō)的那樣,Sampler、InputManager和Keypad類的實(shí)例作響應(yīng)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論