專利名稱:用于實時系統(tǒng)控制的組件模型的制作方法
根據(jù)35 U.S.C.119(e),本專利申請要求序列號為60/357329,申請日為2002年2月15日,標題為“用于實時系統(tǒng)控制的組件模型”的美國臨時專利申請的優(yōu)先權(quán),其全部內(nèi)容在此引入作為參考。
背景技術(shù):
許多不同的努力需要客戶軟件來解決他們的問題。通常各領(lǐng)域?qū)<曳浅A私膺@些問題,諸如建筑自動化專家、工廠自動化專家和交通管制專家。然而很少有領(lǐng)域?qū)<揖哂衅胀ǔ绦蛟O(shè)計技術(shù)所需要的技能,諸如面向?qū)ο蟮某绦蛟O(shè)計。如今,各領(lǐng)域?qū)<冶仨氃噲D將他們的要求詳細說明給程序員,然后由程序員來構(gòu)建所需要的系統(tǒng)。該過程容易出現(xiàn)錯誤、費時并且伴隨著錯誤傳達。所需要的是理解問題空間的領(lǐng)域?qū)<揖哂心軌蜃约簶?gòu)建軟件系統(tǒng)的能力。期望領(lǐng)域?qū)<矣袝r間或傾向能夠變成專業(yè)程序員是不可行的。因此有必要提供一種工具,其使得外行也能夠創(chuàng)建客戶軟件。理想的這些工具會讓軟件系統(tǒng)的配置參數(shù)、執(zhí)行邏輯和數(shù)據(jù)是圖形可視化的。圖形工具會讓領(lǐng)域?qū)<夷軌騽?chuàng)建、監(jiān)控和改變軟件系統(tǒng),而不需要理解神秘的程序設(shè)計語言語法。
面向組件的系統(tǒng)是一種新概念,其通過將軟件功能封裝在組件中,可以連接組件來構(gòu)建應(yīng)對現(xiàn)實世界需要的應(yīng)用,從而提供某些特征。然而為了實現(xiàn)實際的系統(tǒng),已知的現(xiàn)有技術(shù)仍然需要程序設(shè)計語言的知識。軟件組件,到現(xiàn)在為止,仍然需要程序設(shè)計技巧將組件連接在一起創(chuàng)建功能性系統(tǒng)。而且,現(xiàn)有的組件技術(shù)并不允許領(lǐng)域?qū)<覍⒄麄€系統(tǒng)圖形可視化,和在運行時作出改變。例如,領(lǐng)域?qū)<铱赡軙M谶\行時改變執(zhí)行流程、或添加新的行為,并且希望能夠立即看到這對軟件系統(tǒng)有什么影響。這種探索性的程序設(shè)計方式與當前方案不一致,當前方案需要軟件停止、重新編譯、然后重新啟動。而且,為了改善性能添加特征等,可能會需要添加修改或更新該軟件。對于任何更新、添加或修改,當前方案再次需要軟件停止、重新編譯并重啟。在正在控制關(guān)鍵過程的某些環(huán)境中,停止軟件可能會特別困難。提供這種方案所存在的另一個具體困難是,需要允許領(lǐng)域?qū)<夷軌蛟鰪娀驍U展軟件組件,使它們適應(yīng)特定應(yīng)用領(lǐng)域的獨特需要。從歷史來看,這些添加或擴展需要常規(guī)的程序設(shè)計技巧和知識。本發(fā)明意欲解決這些問題和其它需要。
發(fā)明內(nèi)容
本發(fā)明的一個方面是軟件程序,其代碼包括用于在機器上執(zhí)行的相同組件類型的一個或多個組件。該軟件程序的組件通過特定方法產(chǎn)生。在該方法中,將包括一個或多個插槽定義(slot definition)的基本類(base class)提供給一個框架(framework),其中最少有一個插槽定義是屬性插槽定義?;绢愔械乃袑傩圆宀鄱x都被標識。對于每一屬性插槽定義,都定位獲取(getter)和設(shè)置(setter)過程。生成一個組件類型對象,其被配置用來存儲插槽定義。被標識的屬性插槽定義然后就被存儲于該組件類型對象中。生成一個或多個組件。這些組件中每一個都有槽映象(slotmap)對象,它是從槽映象類中被實例化的。每一槽映象對象也包括存儲于組件類型對象中的每一屬性插槽定義的值,每一值與單個組件關(guān)聯(lián),因而提供了存儲每一組件所獨有的數(shù)據(jù)的能力。
在該方面的進一步發(fā)展中,組件被設(shè)計為允許通過動態(tài)插槽來擴充它們的屬性和數(shù)據(jù)字段。
另一個方面提供有一種用于為基于組件的軟件系統(tǒng)的擴充自動指定名稱的方法。在該方法中,創(chuàng)建了一個根組件。該根組件沒有父組件。一個或多個非根組件被置于該根組件內(nèi),并且一個或多個其它非根組件則被置于非根組件內(nèi),這樣所有的非根組件都有父組件,并且整個結(jié)構(gòu)形成了樹型。在該點上,組件分配有唯一標識串,其包含該組件的所有前輩組件和該組件的名稱的順序列表。
在該方面的進一步發(fā)展中,擴充命名方法來標識組件的各個插槽。
通過對附圖和優(yōu)選實施例的描述,可以進一步的理解本發(fā)明的這些和那些方面以及特征和優(yōu)勢。
圖1所示為創(chuàng)建組件類型和該組件類型的多個組件實例的流程圖;圖2所示為從相同的組件類型中生成的兩個組件的框圖;圖3所示為包括動態(tài)插槽的組件系統(tǒng)的框圖;圖4所示為包括鏈接的組件系統(tǒng)的框圖;圖5A所示為包括鏈接的組件系統(tǒng)的組件級抽象概念的框圖,其中執(zhí)行細節(jié)被隱藏;圖5B所示為圖5A中所示組件系統(tǒng)的框圖;其中鏈接已經(jīng)被刪除;圖6所示為已經(jīng)重新編譯以提高效率的組件系統(tǒng)的框圖;和圖7所示為樹型結(jié)構(gòu)中組件系統(tǒng)的框圖;圖8所示為是可視化界面的操作流程圖。
具體實施例方式
本發(fā)明的組件模型提供一種軟件組件的獨特組件設(shè)計,其允許應(yīng)用開發(fā)者在適合于非程序員的圖形環(huán)境下擴展和修改軟件組件。該組件模型設(shè)計允許將新的插槽,諸如屬性、動作或主題,加入標準組件,而不需要通常所需要的軟件編碼步驟。
對于軟件開發(fā)的組件模型方式允許創(chuàng)建與最終使用應(yīng)用具有直接關(guān)系的軟件組件,同時仍然利用了面向?qū)ο蟮能浖O(shè)計的優(yōu)點。同樣的,組件比在純面向?qū)ο蟮姆绞街刑峁└邔哟蔚某橄蟾拍睢T趯ο蠓庋b了可以應(yīng)用于軟件功能(諸如串操作、提供緩沖管理等)的行為的地方,組件可組裝對象以滿足最終應(yīng)用目標(諸如提供用戶界面展示以改變時間表、檢查警報和將確認命令傳遞回到發(fā)出警報的裝置等)的需要。
這里有兩個層次的抽象概念一個是面向?qū)ο蟮膶哟?,其處理組件的實現(xiàn);另一個是組件的層次,其隱藏面向?qū)ο蟮膶哟?,并通過使用組件進行與特定現(xiàn)實應(yīng)用有關(guān)的應(yīng)用創(chuàng)建。至少也有兩類人可以運行和修改本發(fā)明的軟件開發(fā)者和用戶。開發(fā)者使用面向?qū)ο蟮母拍顚崿F(xiàn)本發(fā)明的組件模型。可選的,開發(fā)者也創(chuàng)建在組件層次所定義的功能。用戶通常不會看到面向?qū)ο蟮膶崿F(xiàn)。相反,用戶幾乎專門處理組件和監(jiān)控器,在組件層次創(chuàng)建和修改系統(tǒng)。當然,用戶和開發(fā)者可以是同一個人。
根據(jù)組件類型創(chuàng)建軟件程序內(nèi)的組件。組件類型類似于面向?qū)ο蟮某绦蛟O(shè)計中的類的概念,也就是,它是描述所有屬于該類型的組件實例的共同特征的抽象概念。在優(yōu)選實施例中,組件類型的創(chuàng)建以及大多數(shù)其它有關(guān)組件的功能由構(gòu)架來完成,有時候我們稱其為NiagaraTMFramework。該構(gòu)架是基于組件的軟件中的軟件模塊,其完成一些與實現(xiàn)組件模型相關(guān)的若干有用功能,諸如創(chuàng)建組件類型和組件、提供組件與外部軟件模塊之間的接口,和提供通過向他們添加插槽來擴展組件的能力,等等。包括在初始化(引導裝入)階段和在組件運行時,該構(gòu)架也提供用于軟件的執(zhí)行流。
面向?qū)ο蟪绦蛴深惤M成,其定義用來分配屬于該類的實例的模板。每一類由稱為成員的子部件組成。成員可以是用來存儲數(shù)據(jù)的字段,或可以是用來存儲可執(zhí)行行為的方法。
本發(fā)明描述了使用面向?qū)ο蟮脑蜆?gòu)建的組件模型。該組件模型然后可以被非程序員使用來構(gòu)建面向組件的程序。該組件模型由組件類型組成,其定義了用來分配屬于該類型(類似于面向?qū)ο蟮念?的實例的模板。每一組件類型由稱為插槽(類似于面向?qū)ο蟮某蓡T)的子部件組成。插槽與成員之間的區(qū)別在于插槽存在于更高層次的抽象概念,從而它們可以被非程序員或面向組件程序的終端用戶直接使用。
在組件模型中有三種類型的插槽。屬性是存儲數(shù)據(jù)值的插槽。屬性可以用來存儲配置數(shù)據(jù),提供實時狀態(tài)信息或存儲任何其它數(shù)據(jù)。動作類似于方法,它們是存儲執(zhí)行行為的插槽。例如,終端用戶可能會調(diào)用的一個動作可能是“打開電扇”。動作也可以實現(xiàn)純軟件功能。主題是第三插槽類。主題用來表示事件。主題用于表示事件已經(jīng)發(fā)生。
鏈接是特定類的屬性插槽。鏈接用來指定基于組件的軟件中的執(zhí)行流。更具體的,鏈接用來創(chuàng)建兩個不同插槽之間的因果關(guān)系。這種關(guān)系表示,例如一個函數(shù)響應(yīng)于另一個函數(shù)的調(diào)用而被調(diào)用。在對象模型中,這些關(guān)系通常用靜態(tài)碼(例如條件過程調(diào)用)定義,并且沒有重編譯就不能改變。在組件模型中鏈接通常是動態(tài)插槽,于是它們在運行時可以被創(chuàng)建和刪除,不需要重編譯軟件就可以改變軟件的執(zhí)行流。
因為組件模型是按照面向?qū)ο蟮某绦驑?gòu)建的,必須使用面向?qū)ο蟮某蓡T來實現(xiàn)組件模型。術(shù)語類、成員、字段和過程(method)指的是常規(guī)面向?qū)ο蟮母拍?。術(shù)語組件類型、插槽、屬性、動作和主題指的是面向組件的概念,它們與本發(fā)明相關(guān)。
對象與組件之間的一個大的區(qū)別是組件在運行時可以改變。例如,添加一個新的過程到對象典型的需要重編譯該對象的類。組件模型允許我們在運行時在組件中定義插槽和添加新插槽。在編譯的代碼中所定義的插槽被凍結(jié)。凍結(jié)的插槽是不可變的,但是得到了編譯代碼的處理效率。運行時定義的插槽是動態(tài)的。
在面向?qū)ο蟮某绦蛟O(shè)計中,運行程序中的類定義的存儲由編譯器處理,在很大程度上對開發(fā)者是不可見的。因此,在面向?qū)ο蟮某绦蛟O(shè)計中,類通常作為抽象概念而不是作為實際的數(shù)據(jù)結(jié)構(gòu)引用。于是,在大多數(shù)面向?qū)ο蟮沫h(huán)境中開發(fā)者可以安全的作為實際對象的抽象定義來引用類,而不會被類定義需要物理地存在于計算機存儲器中的某個地方這樣的事實混淆。
在本發(fā)明的組件模型中,組件類型必須在計算機存儲器中存儲和處理。優(yōu)選的由構(gòu)架通過在對象中存儲組件類型,即組件類型對象,來完成組件類型的存儲。于是,組件類型對象是組件類型的物理表示。從組件到組件類型對象的引用用來表示給定對象屬于組件類型的事實。
圖1的流程圖描述了如何通過創(chuàng)建組件類型對象來創(chuàng)建組件類型,和如何產(chǎn)生基于該組件類型的多個組件實例。
為了創(chuàng)建新的組件類型,開發(fā)者需要提供類定義給構(gòu)架-基本類(步驟100)。在優(yōu)選實施例中,開發(fā)者通過將基本類添加到基于組件的軟件來提供基本類。有一組預(yù)定的規(guī)則集,用來將基本類的成員映射到組件模型中不同類型的插槽。這些規(guī)則例如可以是基于基本類的成員的類型或名稱。開發(fā)者通過添加成員根據(jù)該規(guī)則集到對應(yīng)于這些凍結(jié)插槽的基本類定義,指示組件類型應(yīng)該具有哪些凍結(jié)插槽。在優(yōu)選的實施例中,開發(fā)者也添加將基本類向構(gòu)架登記的聲明。添加基本類之后,編譯并執(zhí)行該基于組件的軟件。一旦軟件開始運行,作為初始化程序的一部分,該構(gòu)架檢測基本類并通過圖1中的過程的其余部分,以創(chuàng)建一個或多個組件類型以及基于它們的一個或多個組件。
在步驟101中,構(gòu)架檢查該基本類,并發(fā)現(xiàn)所有相關(guān)成員。該步驟可以通過基本類的自檢來完成。
所有類型的插槽(屬性、動作、主題)都包括定義。屬性插槽的定義指定屬性插槽所保存的數(shù)據(jù)類型和屬性插槽的名稱。動作插槽的定義包括動作插槽的名稱和執(zhí)行該動作的實現(xiàn)方法的代碼。相似的,主題插槽的定義包括主題的名稱和實現(xiàn)該主題的代碼。屬性插槽也包括數(shù)值,動作插槽和主題插槽不具有數(shù)值(但實現(xiàn)它們的方法可以有任意數(shù)目的隱藏在組件級的變量)。屬性插槽需要獲取和設(shè)置過程來獲得和設(shè)置數(shù)值。這些獲取和設(shè)置過程是屬性插槽定義的一部分,并且最初就定義在基本類中。
在步驟102,獲取和設(shè)置過程檢查對應(yīng)于屬性插槽的基本類的每一成員。按照慣例,獲取和設(shè)置過程通過將前綴“獲取”和“設(shè)置”加在屬性插槽的名稱的前頭,連同分別實現(xiàn)這些功能的標準編碼來命名。
然后構(gòu)架創(chuàng)建組件類型對象(步驟103)。組件類型對象的目的是指示組件類型。組件類型對象包括能夠存儲和檢索一個或多個插槽定義的數(shù)據(jù)結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)例如可以是數(shù)組或哈希表。組件類型對象也包括名稱,其是組件類型的名稱。該名稱或者從基本類的名稱拷貝,或者由開發(fā)者以其他方式標識,例如通過使用基本類中的指定字段。
在步驟104,基本類的所有插槽定義被存儲在組件類型對象中。這些被稱作為凍結(jié)插槽定義。在步驟105,構(gòu)架生成槽映象類,其與在步驟103中所創(chuàng)建的組件類型對象相關(guān)聯(lián)。槽映象類定義了對應(yīng)于組件類型對象的每一屬性插槽的成員。槽映象類也包括用于創(chuàng)建附加動態(tài)插槽的方法。
于是在步驟107,對于每個現(xiàn)有的基本類,至此重復該過程。
一個或多個反復之后,在步驟106中創(chuàng)建了必要數(shù)目的組件類型對象。對于每一組件類型對象都有各自的槽映象類、其實例可以存儲凍結(jié)屬性插槽以及可以添加的任意動態(tài)插槽的唯一值。
于是創(chuàng)建了一個或多個組件類型,但該軟件仍然缺少基于組件的功能,因為不存在這些組件類型的實例。在步驟106中從現(xiàn)有的組件類型對象生成一個或多個組件。該構(gòu)架創(chuàng)建多個組件實例,以提供組件級功能。例如,基于數(shù)據(jù)文件或用戶輸入來創(chuàng)建這些組件實例。例如,數(shù)據(jù)文件可以有效的包含一個早已被開發(fā)者或用戶設(shè)計好的組件系統(tǒng),數(shù)據(jù)文件包括組件實例、他們的組織、他們的結(jié)構(gòu)屬性和通過鏈接指示的系統(tǒng)中的執(zhí)行流。而且,通過實例化組件和通過前端瀏覽器等在它們中間創(chuàng)建鏈接,用戶可以使用圖形界面從零做起創(chuàng)建這種系統(tǒng)。
在優(yōu)選實施例中,該構(gòu)架最終負責創(chuàng)建組件。當需要創(chuàng)建某種組件類型的組件時,該構(gòu)架從現(xiàn)有的組件一般類中創(chuàng)建一個組件實例。該一般類包括一個或多個用于與其他組件通信(或用于管理組件)的實用成員,和適合用于插入槽映象或到槽映象的引用的字段。構(gòu)架標識與所要創(chuàng)建組件的組件類型相關(guān)聯(lián)的組件類型對象以及與該組件類型相關(guān)聯(lián)的槽映象類。它然后從槽映象類創(chuàng)建槽映象實例。該構(gòu)架將槽映象實例附加到組件實例中,使得該槽映象被有效的包括在該組件中。它然后創(chuàng)建從組件實例到組件類型對象的引用。該引用,通常是指針,指定一個實例-類型關(guān)系,即指定該特殊組件實例屬于該組件類型對象所描述的組件類型。
如果組件類型對象包括屬性插槽的定義,那么構(gòu)架可選的為它們分配值。這些值例如可以從數(shù)據(jù)文件或用戶輸入獲得。如果構(gòu)架有一個值要分配給屬性插槽,則構(gòu)架通過在槽映象對象的適當字段中設(shè)置該值來完成。這可以通過訪問在屬性插槽定義中的設(shè)置過程來完成,或通過訪問組件或槽映象的設(shè)置過程來完成,或通過直接訪問插槽值來完成。如果沒有提供插槽值,那么該構(gòu)架或者分配默認值或者什么也不做。
在一個可選實施例中,并不為每一組件類型對象創(chuàng)建槽映象類,而是每一組件包括一個一般槽映象,其是或其包含在組件對象中所定義的一種數(shù)據(jù)結(jié)構(gòu),為屬性插槽的屬性插槽值提供存儲位置,并也可以存儲動態(tài)字段定義和值。用于此目的的數(shù)據(jù)結(jié)構(gòu)是本領(lǐng)域所熟知的,并可以為數(shù)組、哈希表等。
該構(gòu)架分配名稱到每一組件,該名稱或者通過構(gòu)架生成或者以與屬性插槽值同樣的方式獲得。
通過這種方式,構(gòu)架創(chuàng)建屬于一個或多個組件類型的多個組件。圖2描述了兩個這種組件211和212,其都屬于組件類型對象200所定義的單個組件類型。該組件類型對象包括名稱202和凍結(jié)插槽204的定義。在所描述的范例中,有一個凍結(jié)動作插槽起始206、一個凍結(jié)主題插槽警報208和一個凍結(jié)屬性插槽hrs_running210。插槽hrs_running210包含一個整數(shù),但是在其他范例中,該屬性插槽可以包含更多復數(shù)數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)或其他數(shù)據(jù)類型。插槽206和208分別包括執(zhí)行該過程和主題所需的編碼。組件211和212,名稱為FirstFan和SecondFan,分別包括槽映象215和216。每一組件槽映象包括組件的凍結(jié)屬性插槽217和218的值。
根據(jù)該優(yōu)選實施例的突出方面,當該軟件執(zhí)行時可以添加動態(tài)插槽到組件。動態(tài)插槽與凍結(jié)插槽的類型相同。運行時動態(tài)插槽的添加通過用戶或者通過軟件自身完成。根據(jù)實施方式的不同,或者通過向構(gòu)架發(fā)出請求或者通過調(diào)用組件的實用程序來加入動態(tài)插槽。不論采用什么方式,動態(tài)插槽通過存儲在槽映象中來添加。動態(tài)插槽通常具有定義,如果它是屬性插槽它還有值。該定義存儲在槽映象中,并且該值如果可以應(yīng)用,也存儲在那里。圖3所示為在兩個動態(tài)插槽已經(jīng)被添加到組件211后圖2中的組件系統(tǒng)。通過將定義添加到槽映象215,稱為“停止(stop)”的動態(tài)動作插槽301已經(jīng)被添加。同樣,通過將定義303和值304添加到槽映象,稱為power_usage的動態(tài)屬性插槽302也被添加。
注意到組件211仍然引用相同的組件類型對象200。該組件類型對象并沒有被改變以記錄動態(tài)插槽的添加。因此,即使在添加了兩個動態(tài)插槽之后,組件FirstFan211仍然是相同的組件類型。并且相應(yīng)的,組件211和212仍然是相同的組件類型,而與組件211多出兩個插槽無關(guān)。這種從“純”類型-實例模型的分離是由于性能原因為每一改變的組件創(chuàng)建新的組件類型會降低系統(tǒng)性能并需要過多的附加存儲器。組件具備實用過程,允許它們?yōu)閯討B(tài)插槽檢查它們的槽映象,并將它們的定義提供到外部組件、構(gòu)架或該軟件的其它模塊。這些實用過程是必須的,因為組件類型對象并不具有動態(tài)插槽的定義。動態(tài)插槽可以被其它組件、構(gòu)架或該軟件的另一模塊以與槽映象對象的凍結(jié)插槽非常相同的方式訪問。
動態(tài)插槽一旦被創(chuàng)建,以后可以通過從槽映象中去除它們的定義(和任何值)而將其刪除。例如,這種情況可以作為新提出特征或功能的測試結(jié)果出現(xiàn),它的引入是由于不需要重新編譯軟件,也就是不用中斷服務(wù)。
不需要重新編譯引入動態(tài)插槽的能力也允許用戶添加影響程序流的新的關(guān)系和連接。這通過“鏈接”實現(xiàn),其是保存有兩個組件之間關(guān)系的插槽。更具體的,一個鏈接保存兩個不同組件的兩個插槽(這兩個插槽都不是該鏈接)之間的因果關(guān)系。為了簡化引用,這兩個插槽被稱作為源插槽和目標插槽。保存這些插槽的組件分別稱作為目標組件和源組件。也有多個可能的因果關(guān)系可以由鏈接表示。在表1列出了在優(yōu)選實施例中所使用的鏈接類型以及它們所鏈接的插槽類型。注意到由于在組件級,執(zhí)行流概念包括屬性字段的變化,在表1中列出的所有鏈接控制組件系統(tǒng)的執(zhí)行流。
表1用戶可以通過鏈接各種組件的各種插槽來創(chuàng)建執(zhí)行流。鏈接是凍結(jié)的或者動態(tài)的。動態(tài)鏈接允許在軟件運行時改變組件系統(tǒng)的執(zhí)行流。要改變執(zhí)行流所要做的就是創(chuàng)建或刪除鏈接。為了避免創(chuàng)建和刪除相同的鏈接,優(yōu)選實施例允許激活和去活鏈接。這提供了另外的優(yōu)勢,即,通過適當制定的動態(tài)鏈接,不能被刪除的凍結(jié)鏈接仍然可以被去活。被去活的鏈接并不用作鏈接,但仍然存在于目標組件中,并且隨后可以被激活。
鏈接作為一種類型的插槽實現(xiàn)。在優(yōu)選實施例中,鏈接包括在目標組件中,也就是保存該目標插槽的組件。鏈接優(yōu)選的包括下列插槽源組件字段,保存到源組件的引用或源組件的名稱;源字段,保存源插槽的名稱;目標字段,保存目標插槽的名稱;以及“激活”標志,表示它是被激活還是被去活。
鏈接也包括對于處理它們有用的過程(method),諸如激活和去活過程,或者改變源字段、源組件、和/或目標字段的過程。注意到由于鏈接已經(jīng)包括在目標組件中,在該設(shè)置中避免了到目標組件的引用;目標組件直接被鏈接的布局引用。
在優(yōu)選實施例中,當鏈接被激活時,它們在源組件創(chuàng)建一個調(diào)節(jié)器(knob)。調(diào)節(jié)器是與鏈接相似的數(shù)據(jù)結(jié)構(gòu),其存儲在源組件的槽映象中。調(diào)節(jié)器向源組件指示,它必須將事件從它的插槽傳播到目標組件的插槽。調(diào)節(jié)器包括類似于鏈接的數(shù)據(jù)字段的數(shù)據(jù)字段,但它包括目標組件的,而不是源組件的引用或名稱。調(diào)節(jié)器并不包括激活標志。相反,當鏈接被去活時,旋鈕簡單地被刪除。
圖4所示為已經(jīng)添加動態(tài)鏈接401的圖3的組件。該鏈接被激活,從而它使得對應(yīng)的調(diào)節(jié)器402被創(chuàng)建。由于源插槽和目標插槽是屬性,在FisrtFan的hrs_runnig的值改變的事件中,該鏈接的效果是將SecondFan的hrs_runnig的值改變到FisrtFan的hrs_runnig的新值。換言之,一旦值217變化,該鏈接將使值218跟隨值217。鏈接運行的方式相同,而與它鏈接的是凍結(jié)插槽或動態(tài)插槽無關(guān)(盡管如果包括有動態(tài)插槽會有一些性能損失)。
圖5A是圖4的組件系統(tǒng)的抽象圖,其中省去了實現(xiàn)細節(jié)。它示出了從組件級別看到的鏈接功能。這里鏈接401用從源插槽到目標插槽,而不是到組件211中的插槽的箭頭表示。盡管該鏈接存在于組件211中。
圖5A展示了該組件模型的一個優(yōu)點。該組件模型允許抽象化并以相對簡單的方式顯示復雜的動態(tài)系統(tǒng)。提供用戶可視界面,其中組件系統(tǒng)的一個或多個組件被可視地表示為窗口小部件(widget)或圖表。實際上,可以類似于圖5A中所示的實現(xiàn)可視表示。組件在屬性插槽中可以存儲它們自己的表示,或者這些表示可以被圖形模塊處理。有關(guān)可以結(jié)合在此所描述的組件模型一起工作的優(yōu)選可視界面的進一步細節(jié),參見同一天申請的,標題為“Real-Time Data InterfaceAnd Method For Browser And The Like”的美國專利申請(尚未給予流水號)代理人案卷號3929/1k294US2,其全部內(nèi)容在此引入作為參考。
一旦組件通過圖形界面表示給用戶,也顯示各種相關(guān)的插槽和這些組件的值。通過這種界面,點擊選擇各種插槽和拖動組件之間的鏈接以添加鏈接,允許用戶改變值或執(zhí)行組件的過程。
而且,通過操作屏幕上的鏈接、插槽和組件的可視表示,允許用戶添加新的組件、添加或去除動態(tài)屬性、添加和刪除動態(tài)鏈接、或激活和去活鏈接。這樣用戶可視地再編程了一個基于組件的系統(tǒng)。
圖5B是去除鏈接401之后圖5A中組件系統(tǒng)的抽象圖。鏈接的去除用虛線401′表示。通過從組件211中去除動態(tài)鏈接插槽411來完成去除。任何其他動態(tài)插槽可以類似的被去除。
該優(yōu)選實施例的一個優(yōu)點是它同時具有凍結(jié)插槽的效率和速度以及動態(tài)插槽的靈活性。有些時候動態(tài)插槽被證明是太低效了。盡管該優(yōu)選實施例被用來通過使用動態(tài)插槽快速改變和檢測該組件系統(tǒng),以找到最優(yōu)配置。一旦找到最優(yōu)配置,執(zhí)行重新編譯以將所有的動態(tài)插槽轉(zhuǎn)換為凍結(jié)插槽。在重新編譯之后,該系統(tǒng)會保留它的最優(yōu)配置,但具有更好的性能。
圖6描述了如何優(yōu)化圖3中所示系統(tǒng)的組件211。將動態(tài)插槽編譯成凍結(jié)插槽可以導致原始組件類型的改變或?qū)е滦碌慕M件類型,如果原始組件類型的所有組件并不具有相同的動態(tài)插槽。通過從槽映象215中去除它們的定義并增加組件類型基本類200的凍結(jié)插槽定義,動態(tài)插槽301、302被轉(zhuǎn)換成凍結(jié)插槽。屬性插槽302的值304保留在槽映象215中,但是現(xiàn)在與相同組件類型的所有組件所共同的凍結(jié)插槽定義相關(guān)聯(lián)。通過在這些定義中所列或從這些定義導出的偏移量(offset),兩個值217和304與它們各自的定義210和303成對。
圖7描述了將組件分級組織成組件系統(tǒng)的優(yōu)選方法。如前所述,組件可以包括其他組件作為屬性插槽。這通過包括到另一組件的引用作為屬性插槽來實現(xiàn)。在可選實施例中,使用指定所有權(quán)的鏈接,而非引用。
優(yōu)選的利用組件的能力來包括其他組件并組織系統(tǒng)組件為樹結(jié)構(gòu),如圖7所示。這些組件類型對象706、707、708和709分別描述組件類型A、B、C和D。組件701是組件類型A,組件702和703是組件類型B,組件704是組件類型C,而組件705是組件類型D。組件702、703和704作為插槽全部包括在組件701中,這種包括關(guān)系通過組件701的插槽710中的引用定義。組件704進一步包括組件705。還有一個執(zhí)行流鏈接713,以粗箭頭表示,其以組件705的插槽711作為源并以組件703的插槽712作為目標。包括其他組件的組件稱為父組件。包括在其他組件中的組件稱為子組件。可以以相似的結(jié)構(gòu)組織更復雜的系統(tǒng)。在優(yōu)選實施例中,系統(tǒng)的所有組件以單樹組織。這就意味著有一個父組件,稱為根組件,它不包括在其他任何組件中,以及一個或多個非根組件按照它們到根組件的繼承關(guān)系布置。在圖7中根組件是組件701。該組織產(chǎn)生一個附加優(yōu)點就是每一組件通過一個字符串被唯一的標識,該字符串由它的前輩名稱的順序列表組成,始于根組件,終止于該組件的名稱。該特征可以用來保證復雜的組件系統(tǒng)中組件的唯一標識,其中來自不同廠家的新組件被不斷添加到該系統(tǒng)。標識可以用字段名稱擴展,以便類似地為組件的字段提供唯一標識。
由于可視界面是組件模型的一個重要優(yōu)點,本發(fā)明還包括一種用于提供可視界面的系統(tǒng)。該系統(tǒng)特別用于為組件模型提供界面,因為它是基于可視對象或窗口小部件,并且每個這樣的窗口小部件可以可視化一個組件。另一個有用特征是該系統(tǒng)同時具有很大的靈活性和較低的資源使用。
該可視化系統(tǒng)被設(shè)計成與用于以標準化文件格式顯示第三方內(nèi)容的流行軟件,如HTML瀏覽器,兼容。在一個優(yōu)選實施例中,本發(fā)明作為HTML文件中的Java小程序?qū)崿F(xiàn)。Java程序被稱作引擎。圖8所示為可視化系統(tǒng)的操作流程圖。在步驟801用戶將帶有引擎的HTML頁面裝載到HTML瀏覽器上。在步驟802,HTML瀏覽器執(zhí)行該引擎。在步驟803,該引擎請求配置文件。通過計算機網(wǎng)絡(luò)或者從用戶的計算機請求該配置文件。在一個優(yōu)選實施例中,配置文件是XML文件。該配置文件包括可視顯示的布局,并且它還包括到一個或多個窗口小部件的引用,以及用于這些窗口小部件的位置和/或大小信息。
窗口小部件是可視對象。窗口小部件的范例是組件、物理裝置、圖形、餅分圖和表格的表示。窗口小部件可以做成動畫或以多種不同的方式提供信息。窗口小部件也任選的具有與用戶交互的能力。
有一些可執(zhí)行代碼與在配置文件中引用的每一窗口小部件相關(guān)聯(lián)。該代碼稱為擴展。擴展位于用戶計算機上或通過計算機網(wǎng)絡(luò)與用戶計算機相連的其他計算機上。擴展可以通過包括在配置文件中的引用來定位。引擎對配置文件進行語法分析和定位擴展。引擎然后裝載擴展,如果需要,從計算機網(wǎng)絡(luò)上下載它們(步驟804)。引擎然后并行執(zhí)行所有擴展。一旦執(zhí)行擴展,它們在用戶界面上顯示引擎幫助。每一擴展顯示它所關(guān)聯(lián)的窗口小部件。引擎顯示在配置文件中描述的整體布局,并且操作所顯示的窗口小部件,以根據(jù)配置文件改變它們的大小和位置。擴展任選的與其它軟件模塊通信,并根據(jù)這些通信改變/更新與它們相關(guān)聯(lián)的窗口小部件。在示范實施例中,窗口小部件是組件的圖形表示,并且與該窗口小部件相關(guān)聯(lián)的擴展通過計算機網(wǎng)絡(luò)與組件通信。擴展還任選的通過接受和響應(yīng)用戶所發(fā)出的指令與用戶交互。擴展也可以從其它軟件組件接收信息或向其發(fā)送信息,如基于與用戶交互的組件。于是根據(jù)擴展的軟件代碼、與其它軟件模塊的通信、和/或與用戶的交互,窗口小部件連續(xù)更新。擴展可以進一步向其它軟件模塊發(fā)送從用戶接收到的控制信號。
例如,窗口小部件表示溫度調(diào)節(jié)裝置,其由溫度調(diào)節(jié)組件來控制。對應(yīng)于溫度調(diào)節(jié)窗口小部件的擴展通過網(wǎng)絡(luò)發(fā)送更新溫度該數(shù)請求。該溫度調(diào)節(jié)組件響應(yīng)。然后該擴展更新溫度。用戶與窗口小部件進行交互。例如,用戶通過點擊窗口小部件來表達想要以攝氏度而不是以華氏度來察看溫度。擴展接收請求并更新該窗口小部件。用戶也可以通過窗口小部件發(fā)送命令到實際的溫度調(diào)節(jié)裝置。例如,如果用戶想要關(guān)閉溫度調(diào)節(jié)裝置,或讓其進入省電模式,該窗口小部件會向溫度調(diào)節(jié)組件轉(zhuǎn)發(fā)該命令。
當擴展經(jīng)常使用網(wǎng)絡(luò)通信時,可視界面系統(tǒng)的可選實施例具有更高的效率。因為并行處理的多個擴展的多個網(wǎng)絡(luò)通信通常會引發(fā)性能問題,在可選實施例中,擴展并不啟動網(wǎng)絡(luò)通信,而是發(fā)送請求到引擎。引擎在預(yù)定的時間期間收集網(wǎng)絡(luò)通信請求,并試圖將它們合并成更大的捆,然后通過網(wǎng)絡(luò)發(fā)送它們,于是提高了網(wǎng)絡(luò)效率。只有發(fā)送到相同計算機的通信可以被捆綁。在接收端也必須有軟件模塊以能夠?qū)⒃撏ㄐ沤忾_捆綁。引擎也從某些軟件模塊接收捆綁,該捆綁包含發(fā)送到一個或多個擴展的通信,將它們解開捆綁成單個的通信并將這些單個的通信發(fā)送到它們所要到達的擴展。當多個擴展與相同的軟件模塊通信時該實施例是最有效的。
為了具體和清楚的說明,已經(jīng)使用語言、格式和協(xié)議描述了可視界面系統(tǒng),諸如HTML、Java、XML。該可視界面并不限于這些語言、格式和協(xié)議。該可視界面系統(tǒng)可以配置成使用任何允許嵌入應(yīng)用的語言運行。任何數(shù)據(jù)文件格式,包括屬性數(shù)據(jù)格式可以代替XML使用。
關(guān)于可以連同在此所描述的組件模型一起運行的優(yōu)選可視界面的更具體的細節(jié),可以再次參見前述美國專利申請“Real-Time DataInterface And Method For Browser And The Like”。
并不是所有的軟件程序需要以組件模型實現(xiàn)?;诮M件的功能比常規(guī)的面向?qū)ο蟮拇a會更慢并且更大。于是在優(yōu)選實施例中,只有可能需要被動態(tài)修改的代碼部分,或使用組件模型的其它特征的代碼部分會以組件模型實現(xiàn)。但是技術(shù)上不以組件模型實現(xiàn)的代碼仍然可以封裝成組件,從而它對其它組件是以組件出現(xiàn)的。
在本文檔中所描述的計算機可以是任何計算裝置。計算機網(wǎng)絡(luò)包括無線網(wǎng)絡(luò)。
雖然已經(jīng)連同特定實施例描述了本發(fā)明,但是本發(fā)明由所附權(quán)利要求無限制地定義,并且本發(fā)明包括單元和方法步驟的非實質(zhì)變化。
權(quán)利要求
1.一種用于在機器上執(zhí)行的軟件程序,該軟件程序包括相同組件類型的一個或多個組件,組件類型由包括一個或多個插槽定義(slotdefinition)的基本類來定義,其中至少一個插槽定義為屬性插槽定義,通過以下步驟在運行期間產(chǎn)生所述組件標識所述基本類中的所有屬性插槽定義;為所述基本類中的每一個標識的屬性插槽定義定位獲取(getter)和設(shè)置(setter)過程;產(chǎn)生一個組件類型對象,該組件類型對象被配置用來存儲插槽定義;在該組件類型對象中存儲在標識步驟中標識的屬性插槽定義;產(chǎn)生一個或多個組件,每一組件具有一個槽映象(slotmap)和對該組件類型對象的引用,其中每個槽映象包括用于存儲在該組件類型對象中的每一屬性插槽定義的值的存儲位置;和通過將屬性插槽值插入到所述一個或多個組件的一個特定組件的槽映象中的存儲位置,設(shè)置屬性插槽值,該屬性插槽值與組件類型對象中的其中一個屬性插槽定義相關(guān)聯(lián)。
2.根據(jù)權(quán)利要求1的方法,進一步包括以下步驟產(chǎn)生一個槽映象類,該槽映象類定義了用于每一屬性插槽的值的一個或多個存儲位置,屬性插槽的定義在標識步驟中標識;其中在產(chǎn)生一個或多個組件的步驟中,每一槽映象是槽映象類的一個實例。
3.根據(jù)權(quán)利要求1的方法,其中該基本類的至少一個定義是動作插槽定義,并進一步包括以下步驟標識該基本類中的一個或多個動作插槽定義;和在所述組件類型對象中存儲該一個或多個動作插槽定義。
4.根據(jù)權(quán)利要求1的方法,其中該基本類的至少一個定義是主題插槽定義,并進一步包括以下步驟標識該基本類中的一個或多個主題插槽定義;和在該組件類型對象中存儲該一個或多個主題插槽定義。
5.根據(jù)權(quán)利要求1的方法,進一步包括步驟在執(zhí)行該軟件程序的過程中,向一個或多個組件中的第一組件的槽映象添加一個動態(tài)插槽,同時保持所述組件類型對象不改變,該添加步驟與任何編譯步驟無關(guān)。
6.根據(jù)權(quán)利要求5的方法,其中所述動態(tài)插槽是一個屬性插槽,并且該添加步驟包括添加一個動態(tài)屬性插槽定義到所述第一組件的槽映象中;和添加一個動態(tài)屬性插槽值到所述第一組件的槽映象中。
7.根據(jù)權(quán)利要求5的方法,其中所述動態(tài)插槽是一個動作插槽,并且該添加步驟包括添加一個動態(tài)動作插槽定義到所述第一組件的槽映象中。
8.根據(jù)權(quán)利要求5的方法,其中所述動態(tài)插槽是一個主題插槽,并且其中添加步驟包括添加一個動態(tài)主題插槽定義到所述第一組件的槽映象中。
9.根據(jù)權(quán)利要求5的方法,進一步包括步驟在執(zhí)行該軟件程序的過程中,從所述第一組件去除該動態(tài)插槽,該去除步驟與任何編譯步驟無關(guān)。
10.根據(jù)權(quán)利要求6的方法,進一步包括以下步驟執(zhí)行該軟件程序一段時間;從所述第一組件中去除所述動態(tài)屬性插槽;添加一個凍結(jié)屬性插槽定義到所述組件類型對象中,該凍結(jié)屬性插槽定義與所述動態(tài)屬性插槽定義相同;添加一個凍結(jié)屬性插槽值到所述第一對象的槽映象中,該凍結(jié)屬性插槽值與動態(tài)屬性插槽值相同;其中通過至少部分編譯該軟件程序來執(zhí)行添加凍結(jié)屬性插槽定義和凍結(jié)屬性插槽值的步驟。
11.根據(jù)權(quán)利要求7的方法,進一步包括以下步驟執(zhí)行該軟件程序一段時間;從第一組件中去除所述動態(tài)動作插槽;添加一個凍結(jié)動作插槽定義到所述組件類型對象中,該凍結(jié)動作插槽定義與所述動態(tài)動作插槽定義相同;其中通過至少部分編譯該軟件程序來執(zhí)行添加凍結(jié)動作插槽定義的步驟。
12.根據(jù)權(quán)利要求8的方法,進一步包括以下步驟執(zhí)行該軟件程序一段時間;從第一組件中去除動態(tài)主題插槽;添加一個凍結(jié)主題插槽定義到所述組件類型對象中,該凍結(jié)主題插槽定義與所述動態(tài)主題插槽定義相同;其中通過至少部分編譯該軟件程序來執(zhí)行添加凍結(jié)主題插槽定義的步驟。
13.根據(jù)權(quán)利要求5的方法,進一步包括以下步驟顯示該軟件程序的圖形表示;和允許用戶操作該圖形表示;其中響應(yīng)用戶對該圖形表示的操作,執(zhí)行該添加步驟。
14.根據(jù)權(quán)利要求13的方法,進一步包括步驟響應(yīng)用戶對圖形表示的操作,去除動態(tài)插槽。
15.根據(jù)權(quán)利要求5的方法,其中產(chǎn)生多個組件來定義代碼,每一組件具有各自的槽映象和對相同組件類型對象的引用,其中動態(tài)插槽是一個鏈接,其定義了從所述兩個或多個組件的第二組件中的源插槽到所述第一組件中的目標插槽的代碼執(zhí)行流。
16.根據(jù)權(quán)利要求15的方法,進一步包括以下步驟顯示包括該鏈接的圖形表示的該軟件程序的圖形表示;和允許用戶操作該鏈接的圖形表示;其中響應(yīng)用戶對該鏈接的圖形表示的操作,執(zhí)行該添加步驟。
17.根據(jù)權(quán)利要求15的方法,其中所述源插槽是一個屬性插槽,且所述目標插槽是一個屬性插槽,該方法另外包括步驟執(zhí)行代碼,使得所述目標插槽的值隨所述源插槽的值的任何改變而改變。
18.根據(jù)權(quán)利要求15的方法,其中所述源插槽是一個屬性插槽且所述目標插槽是一個動作插槽,該方法另外包括步驟執(zhí)行代碼,使得所述目標插槽響應(yīng)于所述源插槽的值的改變而被調(diào)用。
19.根據(jù)權(quán)利要求15的方法,其中所述源插槽是一個主題插槽且所述目標插槽是一個動作插槽,該方法另外包括步驟執(zhí)行代碼,使得所述目標插槽響應(yīng)于所述源插槽的啟動而被調(diào)用。
20.根據(jù)權(quán)利要求15的方法,其中所述源插槽是一個主題插槽且所述目標插槽是一個主題插槽,該方法另外包括步驟執(zhí)行代碼,使得所述目標插槽響應(yīng)于源插槽的啟動而啟動。
21.根據(jù)權(quán)利要求15的方法,其中所述源插槽是一個動作插槽且所述目標插槽是一個動作插槽,該方法另外包括步驟執(zhí)行代碼,使得所述目標插槽響應(yīng)于所述源插槽被調(diào)用而被調(diào)用。
22.根據(jù)權(quán)利要求15的方法,其中所述源插槽是一個動作插槽且所述目標插槽是一個主題插槽,該方法另外包括步驟執(zhí)行代碼,使得所述目標插槽響應(yīng)于所述源插槽的調(diào)用而啟動。
23.根據(jù)權(quán)利要求15的方法,其中該鏈接包括到所述第二組件的引用;所述源插槽的插槽名稱;和所述目標插槽的插槽名稱。
24.一種用于在基于組件的軟件系統(tǒng)中,自動為組件指定唯一名稱的方法,包括下列步驟創(chuàng)建一個根組件,該根組件沒有父組件;將一個或多個非根組件置于該根組件內(nèi);將一個或多個非根組件置于其它非根組件內(nèi),使得這些組件形成一種樹結(jié)構(gòu),并且每一非根組件有一個父組件;在這些非根組件中指定一個第一組件、包括該組件的前輩組件的名稱和該組件名稱的順序列表的唯一標識串。
25.根據(jù)權(quán)利要求24的方法,其中第一組件包括一個插槽,并進一步包括以下步驟提供對所述插槽的標識。
26.根據(jù)權(quán)利要求25的方法,其中所述插槽是一個動態(tài)插槽。
全文摘要
一種基于組件的軟件程序,其中每一組件基于一種組件類型。從包括插槽定義的基本類創(chuàng)建組件類型。標識該插槽定義并將其存儲在組件類型對象中。創(chuàng)建相同組件類型的一個或多個組件,每一組件包括到組件類型對象的引用,和包括與組件類型對象中屬性插槽定義相關(guān)聯(lián)的值的存儲位置的槽映象。屬性插槽值通過被放置到存儲位置中而進入組件。也公開了一種自動指定唯一名稱給組件的方法。創(chuàng)建一個根組件。進一步將非根組件放置到根組件中或其它非根組件中,從而所有組件形成一個樹結(jié)構(gòu)。分配一個唯一標識串給組件,其包括所有該組件的前輩組件的名稱和該組件名稱的順序列表。
文檔編號G06F9/44GK1669020SQ03803852
公開日2005年9月14日 申請日期2003年2月18日 優(yōu)先權(quán)日2002年2月15日
發(fā)明者布賴恩·S.·弗蘭克, 約翰·W.·薩布利特 申請人:特里迪姆公司