从基于非异常的模型中生成基于异常的组件模型的制作方法

文档序号:6358078阅读:179来源:国知局
专利名称:从基于非异常的模型中生成基于异常的组件模型的制作方法
技术领域
本发明涉及软件开发技术,尤其涉及软件模型开发技术。
背景技术
在开发软件应用程序时,开发者常常为应用程序编写代码来消费一个或多个预先存在的软件组件。例如,在先前可能已经编写了软件组件,并且该软件组件可能具有在调用该软件组件时该软件组件将遵循的接口合约。例如,接口合约可以提示软件组件中的一个或多个函数的输入变量、输出变量和/或返回值。许多这样的接口合约和软件组件被实现为基于非异常的模型,该模型通常返回错误代码(例如,HRESULT值)。错误代码可以指示函数是成功还是失败,并且还可以指示其他信息,例如关于失败(如果出现)的本质的附加信息。可以为应用程序编写代码来检查来自该组件的错误代码并处理失败(如果出现)。其他软件组件在基于异常的模型中实现, 该模型通常在出现失败时抛出异常。对于这样的基于异常的模型,可以调用异常处理函数来处理被抛出的异常并处理相对应的失败。在消费基于非异常的模型时,消费应用程序通常调用非异常技术,例如检查所返回的错误代码来检测失败。类似地,在消费基于异常的模型时,通常调用诸如异常处理函数等基于异常的技术。

发明内容
在消费软件组件时,消费应用程序通常根据由软件组件作者所选择的错误处理模型来消费软件组件。由此,在消费基于非异常的软件组件,消费应用程序已经调用基于非异常的技术来处理那些软件组件,即使将优选基于异常的技术。例如,在许多情形中,消费基于异常的软件组件可以比消费类似的基于非异常的软件组件使用更少的代码。此处描述的各实施例处理将基于非异常的软件组件模型转换成基于异常的软件组件模型,从而使得软件组件可以使用基于异常的技术来消费,即使组件被创作为基于非异常的组件模型。消费应用程序可以选择通过消费原始的基于非异常的模型或经转换的基于异常的模型来调用软件组件。在一个实施例中,工具和技术可以包括解析可消费软件组件的基于非异常的接口合约。另外,可以从基于非异常的接口合约中生成可消费软件组件的包装(例如,类包装)。 包装可以具有基于异常的接口合约实现,并且基于异常的接口合约实现可以是与基于非异常的接口合约等价的镜像。如此处所使用的,基于异常的接口合约实现是与基于非异常的接口合约等价的镜像,指的是(1)基于异常的接口合约实现在基于异常的接口合约实现中的方法或函数的信息和基于非异常的接口合约中的相对应的方法或函数的信息之间具有一对一的对应关系,以及(2)基于异常的接口合约实现和基于非异常的接口合约以相同水平与方法或函数交互(例如,两者都直接与函数或方法交互)。在工具和技术的另一实施例中,解析可消费软件组件的基于非异常的接口合约, 并且从基于非异常的接口合约中生成可消费软件组件的基于异常的模型。如果基于非异常的接口合约提示一个或多个变量是可消费软件组件中的函数的输出变量,则生成可以包括在基于异常的模型中,生成用于返回来自函数的一个或多个变量中的一个(即,被提示为是输出变量的变量中的一个)的代码。输出变量是被传递到函数并由函数填充的变量。合约可以用各种不同的方式来将变量提示为输出变量,这些方式在编程语言之间常常不同。 例如,合约可以使用C#中的关键词“ref”、通过在C++中的变量类型之后包括“**”等来提示输出变量。在工具和技术的又一实施例中,可以解析可消费软件组件的基于非异常的接口合约。可以确定基于非异常的接口合约是否将一个或多个变量提示为可消费软件组件中的函数的一个或多个输出变量。可以从基于非异常的接口合约中生成可消费软件组件的基于异常的模型。如果基于非异常的接口合约包括提示一个或多个输出变量的代码,则生成基于异常的模型可以包括将用于返回来自函数的一个或多个变量的代码包括在基于异常的模型中。可以使得基于非异常的接口合约和基于异常的模型可供消费应用程序消费。提供本发明内容是为了以简化的形式介绍一些概念。这些概念将在以下具体实施方式
中进一步描述。本发明内容并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。类似地,本发明不限于解决在背景技术具体实施方式
、或附图中讨论的特定技术、工具、环境、缺点、或优点的实现。


图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代码。可以检查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 (最佳银行)”。为了调用这些函数中的一个,将定义输入和/或输出变量,函数将在传递变量的同时被调用,而输出变量随后将被读取或检查。可以解析以上的基于非异常的接口合约,并且转换器可以从基于非异常的合约中生成以下基于异常的包装代码
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·阿格森 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1