專利名稱:從基于非異常的模型中生成基于異常的組件模型的制作方法
技術領域:
本發明涉及軟件開發技術,尤其涉及軟件模型開發技術。
背景技術:
在開發軟件應用程序時,開發者常常為應用程序編寫代碼來消費一個或多個預先存在的軟件組件。例如,在先前可能已經編寫了軟件組件,并且該軟件組件可能具有在調用該軟件組件時該軟件組件將遵循的接口合約。例如,接口合約可以提示軟件組件中的一個或多個函數的輸入變量、輸出變量和/或返回值。許多這樣的接口合約和軟件組件被實現為基于非異常的模型,該模型通常返回錯誤代碼(例如,HRESULT值)。錯誤代碼可以指示函數是成功還是失敗,并且還可以指示其他信息,例如關于失敗(如果出現)的本質的附加信息??梢詾閼贸绦蚓帉懘a來檢查來自該組件的錯誤代碼并處理失敗(如果出現)。其他軟件組件在基于異常的模型中實現, 該模型通常在出現失敗時拋出異常。對于這樣的基于異常的模型,可以調用異常處理函數來處理被拋出的異常并處理相對應的失敗。在消費基于非異常的模型時,消費應用程序通常調用非異常技術,例如檢查所返回的錯誤代碼來檢測失敗。類似地,在消費基于異常的模型時,通常調用諸如異常處理函數等基于異常的技術。
發明內容
在消費軟件組件時,消費應用程序通常根據由軟件組件作者所選擇的錯誤處理模型來消費軟件組件。由此,在消費基于非異常的軟件組件,消費應用程序已經調用基于非異常的技術來處理那些軟件組件,即使將優選基于異常的技術。例如,在許多情形中,消費基于異常的軟件組件可以比消費類似的基于非異常的軟件組件使用更少的代碼。此處描述的各實施例處理將基于非異常的軟件組件模型轉換成基于異常的軟件組件模型,從而使得軟件組件可以使用基于異常的技術來消費,即使組件被創作為基于非異常的組件模型。消費應用程序可以選擇通過消費原始的基于非異常的模型或經轉換的基于異常的模型來調用軟件組件。在一個實施例中,工具和技術可以包括解析可消費軟件組件的基于非異常的接口合約。另外,可以從基于非異常的接口合約中生成可消費軟件組件的包裝(例如,類包裝)。 包裝可以具有基于異常的接口合約實現,并且基于異常的接口合約實現可以是與基于非異常的接口合約等價的鏡像。如此處所使用的,基于異常的接口合約實現是與基于非異常的接口合約等價的鏡像,指的是(1)基于異常的接口合約實現在基于異常的接口合約實現中的方法或函數的信息和基于非異常的接口合約中的相對應的方法或函數的信息之間具有一對一的對應關系,以及(2)基于異常的接口合約實現和基于非異常的接口合約以相同水平與方法或函數交互(例如,兩者都直接與函數或方法交互)。在工具和技術的另一實施例中,解析可消費軟件組件的基于非異常的接口合約, 并且從基于非異常的接口合約中生成可消費軟件組件的基于異常的模型。如果基于非異常的接口合約提示一個或多個變量是可消費軟件組件中的函數的輸出變量,則生成可以包括在基于異常的模型中,生成用于返回來自函數的一個或多個變量中的一個(即,被提示為是輸出變量的變量中的一個)的代碼。輸出變量是被傳遞到函數并由函數填充的變量。合約可以用各種不同的方式來將變量提示為輸出變量,這些方式在編程語言之間常常不同。 例如,合約可以使用C#中的關鍵詞“ref”、通過在C++中的變量類型之后包括“**”等來提示輸出變量。在工具和技術的又一實施例中,可以解析可消費軟件組件的基于非異常的接口合約。可以確定基于非異常的接口合約是否將一個或多個變量提示為可消費軟件組件中的函數的一個或多個輸出變量??梢詮幕诜钱惓5慕涌诤霞s中生成可消費軟件組件的基于異常的模型。如果基于非異常的接口合約包括提示一個或多個輸出變量的代碼,則生成基于異常的模型可以包括將用于返回來自函數的一個或多個變量的代碼包括在基于異常的模型中??梢允沟没诜钱惓5慕涌诤霞s和基于異常的模型可供消費應用程序消費。提供本發明內容是為了以簡化的形式介紹一些概念。這些概念將在以下具體實施方式
中進一步描述。本發明內容并不旨在標識出所要求保護的主題的關鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。類似地,本發明不限于解決在背景技術具體實施方式
、或附圖中討論的特定技術、工具、環境、缺點、或優點的實現。
圖1是其中可實現所描述的各實施例中的一個或多個實施例的合適的計算環境的框圖。圖2是基于異常的組件模型生成和消費環境的框圖。圖3是示出用于從基于非異常的模型中生成基于異常的組件模型的技術的流程圖。圖4是示出用于從基于非異常的模型中生成基于異常的組件模型的技術的另一流程圖。圖5是示出用于從基于非異常的模型中生成基于異常的組件模型的技術的又一流程圖。
具體實施例方式此處描述的各實施例涉及用于與軟件組件的消費有關的改進技術的技術和工具。 這樣的改善可源于分開或組合地使用各種技術和工具。這些技術和工具可以包括解析可消費軟件組件的基于非異常的接口合約。可以從基于非異常的接口合約中生成基于異常的模型。例如,基于異常的模型可以包括軟件組件的包裝,并且該包裝可以具有基于異常的接口合約實現。基于異常的接口合約實現可以是與基于非異常的接口合約等價的鏡像。另外,如果基于非異常的接口合約提示可消費軟件組件中的函數的一個或多個輸出變量,則基于異常的模型可以包括用于返回來自該函數的那些變量中的一個變量的代碼。由此,可以使用基于異常的技術通過消費消費應用程序的源代碼中的基于異常的模型來消費預先存在的基于非異常的軟件組件。例如,這可以包括消費消費應用程序的源代碼中的基于異常的包裝源代碼,并且調用該基于異常的包裝來調用可消費軟件組件中的函數。如下文進一步討論的,與使用基于非異常的技術相比,這可以極大地降低被編寫以供調用可消費軟件組件的源代碼的數量。另外,消費應用程序將仍然可以選擇使用原始的基于非異常的接口合約來調用軟件組件,并且可以使用標準基于非異常的編碼技術(例如, 檢查所返回的錯誤代碼等等)來這么做。在某些現有的實現中,可消費組件已經按照它們可以在基于異常的和基于非異常的消費應用程序中使用的方式來編寫。例如,這些組件的作者可能已將創作了接口定義語言(IDL)文件,該文件被配置成被處理來產生基于異常的模型以及包括基于非異常的合約的基于非異常的模型。然而,許多可消費組件不旨在在基于異常的模型中使用,并且它們不具有這樣的雙重用途的IDL文件。相反,它們是帶有根據可消費組件而創作的基于非異常的接口合約的單用途的基于非異常的可消費組件。此處描述的工具和技術可以利用這些組件,即使它們不旨在在基于異常的模型中使用。具體地,工具和技術可以從基于非異常的接口合約,諸如頭部文件(通常被實現為.h文件)中的接口合約中生成基于異常的模型。由此,從此處描述的工具和技術中可以實現一個或多個實質的益處。然而,所附權利要求中定義的主題不必限于本文描述的益處。本發明的特定實現可提供本文描述的益處的全部、一些、或未提供本文描述的益處。盡管本文出于呈現的目的以特定的順序次序描述了用于各種技術的操作,但應理解除非要求特定的排序,否則這種描述方式涵蓋了操作順序上的重新安排。例如,在某些情況下,可以重新安排或并發執行順序地描述的操作。本文參照流程圖描述的技術可被用于本文描述的一個或多個系統和/或用于一個或多個其他系統。例如,本文描述的各種過程可用硬件或軟件、或兩者的組合來實現。此外,為了簡單起見,流程圖可能未示出可結合其他技術來使用特定技術的各種方式。I.示例性計算環境圖1示出其中可實現所描述的各實施例中的一個或多個實施例的合適的計算環境(100)的一般化示例。例如,一個或多個這樣的計算環境可被用作用于將基于非異常的軟件組件模型轉換成基于異常的軟件組件模型的計算環境。一般而言,可使用各種不同的通用或專用計算系統配置。適用于此處所描述的工具和技術的公知計算系統配置的示例包括,但不限于,服務器場和服務器群集、個人計算機、服務器計算機、手持式或膝上型設備、 多處理器系統、基于微處理器的系統、可編程消費電子產品、網絡PC、小型機、大型計算機、 包括上述系統或設備中的任一個的分布式計算環境等。計算環境(100)不旨在對本發明的使用范圍或功能提出任何限制,因為本發明可以在完全不同的通用或專用計算環境中實現。參考圖1,計算環境(100)包括至少一個處理單元(110)和存儲器(120)。在圖1 中,這一最基本的配置(130)被包括在虛線內。處理單元(110)執行計算機可執行指令,并可以是現實的或虛擬的處理器。在多處理系統中,多個處理單元執行計算機可執行指令以提高處理能力。存儲器(120)可以是易失性存儲器(例如,寄存器、高速緩存、RAM)、非易失性存儲器(例如,R0M、EEPR0M、閃存)、或兩者的某種組合。存儲器(120)存儲實現從基于非異常的模型中生成基于異常的軟件組件的軟件(180)。盡管為了清楚起見用線條示出了圖1的各框,但是,實際上,描繪各組件并不是那樣清楚,并且用比喻方法,圖1以及下文討論的其他附圖的線條更精確地將是灰色的和模糊的。例如,可以將諸如顯示設備之類的呈現組件視為I/O組件。同樣,處理器具有存儲器。發明人關于此點認識到,這是本領域的特性,并且重申,圖1的圖示只是例示可結合本發明的一個或多個實施例來使用的示例性計算設備。諸如“工作站”、“服務器”、“膝上型計算機”、“手持式設備”等分類之間沒有區別,它們全部都被認為是在圖1的范圍之內的并且被稱為“計算機”、“計算環境”、或“計算設備”。計算環境(100)可具有附加特征。在圖1中,計算環境(100)包括存儲(140)、一個或多個輸入設備(150)、一個或多個輸出設備(160)以及一個或多個通信連接(170)。諸如總線、控制器或網絡之類的互連機制(未示出)將計算環境(100)的組件互連在一起。通常,操作系統軟件(未示出)為在計算環境(100)中執行的其他軟件提供操作環境,并協調計算環境(100)的各組件的活動。存儲(140)可以是可移動或不可移動的,并可包括諸如磁盤、磁帶或磁帶盒、 CD-R0M、CD-RW、DVD之類的非瞬態計算機可讀存儲介質,或者可用于儲存信息并可在計算環境(100)內訪問的任何其它介質。存儲(140)儲存用于軟件(180)的指令。輸入設備(150)可以是諸如鍵盤、鼠標、筆或跟蹤球等觸摸輸入設備;語音輸入設備;掃描設備;網絡適配器;CD/DVD讀取器;或可向計算環境(100)提供輸入的另一設備。 輸出設備(160)可以是顯示器、打印機、揚聲器、CD/DVD刻錄機、網絡適配器、或從計算環境 (100)提供輸出的另一設備。通信連接(170)允許通過通信介質與另一個計算實體進行通信。因此,計算環境 (100)可使用通往諸如個人計算機、服務器、路由器、網絡PC、對等設備或另一常見網絡節點等一個或多個遠程計算設備的邏輯連接而工作在聯網環境中。通信介質以已調制數據信號的形式傳達諸如數據或計算機可執行指令或請求等信息。已調制數據信號是以在信號中編碼信息的方式來設置或改變其一個或多個特征的信號。作為示例而非限制,通信介質包括利用電氣、光學、射頻(RF)、紅外線、聲音或其他載體實現的有線或無線技術。各種工具和技術可以在計算機可讀介質的一般上下文中描述。計算機可讀介質是可以在計算環境內被訪問的任何可用介質。作為示例而非局限,對于計算環境(100),計算機可讀介質包括存儲器(120)、存儲(140)、和以上的組合。這些工具和技術可在諸如程序模塊中所包括的在目標真實或虛擬處理器上的計算環境中執行的計算機可執行指令的一般上下文中描述。一般而言,程序模塊包括執行特定任務或實現特定抽象數據類型的函數、程序、庫、對象、類、組件、數據結構等等。程序模塊的功能可以按需在各個實施例中進行組合或在程序模塊之間拆分。程序模塊的計算機可執行指令可以在本地或分布式計算環境內執行。在分布式計算環境中,程序模塊可以位于本地和遠程計算機存儲介質中。出于表示的目的,詳細描述使用了如“確定”、“選擇”、“調整”和“操作”等術語來描述計算環境中的計算機操作。這些以及其他類似術語是對計算機執行的操作的高層抽象, 并且不應混淆于人類執行的動作,除非明確指出人類(諸如“用戶”)的動作執行。對應于這些術語的實際的計算機操作取決于實現而不同。II.基于異常的組件模型生成以及消費系統和環境圖2是結合可以實現此處描述的實施例中的一個或多個的基于異常的組件模型生成以及消費計算環境(200)的框圖。環境(200)可以包括可消費軟件組件005)。例如,軟件組件(20 可以是源代碼和/或目標代碼的形式。該軟件組件(20 的生產者通常還生產軟件組件的接口合約,諸如基于非異常的接口合約012)。該接口合約(212)通常包括用于返回錯誤代碼的代碼,它可以指示正在運行的軟件組件(205)成功地完成,或者正在運行的軟件組件(20 導致差錯或失敗。該錯誤代碼的一個示例是微軟技術中常用的HRESULT代碼??梢詸z查HRESULT代碼來確定函數是成功還是失敗,并且還可以檢查HRESULT代碼來揭示關于差錯(如果存在差錯的話)的信息。例如,可以使用標準C++FAILED(失敗)和SUCCEEDED(成功)宏來測試HRESULT。通常,0或1的HRESULT值指示成功的完成,而負數指示失敗,并且還可以指示關于失敗的某些附加信息。環境(200)還可以包括轉換器O20),該轉換器可以從基于非異常的模型(210)中生成基于異常的模型030)。基于異常的模型(230)還可以包括軟件組件Q05)(事實上, 轉換器(220)可能甚至無法訪問軟件組件(20 本身),但基于異常的模型可以包括具有基于異常的接口合約實現的包裝032)而非基于非異常的接口合約012)。基于異常的接口合約實現可以是與基于非異常的接口合約(212)等價的鏡像。由此,包裝(232)可以直接與軟件組件及其方法進行接口。如果基于非異常的接口合約(212)定義了軟件組件(205)中的函數的輸出變量, 則包裝(232)可被配置成將將輸出變量作為該函數的返回值來返回。如果基于非異常的接口合約(212)定義了函數的多個輸出變量,則包裝(232)可被配置成返回所選的輸出變量并根據普通輸出變量技術來傳遞其余的輸出變量。轉換器(220)可以調用各種不同的技術中的一個或多個來選擇要返回哪個輸出變量。例如,如果提供了輸出變量的特定重要“提示”(例如,與基于非異常的接口合約中的輸出變量“default (默認)”相鄰的指示),則轉換器(220)可以選擇要返回該輸出變量。如果轉換器(220)未識別重要提示,則轉換器(220) 可以使用某一其他技術來選擇要返回的輸出變量,諸如返回所列出的基于非異常的接口合約012)中的函數的最后一個輸出變量。可以響應于用戶輸入來修改轉換器(220)用來選擇多個輸出變量中要返回的的一個的技術或試探法。例如,用戶輸入可以指示如果變量名具有特定模式(變量名中的特定字符序列,最長的變量名,等等),則應該返回該輸出變量, 或者用戶輸入可以按照輸出變量要返回的次序(第一、第二、第三、最后,等等)來指示特定輸出變量。如果基于非異常的接口合約(212)未列出函數的任何輸出變量,則包裝對于該方法可以具有VOID返回類型,并且使該方法不返回值。轉換器(220)可以在消費應用程序被開發的同時生成基于異常的模型(230)。仍然參考圖2,消費應用程序可以消費原始的基于非異常的模型(210)或所生成的基于異常的模型030)。例如,在開發軟件應用程序的同時,轉換器(220)可以接收要生成基于異常的模型O30)的請求。例如,這可以響應于來自消費應用程序的軟件開發者的用戶輸入來完成。響應于該請求,轉換器(220)可以解析基于非異常的接口合約(212)并從中生成基于異常的模型030)。解析和生成可以自動地由轉換器(220)完成。該生成可以包括在不操縱或甚至訪問軟件組件(20 本身的情況下生成包裝032)。事實上,軟件組件(205) 可以是轉換器(220)無法解析和理解的目標代碼的形式。軟件開發者可以提供用戶輸入來為消費應用程序中的消費選擇基于非異常的模型O10)(例如,通過編寫代碼來調用帶有基于非異常的模型O10)的軟件組件Q05))?;蛘撸浖_發者可以提供用戶輸入來選擇基于異常的模型(230)(例如,通過編寫代碼來調用帶有基于異常的模型(230)的軟件組件。開發者可以使用諸如與以下將討論的示例類似的技術等標準的基于異常的技術來調用軟件組件O05)的基于異常的模型030)。這可以節省大量的時間和資源。例如,在原本將花費若干行代碼來調用帶有基于非異常的模型的軟件組件的情況下,這可以允許開發者用單行代碼來調用軟件組件。調用基于異常的模型(230)還可以較不復雜,從而使得經驗較少的開發者在開發消費應用程序時能夠調用可消費軟件組件。作為示例,如果消費軟件應用程序的開發者選擇消費基于異常的模型O30),則包裝(23 可被包括在消費應用程序源代碼O40)中,并且該源代碼(MO)可以用標準方式調用包裝032)。編譯器(250)可以用消費應用程序可執行代碼(沈0)來編譯消費應用程序源代碼(MO)和可消費軟件組件(20 。例如,可消費軟件組件(20 可被包括在可由應用程序的可執行文件訪問的動態鏈接的庫中。或者,軟件組件(20 可以用某一其他方式來消費,諸如通過與消費應用程序可執行代碼分開地提供軟件組件(20 、通過將軟件組件 (205)的源代碼包括在消費應用程序源代碼O40)中,等等。因此,軟件組件(20 可以由消費應用程序的編譯器(250)處理或無法被其處理。III.基于異常的組件模型生成和消費的示例現在將討論基于異常的組件模型生成和消費的示例。例如,考慮帶有三個函數的可消費軟件組件“MethodA (方法A) ”、“hint (繪圖)”和"GetBestMortgage (獲得最佳抵
押)”。軟件組件可以具有帶有以下代碼的基于非異常的接口合約
interface iFoo
HRESULT MethodA(default string** value 1,string** value2);
HRESULT Paint(int color);
HRESULT GetBestMortgage (int amount, Rate** bestRate,
string** bestBank);
}該接口合約代碼指示MethodA將具有返回類型HRESULT。由此,MethodA將如上所討論地返回HRESULT值。另外,代碼提示MethodA具有都是串類型的兩個輸出變量(如變量類型之后的“**”所指示的):“Valuel (值1) ”和“ValUe2(值2) ”。向輸出變量valuel呈現重要提示“default (默認)”。函數hint也具有返回類型HRESULT,但它不包括任何輸出變量。相反,它包括一個整數(int)型的輸入變量“color (顏色)”。函數GetBestMortgage 也具有返回類型HRESULT。GetBestMortgage具有一個整數型的輸入變量“amount (數量)”。 GetBestMortgage還具有兩個輸出變量整數型的“bestRate (最佳利率)”和“Rate (利率)”型的“bestBank (最佳銀行)”。為了調用這些函數中的一個,將定義輸入和/或輸出變量,函數將在傳遞變量的同時被調用,而輸出變量隨后將被讀取或檢查??梢越馕鲆陨系幕诜钱惓5慕涌诤霞s,并且轉換器可以從基于非異常的合約中生成以下基于異常的包裝代碼
string MethodA(string** value2) {
string* value 1;
if (FAILED(IFoo->MethodA(&value 1, value2))) {
throw();
}
return * value 1;
void Paint(int color) {
If (FAILED(IFoo->Paint(color)) {
throw();
string GetBestMortgage(int amount, Rate** bestRate) {
string* bestBank;
if (FAILED(IFoo->GetBestMortgage(amount, bestRate, &bestBank))) {
throw();
return *bestBank;
} 包裝的這些代碼可被包括在頭部源文件(例如,“.h”文件)中、正文源文件(例如,“.CPP”文件)中、在頭部和正本源文件之間拆分、或用某一其他方式來包括。例如,包裝可以用通常不將源代碼拆分成頭部和正文文件的語言(諸如》1或從¥幻來實現。包裝中的代碼通過包括如果函數失敗則拋出異常的代碼來提供基于異常的接口合約實現。另外,基于異常的接口合約實現是與以上討論的基于非異常的接口合約信息等價的鏡像-具有與基于非異常的接口合約中定義的函數相對應的合約信息。用代碼“throwO”來調用以上代碼中的基于異常的函數。例如,如果函數 "FAILEDdFoo- > MethodA(&valuel, value2),,返回真值,或者換言之如果來自 MethodA 的HRESULT值是指示MethodA失敗的除了一或零之外的某一值,則調用該“throw(拋出)” 函數。另外,包裝返回MethodA的“valuel”,即使valuel已經在基于非異常的合約中被定義為MethodA的輸出變量。選擇返回MethodA的變量“valuel”是因為在基于非異常的合約中對valuel的重要提示“default”。由此,在調用MethodA之前將不必定義valuel, 并且在MethodA返回之后將不必檢查valuel。這是因為包裝代碼定義了 valuel (用 “string^Valuel”行),并且包裝代碼檢查和返回valuel (用“returfvaluel ”行)。函數Paint在包裝中具有指示Paint將不返回值的返回類型“void”。如上所討論的,這可以在諸如Paint等函數不具有在基于非異常的合約中定義的任何輸出變量的情況下發生。然而,包裝不包括如果hint失敗則拋出異常的代碼。包裝為函數GetBestMortgage返回變量“bestBank”,因為不存在對 GetBestMortgage函數的輸出變量的重要提示,并且“bestBank”是在基于非異常的接口合約中為GetBestMortgage列出的最后一個變量。可以改為使用某一其他類型的試探法,諸如選擇第一個輸出變量、選擇第二輸出變量,等等。如可以見到的,包裝還包括如果 GetBestMortgage失敗("if (FAILED. ··)··· ”子句)則拋出異常的代碼。現在將討論示出可消費軟件組件的基于異常的模型的使用可以如何降低消費應用程序的開發者要調用可消費組件所輸入的代碼的另一示例。考慮以下代碼,這些代碼調用函數的基于非異常的模型來查找文件夾或子文件夾中的所有文件
權利要求
1.一種計算機實現的方法,包括解析可消費軟件組件(205)的基于非異常的接口合約012);以及從所述基于非異常的接口合約012)中生成所述可消費軟件組件的包裝032),所述包裝(232)具有基于異常的接口合約實現,并且所述基于異常的接口合約實現是與所述基于非異常的接口合約(212)等價的鏡像。
2.如權利要求1所述的方法,其特征在于,還包括使得所述基于非異常的接口合約和所述包裝可供在消費應用程序中消費。
3.如權利要求2所述的方法,其特征在于,還包括接收在所述基于非異常的接口合約和所述包裝之間進行選擇的用戶輸入。
4.如權利要求1所述的方法,其特征在于,還包括開發消費應用程序并接收要轉換所述應用程序中的基于異常的消費的基于非異常的接口合約的請求,其中所述解析和生成響應于所述請求來執行。
5.如權利要求1所述的方法,其特征在于,還包括將所述包裝包括在消費應用程序的源代碼中。
6.如權利要求1所述的方法,其特征在于,解析包括解析來自所述可消費軟件組件的多個函數的接口合約信息,并且所述基于異常的接口合約實現包括所述多個函數中的每一個的相對應的基于異常的接口合約信息。
7.如權利要求1所述的方法,其特征在于,對于所述基于非異常的接口合約中引用的、 帶有關于一個或多個變量是輸出變量的一個或多個提示的每一函數,所述包裝包括用于返回來自所述函數的一個或多個所提示的變量中的一個的代碼。
8.如權利要求1所述的方法,其特征在于所述方法還包括開發消費應用程序并接收要轉換所述應用程序中的基于異常的消費的基于非異常的接口合約的請求;使得所述基于非異常的接口合約和所述包裝可供在所述應用程序中消費;接收在所述基于非異常的用戶界面合約和所述消費應用程序中包括的包裝之間進行選擇的用戶輸入;如果所述用戶輸入選擇了所述包裝,則將所述包裝包括在所述消費應用程序的源代碼中;所述基于非異常的接口合約被包括在頭部文件中;響應于所述請求來執行所述解析和生成;解析包括解析所述可消費軟件組件中的多個函數的接口合約信息;所述基于異常的接口合約實現包括所述多個函數中的每一個的相對應的基于異常的接口合約信息;對于所述基于非異常的接口合約中引用的、帶有關于一個或多個變量是輸出變量的一個或多個提示的每一函數,所述包裝包括用于返回來自所述函數的一個或多個所提示的變量中的一個的指令;以及所述基于非異常的接口合約和所述可消費軟件組件包括用于返回錯誤代碼的代碼。
9.一種計算機系統,包括至少一個處理器(110);以及包括存儲于其上的指令的存儲器(120),所述指令在由所述至少一個處理器(110)執行時使得所述至少一個處理器(110)執行以下動作解析可消費軟件組件(205)的基于非異常的接口合約012);以及從所述基于非異常的接口合約(212)中生成所述可消費軟件組件(205)的基于異常的模型030),從而使得如果所述基于非異常的接口合約(21 將一個或多個變量提示為所述可消費軟件組件O05)中的函數的一個或多個輸出變量,則生成包括在所述基于異常的模型Q30)中生成用于返回來自所述函數的一個或多個所提示的變量中的一個的代碼。
10. 一種或多種具有收錄于其上的計算機可執行指令的計算機可讀存儲介質,所述指令在由至少一個處理器執行時使所述至少一個處理器執行以下動作 解析可消費軟件組件(205)的基于非異常的接口合約012); 確定所述基于非異常的接口合約(20 是否包括將一個或多個變量提示為所述可消費軟件組件O05)中的函數的輸出變量的代碼;從所述基于非異常的接口合約(212)中生成所述可消費軟件組件(205)的基于異常的模型030),所述基于異常的模型(230)包括基于異常的接口合約實現,從而使得如果所述基于非異常的接口合約(21 包括將一個或多個變量提示為所述函數的輸出變量的代碼, 則生成所述基于異常的模型(230)包括將所述用于返回來自所述函數的所提示的變量中的一個的代碼包括在所述基于異常的模型O30)中;以及使得所述基于非異常的接口合約(212)和所述基于異常的模型(230)可供消費應用程序(260)消費。
全文摘要
可以從基于非異常的模型中生成基于異常的組件模型。例如,可以解析可消費軟件組件的基于非異常的接口合約(諸如頭部文件中的基于非異常的接口合約)。另外,可以從基于非異常的接口合約中生成可消費軟件組件的包裝。包裝可以具有基于異常的接口合約實現,并且基于異常的接口合約實現可以是與基于非異常的接口合約等價的鏡像。如果基于非異常的接口合約將一個或多個變量提示為可消費軟件組件中的函數的輸出變量,則可以使用預定義試探法來將基于異常的接口合約實現要使用的那些變量中的一個選為函數的返回值。
文檔編號G06F9/44GK102214095SQ20111009462
公開日2011年10月12日 申請日期2011年4月6日 優先權日2010年4月7日
發明者C·J·西蒙茲, J-P·杜普萊西斯, M·M·阿格森 申請人:微軟公司