CN108139893B - 基于组件的软件系统及开发方法 - Google Patents
基于组件的软件系统及开发方法 Download PDFInfo
- Publication number
- CN108139893B CN108139893B CN201680054204.0A CN201680054204A CN108139893B CN 108139893 B CN108139893 B CN 108139893B CN 201680054204 A CN201680054204 A CN 201680054204A CN 108139893 B CN108139893 B CN 108139893B
- Authority
- CN
- China
- Prior art keywords
- key
- cgdm
- vms
- input
- vmss
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
一种装配软件的方法,包括:使用户能够编码计算函数(CF)(S101);确定用户是否完成CF的编码(S102);使得用户能够使用一个或多个可用CF对零件函数(PF)进行编码(S103);程序确定用户何时完成创建所有PF(S104);程序使用户能够使用一个或多个可用PFs来创建软件。
Description
相关申请的交叉引用
本美国非临时专利申请要求于2015年7月16日提交的美国临时专利申请No.62/193,151的优先权。
背景技术
1.技术领域
本公开涉及基于组件的软件开发技术。
2.相关技术讨论
过程化编程是一种基于过程调用的概念的源自结构化编程的编程方法。过程(也称为程序、子程序或函数)包含一系列要执行的计算步骤。过程化编程语言的实例包括C语言、Fortran语言和Pascal语言。
在面向对象的编程中,关注将编程任务分解成利用接口显示行为(方法)和数据(成员或属性)的对象。过程化编程使用过程来操作数据结构,面向对象的编程将两者捆绑在一起,所以“对象”(作为类的实例)操作其“自己的”数据结构。
代码重用是提高软件开发效率的根本途径。函数是最小的可重用单元或结构。过程化编程或面向对象编程中的函数调用都在语句级别执行。与被调用函数的自变数相对应的变量需要声明、设置值并将其传递给被调用函数,并返回值被设置为变量,并在以后的计算中使用。这些语句在调用函数和被调用函数之间产生耦合,并降低调用函数的可重用性。当在过程化编程或面向对象编程中编写软件时,需要在语句级别声明和使用大量的应用程序专用数据变量。因为这些语句是应用程序专用的,所以它们不能在其他软件中重用。这些语句与软件中的重用代码使用相同的编程语言实现,它们与重用代码混合在一起。软件的维护和修改需要阅读、区分、理解并更改这些语句。当这些语句是由别人编写的时候,这特别耗时。
在本发明中,公开了一种软件开发方法,该软件开发方法在被称为计算目标数据报文的特殊数据结构及其属性页单中在软件的代码部分(函数)外声明所有应用程序专用变量。该方法还消除了函数之间的耦合。函数间是相互独立的,并且函数的可重用性得到提高。这些函数也变成与任何应用程序无关的纯粹的算法函数,并且可以在任何应用程序中使用。这进一步增加了函数的可重用性。通过利用部分函数实施以下操作来完成计算:将计算目标数据报文中的变量映射到函数的自变数并执行函数,并且将函数的计算结果映射回到计算目标数据报文。部分函数就像管理器那样通过组装函数来实现计算目标。软件中的应用程序专用信息、应用程序专用数据变量以及变量在计算中的使用的实施方式与代码(函数)不同,并且可以很容易地识别、理解和修改。软件的代码部分是纯粹的算法函数,它们不包含任何应用程序专用信息。
装配线是一种制造工艺,其中当半成品组件从一个工作站移动到另一个工作站时,添加可互换零件,其中零件依次添加直到产生最终组件。由于使用装配线,可以更快且以更少的劳动力组装最终产品。
因此,需要一种能够以装配线方式构建软件的基于组件或零件的机制。
发明内容
根据本发明的示例性实施例,提供了一种组装计算机代码以执行服务的方法。所述方法包括:将所述服务的输入/输出(I/O)请求转换成包括多个I/O键值对的相应数据报文;配置所述程序的部分函数(PF)以接收所述数据报文作为输入自变数;生成变量匹配结构(VMS)集(VMSS),所述变量匹配结构集包含映射到计算函数(CF)的自变数和所述输入/输出键值对的键对;并且利用所述VMSS配置所述PF以调用所述计算函数(CF),其中所述CF被配置为执行与所述服务有关的操作。
根据本发明的示例性实施例,提供了一种执行被配置为执行服务的计算机程序的方法。所述计算机程序包括部分函数(PF),所述部分函数被配置成接收包含多个输入/输出(I/O)键值对的数据报文作为输入自变数。所述方法包括:使用所述数据报文的名称检索包含多个元素的数据结构,其中每个元素包含名称和变量匹配结构(VMS);并且对于检索到的数据结构中的每个元素,使用所述元素的名称来检索计算函数(CF)并且使用元素的VMS和数据报文调用检索到的CF。
附图说明
从以下结合附图的描述可以更加详细地理解本发明的示例性实施例,在附图中:
图1示出了根据本发明构思的示例性实施例的组装软件的方法。
图2示出了可以用于执行该方法的示例性计算机系统;
图3示出了根据本发明构思的示例性实施例的配置软件的部分函数的方法。
图4示出了根据本发明构思的示例性实施例的执行软件的部分函数的方法。
图5示出了根据本发明构思的示例性实施例的组装软件的方法。
图6A示出了可以在本发明构思的实施例中使用的示例性数据报文。
图6B示出了可以在本发明构思的实施例中使用的示例性变量匹配结构集合。
图6C示出了示例性计算函数的输入和输出自变数的实例。
图7示出了示出根据本发明构思的示例性实施例的执行组装的软件的部分函数的流程图。
图8示出根据本发明构思的示例性实施例的允许用户组装软件的方法。
图9示出根据本发明构思的示例性实施例的执行部分函数的方法;并且
图10示出了根据本发明构思的示例性实施例的响应于应用数据报文的部分函数的示例性序列。
具体实施方式
将参照附图更详细地描述本发明构思,图中已经示出了本公开的示例性实施例。在整个附图中,使用相同或相似的参照数字来表示相同或相似的组件。然而,本发明构思可以以各种方式来实现,因此不应该被解释为限于在此公开的实施例。相反,提供这些实施例是为了能充分且完整地理解本公开以向本领域技术人员传达本公开的范围。
这里描述了基于组件的软件系统和开发方法。在下面的描述中,阐述了许多具体细节以便提供对本发明的更全面的理解。然而,本领域技术人员将明白,可以在没有这些具体细节的情况下实施本发明。在其他情况下,为了避免混淆本发明,没有详细描述公知的特征。
这里引用的计算机代码设备(例如,方法、类、库)可以被存储在数据存储介质上。这里使用的术语“数据存储介质”表示所有计算机可读的介质,例如光盘、硬盘、软盘、磁带、磁光盘、PROM(EPROM、EEPROM、快擦写EPROM等)、DRAM、SRAM等等。
图1是示出根据本发明构思的示例性实施例的组装构建软件的方法的高级别图示。
该方法包括使用户能够编码计算函数(CF)(S101)。例如,可以由使用户能够输入用于CF的代码的计算机程序提供包括文本字段的CF图形用户界面(例如,CF-GUI)。例如,CF-GUI可以包括第一按钮,当用户选择该第一按钮时,通知程序用户已经完成当前CF的编码。作为实例,CF可以被编码以执行计算,查询数据库,或者在网页上呈现图形或文本。例如,计算可用于对查询返回的结果执行数学计算。在实施例中,每个CF由用户赋予唯一的名称,并被编码以接收一个或多个输入参数(这里称为CF输入参数)并返回输出参数(在这里被称为CF输出参数)。例如,CF输入和输出参数可以是整数、浮点数、字符串、数组、指针等。
该方法然后包括确定用户是否完成CF的编码(S102)。例如,选择第一按钮可以指示用户希望创建另一个CF。例如,CF-GUI可以包括第二按钮,当由用户选择时通知程序用户已经完成创建CF 50。已完成的CF可以存储在CF数据库60中,以使其可供其他编码人员使用。
该方法接下来包括使得用户能够使用一个或多个可用CF对部分函数(PF)进行编码(S103)。例如,程序可以呈现第二GUI(例如,PF-GUI),该第二GUI具有存储在GUI的CF数据库60中可用CF的可选列表以及显示已经选择哪些CF和它们在PF内的执行顺序的窗格。例如,用户每次可以选择可用CF之一,对应的PF需要对应的CF的实例,并且将选择的实例按照用户希望执行CF实例的顺序插入到窗格中。
该方法接下来包括程序确定用户何时完成创建所有PF(S104)。例如,PF-GUI可以包括图形按钮,该图形按钮在被用户选择时指示用户已经完成所有PF 70的创建。PF 70可以存储在PF数据库80中,使得它们可以被其他用户使用。
该方法然后包括程序使用户能够使用存储在PF数据库80(S105)中的一个或多个可用PF 70来创建软件。例如,可以使用计算机程序来启动呈现文本字段以使用户能够输入连接代码和可用PF 70的可选列表的第三GUI。例如,用户可以从列表中选择PF并将对应的PF插入到计算机程序的连接代码中的某个位置。在实施例中,计算机程序可以是由解释器解释的形式。
图2示出了可以用来实现图1的方法的示例性计算机系统1000。参见图2,计算机系统1000可以包括例如中央处理器(CPU)1001、随机存取存储器(RAM)1004、打印机接口1010、显示单元1011、局域网(LAN)数据传输控制器1005、LAN接口1006、网络控制器1003、内部总线1002和一个或多个输入设备1009,例如键盘、鼠标等。如图所示,系统1000可以连接到数据存储设备,例如,经由链路1007连接到硬盘1008。上述各个GUI可以呈现在显示单元1011上。上述CF 50、PF 70、程序和组装的软件可以存储在存储器1004和/或硬盘1008上。
图3示出了根据本发明的示例性实施例的可用于实现图1的步骤S103以编码PF的方法。参见图3,该方法包括配置部分函数以接收计算目标数据报文(CGDM)的输入(S301)。
在示例性实施例中,CGDM具有(i)输入和输出部分,(ii)名称-值形式(例如,将赋值给在任何后续计算中应该具有名称的变量的所有值和值的子结构),以及(iii)其结构遵循一些语法规则(例如,HTML、XML或JSON)。两个CGDM如果满足以下条件则相同:(i)他们的输入和输出部分都有相同的结构,(ii)结构中的所有名称相同。CGDM用作PF的自变数。任何PF只能有一个自变数。PF可以处理一个或多个CGDM。每个CGDM具有与之对应的VMSS。VMSS指示PF如何实现CGDM的计算目标。
CGDM中的名称被称为工作名称,它们表示应用数据的变量。
所有的PF具有相同的接口。例如,每个部分函数(PF)被配置为被CGDM调用,其可以被称为部分函数(PF)的调用参数或自变数。CGDM包括输入参数X(例如,输入:X)和输出参数Y(例如输出:Y),其中X和Y可以是具有名称(键)-值形式的任何数据结构。在X部分中,名称具有值,Y部分的值为空白以由部分函数填充。两个CGDM如果满足以下条件则相同:它们两者的输入部分和输出部分具有相同的结构,并且结构中的所有名称(键)相同。每个CGDM都有唯一的名称。输入部分的所有名称(键)都被赋值的CGDM称为CGDM的实例。PF返回与被赋值的CGDM的输出部分相同的数据结构。PF接受任何CGDM作为自变数。
PF包含一个或多个计算函数(CF)。任何函数都可以是CF。PF可以接受任何CGDM作为自变数,因为PF如何执行CF不是仅由CGDM决定的,而是同时由被称为变量匹配结构(VMS)的数据结构决定的。PF通过CF调用函数执行CF。CF调用函数接受CGDM、VMS和CFResults结构作为自变数。它为PF提供了统一的接口以供调用。CF调用函数:(i)根据CGDM和VMS准备CF的自变数和调用;(ii)根据CGDM和VMS设置CGDM的输出部分;以及(iii)将结果保存到CFResults以供后续的CF执行可能的用途。
在本发明的实施例中,存在两种类型的CF函数:(i)完整CF;以及(ii)部分CF。完整CF不会调用PF,并且完全完成接口要求。部分CF调用PF,并且部分完成接口要求。接口要求如何完成取决于所调用的PF,以及PF被配置成要做什么。
VMS在CF和CGDM之间映射数据,所以CF与CGDM没有直接关系,这与应用数据变量无关。CF可以是纯粹的算法函数。VMS使CF与CGDM分开,如果由部分CF发送CGDM,则处理CGDM的CF也不限于部分CF。任何CF之间没有调用行为,所以CF之间没有耦合,并且它们是相互独立的,并且每个CF可以被独立地开发以在不知晓其他算法的情况下实施算法。
当CF调用PF时,其准备CGDM,并将CGDM作为自变数传递给调用的PF。CGDM中的值的命名遵循一致性命名规则。可以在CF的VMS中指定CF调用的CF的名称及其创建的CGDM的名称。
VMSS提供连接CF的控制,部分CF提供连接PF的控制。可以通过操纵VMS和VMSS以便根据给定的设计连接PF和CF来形成软件。
对于一个CGDM,我们调用所有PF(可能涉及超过一个PF)和CF的执行序列以实现CGDM的计算结构的CGDM的计算目标。
图6A是可以作为自变数传递给部分函数的CGDM的实例。在此实例中,CGDM具有JavaScript对象表示(JSON)格式。CGDM包括一个或多个输入键值对和输出键值对。CGDM可以包括解析器或解释器可用于提取输入和输出键值对的标识符。
在图6A的实例中,CGDM中的输入参数标识符题为“Input:”,输出参数标识符题为“Output:”。例如,在解析CGDM的解析器识别出“Input:”的标识符后,解析器可以假定位于下一个开放大括号“{”和闭合大括号“}”之间的下一个元素是键值输入参数对。例如,在解析CGDM的解析器识别出“Output:”的标识符之后,解析器可以假定位于下一个开放大括号“{”和闭合大括号“}”之间的下一个元素是键值输出参数对。例如,键值对可以用分号“;”分隔,并且给定键值对的键和值可以用冒号“:”分隔。
虽然图6A示出使用术语“Input:”来表示输入参数键值对,使用术语“Output:”来表示输出参数键值对,使用术语“{”来表示键-值对开始,使用术语“}”来表示键值对的结束,并且使用术语“:”来使解析器能够将键和值区分开,但是本发明不限于此。例如,根据实施者的期望,这些术语可以被改变为其他词或符号。
返回参见图3,该方法包括确定用户是否期望部分函数调用计算函数(CF)的新实例(S302)。新实例意味着这是首次请求插入特定的CF,或者所请求的插入将导致在不同的CF(例如,CF1)之后插入CF(例如,CF2)的实例。为了便于说明,假定仅图6B所示的第一计算函数CF1和第二计算函数CF2可用。如果用户请求了CF的新实例,则该方法插入标签以标识特定的CF(S303)。例如,由于用户已经请求使用第一计算函数CF1,所以该方法将例如“CF1”的标签插入到变量匹配结构序列(VMSS)中以识别第一计算函数CF1将被调用。VMSS在完成时将包括一系列对,其中每对包括给定CF(例如,CF1)的名称和VMS(例如,CF名称、VMS)。例如,完成的VMSS可以包括{{CF1,VMS1},...,{CFN,VMSN}}对,其中N是1或更大。VMSS与CGDM相关联,VMSS中的所有VMS完全填充CGDM的所有名称(键)的值。也就是说,VMSS实现了CGDM的计算目标。VMSS指示PF如何实现CGDM的计算目标。
接下来,该方法包括使用户能够配置变量匹配结构(VMS),变量匹配结构(VMS)将CF实例的输入参数映射到CGDM内的输入参数,将映射CF实例的输出参数以便输出CGDM内的输出参数(S304)。VMS指示PF如何执行一个CF。
例如,图6B示出了第一VMS 601的实例,其被配置用于具有多个键对的第一CF1611,其中每个键对由分号“;”分隔。例如,第一VMS 601的第一键对“a:x”中的第一键“a”对应于第一CF1 611的第一输入参数“a”,第一键对“a:x”中的第二键“x”对应于图6A中所示的CGDM 600的第二输入参数'x:2'。例如,第一VMS 601的第二键对“b:y”中的第一键“b”对应于第一CF1 611的第二输入参数“b”,并且第二键对'b:y’中的第二键“y”对应于图6A中所示的CGDM 600的第三输入参数'y:3'。例如,第一VMS 601的第三键对“c:z”中的第一键“c”对应于第一CF1 611的输出参数“c”,并且第三键对“c:z'的第二键“z”对应于图6A中所示的CGDM600的输出参数'z:NULL'。图6C示出了调用CF的实例。在CF的参数是复合类型的情况下,如果它映射到CGDM的输入部分中的同种复合类型,则假定参数的名称是C并且相同类型的名称(CGDM的输入部分的子结构)是D,则映射可以被表示为'C:D'。如果它没有映射到CGDM的输入部分中的同种复合类型,并且其成员映射到分布在CGDM的输入部分中的名称,则需要指定复合类型的每个成员的映射,假定复合类型是T并且CGDM的输入部分中的名称是d1,d2,...,则映射可以表示为'C,T('member1:d1','member2:d2'...)'。如果C是数组类型,则映射可以表示为'C:Array[d1,d2,...]'。
接下来,该方法将配置的VMS插入到与部分函数PF相关联的VMMS中(S305)。插入VMS,使得解析器可以识别它与所标识的CF相关联。例如,标号“CF1”下方的图6B所示的第一VMS601是被配置用于插入到VMSS中并且与第一计算函数CF1相关联的PF的VMS的实例。该方法然后包括确定用户是否完成(S305)。例如,用户可以使用GUI来选择计算函数(CF)并指示他们已经完成输入计算函数(CF)。如果用户选择另一计算函数(CF)或先前选择的计算函数(CF)的另一实例,则该方法前进到步骤S302。例如,如果用户要进入同一CF的另一个实例(例如CF1),并给CF发送CGDM的不同参数,则该方法将前进到步骤S304。例如,这可能导致在标识第一计算函数CF1的相同标签(例如,CF1)下插入第二VMS 602。然而,如果用户选择新的计算函数(例如,CF2 612),则可能导致插入第二标签(例如,CF2)和第三VMS 603,如图6B所示。
除了从CGDM的输入中取值,CF的自变数也可以从一个或多个先前执行的CF的结果中取值。例如,当PF执行第一CF时,可以将执行CF的结果存储到PF内部的数据结构(例如,CFResults结构)或列表中,使得如果PF再次执行相同的CF或第二CF,则结果可供CF使用,使得相应的CF可根据需要对结果进行操作。如图7所示,当通过PF调用来调用PF 701时,PF701通过CFCaller功能执行CF。CFCaller函数可以从存储多个可用CFCaller函数的外部存储区域702(例如,CFCaller库)加载。CFCaller函数将CGDM、与CF关联的VMSS 703和CFResults结构704作为输入。VMSS 703可以从外部存储区域705(例如,VMSS库)加载。CFCaller函数执行以下操作:(1)声明CF的自变数,并使用CFResults结构704内的VMSS703、CGDM和CFResults来初始化每个自变数;(2)执行具有自变数的CF;以及(3)将结果添加到CFResults结构704,并根据VMSS 703设置CGDM的输出(例如,CGDM.output)。在实施例中,每个CF具与其关联的CFCaller函数,并且每个CFCaller具有相同的接口。VMSS库包含PF调用的所有CGDM的所有VMSS。CFCaller库包含与PF包含的所有CF相关联的CFCaller函数。
图4示出了根据本发明的示例性实施例的用于对接收到的CGDM执行PF调用的方法。该方法包括:清除CF Results结构704(S401);使用CGDM的名称从VMSS库705检索对应的VMSS 703(S402);对于VMSS 703中的每个元素,使用元素名称部分(CF)从CFCaller库702中检索CFCaller函数,并用元素的VMS部分、CGDM和CF Results结构704(S403)调用检索到的CFCaller函数;制作CGDM的输出(现已赋值)的副本(S404);并返回副本(S405)。
CF可以调用其他PF。实现方法是创建CGDM,并将创建的CGDM作为自变数进行调用。如果CF将它所计算的CGDM中的值传递到它所创建的CGDM中,CF应当使用与它所计算的CGDM中相同的名称。如果CF将CF Results结构704中的值传递给它所创建的CGDM,则它应该使用与CF Results结构704中相同的名称。这被称为名称一致性规则。当CF创建CGDM来调用另一个PF时,它应该遵循名称一致性规则。
由于所有PF具有相同的接口,因此调用不同PF的差异仅在于名称。对于它所调用的所有PF,可以为CF添加PF名称自变数,然后可以在CF的VMS中指定调用哪个PF。也可以在VMS中指定它所创建的CGDM的名称。因此可以在CF开发之后确定CF调用什么PF以及它使用什么CGDM名称。
在实施例中,所有数据存储参数都是名称(键)-值形式。数据存储格式可以与CGDM具有不同的语法规则。
数据存储和CGDM中的名称可能由不同的用户在不同的时间创建,因此可能不一致。名称值的集合在满足以下条件的情况下被称为一致:集合中的相同名称为命名值描述相同的语义,并且集合中的不同名称为命名值描述不同语义含义。一致的名称值的集合形成名称空间(NS)。PF和它的CF需要在一个NS中运行。如果CGDM和数据存储不在同一个NS中,则可以对CGDM进行转换以将它们转换为同一个NS。对于一个CGDM,我们调用所有PF和CF的执行顺序来实现CGDM的计算目标。
图5示出了根据本发明的示例性实施例的软件开发过程。该过程包括:将软件的所有输入和输出要求转换成CGDM格式(S501);设计由转换生成的每个CGDM的计算结构,用标记规则标记CGDM,必要时创建新的标记规则;必要时使用属性页单用新的标记规则标记CGDM(S502);设计数据存储以支持设计的计算结构(S503);选择现有的PF和/或CF;必要时开发新的CFCaller,如果添加新的标记规则,则对涉及的CF开发新的CFCaller(S504);,并且创建VMS和VMSS以连接开发的和/或选择的PF和CF(S505)。
在实施例中,通过调用没有输入部分的值的CGDM(即,CGDM的名称实例(NI))来实施步骤S505。NI是输入和输出部分都没有值的CGDM。在实施例中,调用其他PF的每个CF都具有开发模式(DV)处理。在DV中,CG接收其所计算的CGDM的NI,并将它为自己计算的CGDM所创建的所有CGDM的NI输出到持久性数据存储(例如像文件)。输出的NI指明调用的PF的CGDM的内容。可以相应地创建VMS和VMSS。
图8示出根据本发明构思的示例性实施例的使用一个或多个可用部分函数(PF)来生成软件的方法。该方法包括:询问用户从可用的PF中选择PF(S801);询问用户来键入输入名称(键)-值对和输出(键)-值对(S802);基于键入的数据使CGDM格式化(S803);将格式化的CGDM作为输入自变数插入调用PF(S804);确定用户是否完成PF调用(S805)。如果用户没有完成,则该方法进行到步骤S801,以询问用户选择新的PF。如果用户完成,该方法终止。
图9示出根据本发明示例性实施例的包括PF调用的解释软件的方法。该方法包括解析PF调用以识别给定的PF和作为自变数传递给PF的CGDM(S901)。该方法然后包括加载与所识别的PF相关联的VMSS,并识别所标识的CGDM内的输入键值对和输出键值对(S902)。该方法然后包括解析加载的VMSS的下一行(S903)。该方法然后确定解析的行是否包含CF标签(S904)。例如,如果下一行是图6B所示的VMSS的第一行,那么该方法将得出结论:它已经识别出CF标签CF1。如果确定已经识别出CF标签,则该方法从所确定的CF标签中识别出要调用的特定CF,并且解析VMSS的下一行。然后,如果该方法确定下一行不是CF标签(即,下一行对应于VMS),则该方法将VMS的当前键对的第一键与所识别的CF的选择的I/O参数相匹配,并且将当前键对的第二键与CGDM的选择的I/O键相匹配(S906)。例如,如果解析VMS 601,并且当前解析的键对是“a:x”,并且所识别的CF是CF1 611,则该方法将当前键对“a:x”的第一键“a”与CF1611的输入参数“a”相匹配,并且将当前键对的第二键“x”与CGDM 600的输入参数x:2的输入键“x”相匹配。然后,该方法包括将调用格式化成所识别的CF,使得CF的选择的I/O参数被传递给选择的I/O键的值(S907)。例如,CFL1 611的输入参数“a”被传递值“2”,因为第一键'a'与'x'匹配且x被设置为2(例如'x:2')。然后该方法对VMS的每个键对重复这些匹配步骤。该方法确定它是否解析VMS的最后一个键对以确定是否完成解析(S908)。如果该方法没有完成,则通过前进到步骤S906,前进到VMS的下一个键对。如果该方法完成,则进行到步骤S902,解析VMSS的下一行以在此前识别的CF标签下寻找新的CF标签或另一个VMS。
虽然图6A示出了使用了JSON格式用于CGDM,但是本发明不限于此。例如,JSON格式可以被替换为超文本标记语言(HTML)格式或可扩展标记语言(XML)格式。我们将标记规则定义为以下规则:使用CGDM的语法规则来扩展CGDM的内容,使得对于宣发的任何输入实例都存在与之对应的扩展内容,并且可以从扩展内容导出输入实例及其全部数据特征。标记规则与算法相关联。
在本发明的实施例中,输入到软件的数据报文是HTML格式,CGDM是JSON格式,数据存储是关系数据库,这形成web开发环境。处理输入的部分函数在Web浏览器中运行,并且可被称为前端部分函数。运行服务器端的部分函数可能被称为后端部分函数。后端部分函数可以连接到数据库。
一个PF处理的HTML输入PF是处理线性级联输入的输入。线性级联输入的实例是选择州,然后选择郡,然后选择城市的输入。输入是<select>的列表和当前选择,输出是下一个选项数组。标记规则可以是表达列表的任何规则。标记规则的实例是,将第一个列表标记为<select cascade=“cs1”cs1=“1”mName=“name1”...>,将第二列表标记为<selectCascade=“cs1”cs1=“2”mName=“name2”...>,将第三列表标记为<select cascade=”cs1”cs1=“3”mName=“name3”...>,以此类推。Cascade是计算名称,Cascade=“cs1”声明实例cs1,cs1='n',n声明列表中的位置。PF由<select>元素的onSelect事件触发。所有的<select>都设置了相同的onSelect事件处理程序cascadeHndler。cascadeHndler是处理这种类型输入和输出需求的部分函数。处理程序的算法是:
从Cascade=“instance_i”获取实例名称;
从instance_i=“n”获取位置编号;
获取选择的值v和当前<select>的名称n1
获取下一个<select>的名称n2
发送下面形式的数据报文
{{“input”:
{“n1”:v}
},
{“output”:{
[{“n2”:0}]}
}}
至后端组件
将返回结果设置为下一个<select>
在一个HTML数据信息中任何长度和具有任何应用含义的任何数量的级联输入都可以由该部分函数来处理。我们可以认为部分函数仅包含实施上述算法的一个CF,其实施纯粹的级联并且不涉及被分配给级联的应用含义,其国家-州-郡或年级-班级-学生姓名。稍后给出具有较小函数粒度的级联实施方式。
另一种输入的情况被称为星级级联输入,其中一些<select>的选项由一个<select>决定,如同根据已经选择的衣服来决定可用的尺寸和颜色选项的情形。对于中心标记<select star=”star1”star1=”name list of all end select node”>,不需要标记端节点<select>。当完成中心<select>的选择时,下面形式的数据报文被发送到后端,
{
{“input”:
{“centerName”:“v”}
},
{“output”:{
[{“n1”,“”}],
[{“n2”,“”}],
…
}}
}
其中n1和n2是端节点的名称。当返回值不是数组而是单个值,并且端节点是文本或数字输入时,这将变成自动填充,就像选择了客户名称,其地址被自动填充一样。
输入建议处理是自动填充的逆向操作。除当前输入值和其他一些输入值也可以限制当前输入的选项,如部门和职位输入限制员工姓名输入的建议。当当前输入值为文本时,对于建议值可能有不止一个解释,例如,可能意味着建议值以该文本开始或包含文本。所以需要对该值提供更多的信息。
{
{“input”:{
{“otherValues1”:“v1”},
{“otherValues2”:“v2”},
{“currentValue”:{
{“value”:“v3”},
{“type”:“LIKE”}
}
}
…
},
{“output”:{
[{“n1”,“”}]
}
}
},其中n1是当前输入元素的名称。
范围输入也可以通过标记规则实现,例如第一元素<input rangeInput=“ri1”ri1=“1”...>,第二元素<input rangeInput=“ri1”ri1=“2”...>或对于选择输入第一个元素<select rangeInput=“ri1”ri1=“1”...>,第二元素<select rangeInput=“ri1”ri1=“2”...>。该算法在接受当前输入之前检查它是否满足另一个输入设置的约束或一个输入限制另一个输入的选择。由于输入格式的选择,可以存在少量不同类型的范围输入,如日期范围输入、选择范围输入、数值范围输入。
表单包含若干不同类型的输入元素(文本、数字、列表选项、范围输入、级联输入...)。表单提交的动作是收集所有元素的(名称、值)对。表单提交的标记规则是为每种类型的输入元素定义类型符号。不同的类型意味着名称值访问需要使用不同的方式。标记每个输入元素的正确类型。表单提交的算法是:
对于每种类型{
获取该类型的所有输入元素
对于该类型的每个输入元素{
获取名称和值,将名称值打包成JSON格式
}
}
将数据报文标记为ADD或MODIFY
将JSON数据报文发送到后端地址
表单提交可以是添加新数据或修改旧数据。对于修改,首先从后端加载数据,并带有一些额外的数据、键或参考数字。然后数据被修改并发送到后端。额外的键数据可以通过例如cookies的相似机制来处理。cookies的一种实施方式是使用具有特殊标签的HTML的一些隐藏元素。对于添加新的数据,不需使用额外的键数据。所以表单提交的PF可以区分修改和添加。表单PF可以处理具有任何数量的确定类型的输入元素的任何表单的表单提交。
搜索页面包含作为搜索条件的一个或多个数据输入元素以及显示搜索结果的二维数据网格。数据网格的每一列都可以被命名。对于数据搜索的提交,发送到后端的JSON数据报文有两部分,如图所示的空的二位数组部分的搜索条件部分和数据网格部分:
{
{“input”:{
{“name1”:“value1”},
{“name2”:{
{“Max”:{“value”:“v2”,“EQUAL”:“true”}},
{“Min”:{“value”:“v3”,“EQUAL”:“false”}}
}},
…
},
{“output”:{
[[{name4:0},{name5:0},…]]
}}
},其中name2指明范围值输入,EQUAL为真意<=or>和假意<or>。
搜索条件部分可以是命名且标记的类型,并且可以与ADD类型的表格一样被打包。
后端的一个实施例是选择关系数据库作为数据存储,并且在数据报文之间接收和发送的数据报文是JSON格式。对于需要与关系数据库交互的PF,需要使用数据库模式名称。对于数据报文中与数据库模式名称对应的工作名称,将它们转换为数据库模式名称。表的列名称的格式为tableName.columnName。处理插入单个表的PF可以使用如下所示的CGDM:
{“input”:{
{“column1”:“table1.column1”},
{“column2”:“table1.Column2”},
{“column3”,“table1.Column3”},
…
}}
对单表插入,SQL插入语句以相同方式处理每个字段,所以存在一种类型的数据。处理这种插入的CGDM变成,
{input:{
{“table1.column1”,“”},
{“table1.Column2”,“”},
{“table1.Column3”,“”},
…
}}
对于主-从表内的插入,CGDM为
{“input”:{
{“Master”:{
{“table1.column1”:“”},
{“table1.Column2”:“”},
{“table1.Column3”:“”}
…
}}
{“Detail”:{
[{“table2.column1”:“”},
{“table2.Column2”:“”},
{“table2.Column3”:“”},…]}}
}},
其中CGDM包括主表的数据和从表的数据数组。
处理一个表的更新的PF具有如下的CGDM
{“input”:{
“primarykey”:{
{“table1.column1”:“”},
{“table1.Column2”:“”},
…
}
},
{“values”:{
{“table1.Column3”:“”},
{“table1.Column4”:“”},
…
}}
}
处理主-从表更新的PF具有如下的CGDM:
{“input”:{{“m_Primarykey”:{
{“table1.column1”:“”},
{“table1.Column2”:“”},
…
}
},
{“m_values”:{
{“table1.Column3”:“”},
{“table1.Column4”:“”},
…
}
},
{“d_Primarykey”:{
{“table2.column1”:“”},
{“table2.Column2”:“”}
…
}
},
{“d_values”:{
{“table2.column3”:“”},
{“table2.Column4”:“”}
…
}
},
{“d_data”:{
[{“table2.column1”:“”},{“table2.Column2”:“”},…,
{“table2.Column3”:“”},{“table2.Column3”:“”}…]
}
}}
}
对于下面的实例,假设SQL选择语句采取的形式为:从[B:表部分]选择[A:输出部分],其中由[D:聚合部分]组成的[C:条件部分]具有[F:顺序部分]顺序的[E:聚合条件]。其输入和输出的数据分为六个部分。我们假设A部分包含在B部分中出现的表的列或在B部分中出现的表的列上的SQL函数;B部分包含表和连接关系;C部分包含以下形式的条件:列=值,或列>(=)值,或列<(=)值,相同关系的类列值字段LIKE值SQLFunction(column);D部分包含SQLFunction(column)列;E部分包含以下列SQLAggregateFunction(column)=,或<(=),或>(=)值;并且F部分包含列。
B部分中所需的表及其连接关系信息可以从数据库的模式中获得,但是连接类型信息应该来自应用。可以选择数组结构来表示实现此select语句的PF的CGDM中的两个表之间的关系。该select语句的CGDM是:
{{“input”:
{{“requirement”:{
[{“tableA.column8”:“tableA.column8”},
{“total1”:{“tableB.column4”:
{
“FUNC”:“SUM”
}}
},
…]}
},
{“table”:{
{[“tableA”,“tableB”,“joinType”,“tableA.column1=tableB.column2”,“tableA.column3=tableB.column4”,…],
[“tableC”,“tableD”,“joinType”,“tableC.column1=tableD.column2”,“tableC.column3=tableD.column4”,…],
…}}
},
{“condition”:{
{“tableA.column5”:“v1”},//default to tableA.column5=v1
{“tableB.column1”:{
“value”:“v2”,//default to SUM(tableB.column1)=v2
“FUNC”:“SUM”
}
},
…}
},
{“groupby”:[
“tableA.column6”,
{“tableB.column2”:{
“FUNC”:“DATE”
}
},
…]
},
{“having”:{
{“tableB.column3”:{
“value”:“v3”,
“FUNC”:“MAX”
}
},
…}
},
{“orderby”:[
“tableA.column7”,
…]
}
}},
{“output”:
{“results”:
[{“tableA.column8”:‘’},
{“total1”:‘’},
…]}
}}
input.requirement对应于SQL select的A部分,并指定SQL select的输出。它指定数组格式。{“tableA.column8”:“tableA.column8”}表示获取tableA.column8的值并将其设置为名称“tableA.column8”。以下对
{“total1”:{“tableB.column4”:
{
“FUNC”:“SUM”
}}
}
意味着应用SUM函数列tableB.column4,并将该值应用到名称“total1”。
对于使用多于一个PF来实现后端计算任务的实施方式,考虑销售订单的出货的操作的情况,如图10所示。假定销售订单可以部分地出货(由于部分支付或库存的限制),所以销售订单可能需要多次出货。收到的CGDM如下:
{“Order_Shipment_Data”:
{“input”:{
{“orderID”,“value1”}
}},
{“output”:{
{“order_info”:{
{“orderCode”:””}
{“salesmanName”:””},
{“customerName”:””}
}},
{“order_prod_info”:{
[[{“productName”:””},{“productionDate”:””},
{“Quantity”:””},{“shippedQuantity”:””},{“quantityLeft”:””}]]
}}
}}
}
输入是订单id,所需输出包括一些订单信息、订单代码、销售员姓名和客户姓名,以及产品信息、产品名称、产品日期、订单数量、出货数量和未出货数量的列表。
在图10中,DataExpander PF 10接收CGDM。DataExpander PF 10连接到关系数据集12。CGDM的工作名称空间映射WNSM 100如下:
{
{“orderID”,“order.id”};
{“orderCode”,“order.code”}
{“salesmanName”,“employee.name”}
{“customerName”,“customer.name”}
{“productName”,“product.name”}
{“productionDate”,“product.productionDate”}
{“Quantity”,“order.Quantity”}
}
映射后,CGDM变成如下:
{“Order_Shipment_Data”:
{“input”:
{“order.id”,“value1”}
},
{“output”:{
{“order_info”:{
{“order.code”:“”}
{“employee.name”:“”},
{“customer.name”:“”}
}},
{“order_prod_info”:{
[[{“product.name”:“”},{“product.productionDate”:“”},
{“order.Quantity”:“”},{“shippedQuantity”:“”},{“quantityLeft”:“”}]]
}}
}}
}
PF 10具有两个CF,Select和Packer。Select CF运行三个实例102、104和106。Packer CF运行一个实例108。Select将上述实例的SQL select类型用于关系数据库,Packer CF将其所有输入包装到相应的数据报文输入、输出中(例如CGDM),并将该数据报文发送给Loop PF 14。PF 14具有一个称为KeyMatchLoop的CF,该CF运行一个将数组A和B作为输入并输出数组C的实例。A、B、C中的每个元素都有键部分和值部分。元素的键是一系列名称-值。如果两个键的名称值序列的长度相同,并且对于序列中每个位置的两个名称-值对而言名称是相同的,则两个键是相同的类型。如果两个键具有相同类型并且相应名称的值相等,则两个键相等。A和B具有相同类型的键。KeyMatchLoop的算法是,
对于A的每个元素a
创建具有与a相同的键部分的元素c
if B的元素b满足a.key==b.key{
通过计算规则1从a和b的值部分计算c的值部分
}
else{
通过计算规则2从a和b的值部分计算c的值部分
}
将c添加到C
计算规则1和计算规则2由计算器PF 16完成。PF 16具有3种计算,等于、零和减。PF10的Order_Shipment_Data的CGDM是,
{“Order_Shipment”:
{“Select.order”:
{
{“input”:{
{“requirement”:{
{“order.code”:“order.code”}
{“salesman.name”:“salesman.name”},
{“customer.name”:“customer.name”}
}},
{“condition”:{
{“order.id”,“Order_Shipment_Data.input.‘order.id’”}
}},
{“table”:{
{[“order”,“salesman”,“inner join”,“order.salesmanID=salesman.id”],
[“order”,“customer”,“inner join”,“order.customerID=customer.id”]}
}}
}},
{“output”:
{“result”:“Order_Shipment_Data.output.order_info”}
}}
}},
{“Select.orderProduct”:
{
{“input”:{
{“requirement”:{
[{“product.name”:“product.name”},
{“production.date”:“production.date”},
{“order_product.quantity”:“order_product.quantity”}]
}},
{“condition”:{
{“order_product.orderId”,
“Order_Shipment_Data.input.‘order.id’”}
}},
{“table”:{
[“order_product”,“product”,“inner join”,
“order_product.productId=production.id”]
}}
}},
{“output”:{
“result”:“”}
}}
}}
{“Select.shipped”:
{
{“input”:{
{“requirement”:{
{“product.name”:“product.name”},
{“production.date”:“production.date”},
{“shippedQuantity”:{“shipment.Quantity”:
{
“FUNC”:“SUM”
}}
}
}},
{“condition”:{
{“shipment.orderid”,“Order_Shipment_Data.input.‘order.id’”}
}},
{“table”:{
[“shipment”,“product”,“inner join”,“shipment.productID=product.id”]
}}
{“aggregate”:{
[“product.name”,“product.productiondate”]
}}
}},
{“output”:
{“result”:“”}
}
}}
{“packer”:{
{“input”:{
{“In”:
{
{“A”:“Select.orderProduct.output.Result”},
{“B”:“Select.shipped.output.Result”}
}},
{“Out”:{{“C”:“Order_Shipment_Data.output.order_prod_info”}}}
}},
{“output”:{
{“result”:“Order_Shipment_Data.output.order_prod_info”}
}}
}}
}
数据报文Order_Shipment_Data的输出部分的order_prod_info用作输入以生成PF 10发送给PF 14的数据报文的输出部分。PF 10向PF 14发送数据报文Order_Shipment_Data_Full,
{“Order_Shipment_Data_Full”:{
{“input”:{
{“A”:[[{“product.name”:“v1”},{“product.productionDate”:“v2”},
{“order_product.quantity”:“v3”}]]},
{“B”:[[{“product.Name”:“v4”},{“product.productionDate”:“v5”},
{“shippedQuantity”:“v6”}]]}
}},
{“output”:{
{“C”:[[{“product.Name”:“”},{“product.productionDate”:“”},
{“order.Quantity”:“”},{“shippedQuantity”:“”},{“quantityLeft”:“”}]]}
}}
}
}
PF 14的数据报文Order_Shipment_Data_Full的CGDM是,
{“Loop”:{
{“input”:{
{“A”:
[“Order_Shipment_Data_full.Input.A”,
{“key”:[“product.name”,“product.productionDate”]},
{“value”:{{“shippedQuantity”}}]
},
{“B”:
[“Order_Shipment_Data_full.Input.B”,
{“key”:[“product.name”,“product.productionDate”]},
{“value”:{{“order_product.quantity”}}]
},
{“C”:
[“Order_Shipment_Data_full.output.C”,
{“key”:[“product.name”,“product.productionDate”]},
{“value”:{{“order_product.quantity”},{“shippedQuantity”},{“quantityLeft”}}]
}
}},
{“output”:
{“result”:“Order_Shipment_Data_full.output.C”}
}
}
}
PF 14向PF16发送两个数据报文,
{“Order_data”:{
{“input”:{
{“A”:{“order_product.quantity”:“v1”}}
}},
{“output”:{
{“C”:{{“order_product.Quantity”:“”},{“shippedQuantity”:“”},{“quantityLeft”:“”}}}
}}
}
}
{“Order_Ship_data”:{
{“input”:{
{“A”:{“order_product.quantity”:“v1”}},
{“B”:{“shippedQuantity”:“v2”}}
}
{“output”:{
{“C”:{{“order_product.quantity”:“”},{“shippedQuantity”:“”},{“quantityLeft”:“”}}}
}}
}
}
Order_Ship_data的CGDM是,
{“Order_Ship_Data”:{
{“Equal.quantity”:{
{“input”:{
“X”:“A.order_product.quantity”
}},
{“output”:{
“Y”:“C.order_product.quantity”//Y=X
}}
}
},
{“Equal.quantityLeft”:{
{“input”:{
“X”:“A.order_product.quantity”
}},
{“output”:{
“Y”:“C.quantityLeft”
}}
}
}
{“Zero”:{
{“output”:{
“X”:“C.shippedQuantity”//X=0
}}
}
}
}}
Order_data的CGDM如下
{“Order_Data”:{
{“Equal.quantity”:{
{“input”:{
“X”:“A.order_product.quantity”
}},
{“output”:{
“Y”:“C.order_product.quantity”
}}
}
},
{“Equal.shippedQuantity”:{
{“input”:{
“X”:“B.shippedQuantity”
}},
{“output”:{
“Y”:“C.shippedQuantity”
}}
}
},
{“Minus”:{
{“input”:{
{“X”:“A.order_product.quantity”},
{“Y”:“B.shippedQuantity”}
}},
{“output”:{
“Z”:“C.quantityLeft”//Z=X-Y
}}
}
}
}}
数据报文Order_Shipment_Data的输出部分由CF实例106和CF实例108的输出部分形成。然后可以将其反向映射到输入的数据报文Order_Shipment_Data的工作名称空间,并发送给Order_Shipment_Data的发送器。
本发明的示例性实施例利用CGDM的标记和属性页单。尽管下面将针对线性级联来讨论该实施例,但是本发明不限于任何特定组织的数据。线性级联是从第一个元素开始除最后一个元素外的<select>元素的列表,一个<select>元素的选定值确定列表中下一个<select>的选项。
线性级联输入的一个实例是国家-州-市输入,其使得用户能够从国家的选项中选择国家,确定国家的选项,使用户能够从州的选项中选择州,然后确定城市的选项。在浏览器实施方式中,国家、州和城市均由<select>元素表示。国家的事件处理程序附加到国家<select>元素,州的事件处理程序附加到州<select>元素。例如,当选择例如“美国”的国家时,调用国家的事件处理程序,事件处理程序得到“美国”的值,并创建消息{Country=“USA”,State[]},并将消息发送到后端过程以获取“美国”的所有州并将值存储在State[]中。然后State[]的值被设置为表示州的<select>。州和市的事件处理程序相似。
在本发明的实施例中,级联由列表数据结构表示,其中列表的每个元素具有五个成员,即ID、Next、SelectedValue、eventHandler和Options。ID保存元素的名称,Next存储列表的下一个元素的名称的值,SelectedValue保存选定的值,EventHandler保存元素的事件处理函数,Options保留一组值。对列表的元素可进行的操作是从Options中选择一个值并设置SelectedValue。当完成操作时,通过将元素作为自变数传递来调用eventHandler中的函数。
该算法是抽象的,因为ID可以采用任何名称。它们可以是国家、州、市或公司、部门、员工姓名或类别、类型、产品名称。该算法是通用的,因为允许任何数量的元素。
接下来,列表结构被标记在HTML上。除ID和Next之外,<select>元素已包含所有其他成员。在我们对CGDM的定义中,每个值应当具有名称,所以在这个CGDM上只需要Next。我们假设value的名称是通过给HTML标签的所有元素添加一个ID属性来实现的。
级联的标记规则是为每个<select>元素添加Next属性,并且其值是级联中的下一个<select>的ID值。在一个HTML页面中可以有多个级联。
一般来说,标记规则被定义为以下规则:使用CGDM的语法规则来扩展CGDM的内容,使得对于算法的任何一个输入实例都有与之相对应的扩展内容,并且可以从扩展内容导出输入实例及其全部数据属性。标记规则与算法相关联。
PF函数是所有<select>元素(即使在不同的级联中)的选择事件的事件处理程序。在这个实例中,我们将PF命名为cascadePF。cascadePF的输入是和生成事件的选定的值和<select>元素。整个HTML的文档对象模型(DOM)结构也可以被cascadePF访问。PF的CGDM可以被认为是CGDM={{选定的<select>元素},DOM},输入部分是{{选定的<select>元素},{级联的所有<select>元素}},输出部分是{{选定的<select>元素的下一个元素}}。
因为即使在不同的HTML页面中,所有的级联都使用相同的cascadePF并且也可以使用相同的CGDM名称,所以cascadePF的VMSS库可以被配置为返回用于任何查找的VMSS。cascadePF的示例性CF函数是initRestElement(CurrentElementName name),对于当前元素(ID=name),将所有从下一个元素到结尾的选项重置,Results r=getValuesFromBackend(Condition condition,Results r,BackendProc p,CGDMNamepCGDMName),它打包CGDM并调用后端进程p并传递名称为pCGDMName的CGDM和setOptions(Results r),设置ID=r.name的<select>选项。CGDM的格式是,
{pCGDMName:{
{Input:{Condition:{name:value}}},{Output:{Results:{r:NULL}}
}
因为cascadePF可以用于所有<select>元素,所以当在不同的<select>元素上完成选择时,PF所接收的选定的<select>元素是不同的。所以直接的变量映射(VM)是不可行的。但是可以从Markup和CGDM中推演出CF的参数。我们称之为基于规则的变量映射(RBVM)。
在后端,我们可以有一个名为handleDBSelection的PF,它包含设置SQL select的实施方式。通常,可以通过运行SQL select来获取<select>的选项的值。我们将CGDM指定为cascadeOptionsCGDM,并且getValuesFromBackend被传递给handleDBSelection。
使用RBVM,PF的VMSS变成
{initRestElement:RBVM}
{getValuesFromBackend:{{condition:RBVM},{r:RBVM},{p:handleDBSelection},{pCGDMName:cascadeOptionsCGDM}}}
{setOptions:{{r:getValuesFromBackend.r}}
CF的调用函数是
initRestElementCaller(RBVM,CGDM,CFRESULT)
{
name=获取选定的<select>元素的ID值
initRestElement(name);
}
getValuesFromBackendCaller(RBVM,CGDM,CFRESULT)
{
(name,value)=获取ID的值和选定的<select>元素的选定值
名称=获取选定的<select>元素下一个元素的ID值
r=getValuesFromBackend(value,name,handleDBSelection,cascadeOptionsCGDM);
将r添加到CFResults。
}
setOptionsCaller(RBVM,CGDM,CFRESULT)
{
r=从CFResults获取getValuesFromBackend.r
setOptions(r);
}
RBVM的好处是代码的规则处理部分在添加新的级联或扩展级联的长度时不发生改变。所有级联可以使用相同的代码,因为我们选择的算法是抽象且通用的。
CFCaller的实施方式受到标记规则的影响。需要为标记规则开发新的CF的CFCaller。由于标记规则,CF可能有多于一个CFCaller。
所有的CF是纯粹的算法函数,并且它们实施纯粹的级联,它们不涉及被分配给级联的应用含义,其国家-州-郡或年级-班级-学生姓名。
通过使用CGDM的值的名称作为交叉参考,可以在具有相等或更多表达性语法规则的单独消息上完成标记。我们把单独的标记消息称为CGDM的属性页单(PS)。任何CGDM都可以具有附在后面的PS。因为在开发时,CGDM的名称实例(NI)是已知的,所以在开发时可以将PS附加到CGDM。
已经描述了本发明的示例性实施例,应当理解,本发明不限于所公开的实施例,并且旨在覆盖包括在本公开的精神的范围内的各种修改和等同的布置。
Claims (20)
1.基于组件的软件开发方法,所述方法包括:
将服务的输入/输出I / O转换成包括多个I / O键值对的相应计算目标数据报文CGDM;
配置程序的零件函数PF以接收所述计算目标数据报文CGDM作为输入参数;
生成变量匹配结构VMS序列VMSS;
所述变量匹配结构序列VMSS,包括一系列键对{{CF1,VMS1},...,{CFN,VMSN}};每对包括计算函数CF的名称CF1,CF2,…,CFN和各CF相对应的变量匹配结构VMS1,VMS2,…,VMSN;
所述VMS中的第一键对包括映射到所述CF的输入参数的第一键,以及映射到所述I/O键值对中的输入键值对的第二键;变量匹配结构VMS将CF的输入参数映射到计算目标数据报文CGDM内的输入参数;
其中,所述VMS中的第二键对包括映射到所述CF的输出参数的第一键,以及映射到所述I/O键值对中的输出键值对的第二键;变量匹配结构VMS将映射CF实例的输出参数以便输出计算目标数据报文CGDM内的输出参数;VMSS中的所有VMS完全填充计算目标数据报文CGDM的所有输出键值对;
并且利用所述VMSS配置所述PF以调用所述计算函数CF,
其中所述CF被配置为执行与服务有关的操作。
2.根据权利要求1所述的方法,还包括将所述VMSS存储在可通过所述数据报文的名称索引的数据存储器中。
3.根据权利要求1所述的方法,其中所述数据报文具有JavaScript对象表示JSON格式。
4.根据权利要求1所述的方法,所述利用所述VMSS配置所述PF以调用所述计算函数CF,具体包括:
S901:解析PF调用以识别给定的PF和作为参数传递给PF的CGDM;
S902:加载与所识别的PF相关联的VMSS,并识别所标识的CGDM内的输入键值对和输出键值对;
S903:解析加载的VMSS的下一行;
S904:确定解析的行是否包含CF标签;如果是,则进入S905;如果否就进入S906;
S905:识别CF以从CF标签调用;返回S903;
S906:将VMS的当前键对的第一键与所识别的CF的选择的I/O参数相匹配,并且将当前键对的第二键与CGDM的选择的I/O键相匹配;
S907:将调用格式化成所识别的CF,使得CF的选择的I/O参数被传递给选择的I/O键的值;
S908:对VMS的每个键对重复S906和S907;确定是否解析VMS的最后一个键对,以确定是否完成解析;
如果没有完成,则返回步骤S906,前进到VMS的下一个键对;
如果完成,则返回步骤S902,解析VMSS的下一行以在此前识别的CF标签下寻找新的CF标签或另一个VMS。
5.基于组件的软件开发方法,计算机程序包括零件函数PF,所述零件函数被配置为接收包括作为输入参数的多个输入/输出I/O键值对的计算目标数据报文CGDM,所述方法包括:
使用所述计算目标数据报文CGDM的名称检索包括多个元素的变量匹配结构序列VMSS,其中每个元素包括计算函数CF的名称和变量匹配结构VMS;
所述VMS中的第一键对包括映射到计算函数CF的输入参数的第一键,以及映射到所述I/O键值对中的输入键值对的第二键;变量匹配结构VMS将CF实例的输入参数映射到计算目标数据报文CGDM内的输入参数;
其中,所述VMS中的第二键对包括映射到所述CF的输出参数的第一键,以及映射到所述I/O键值对中的输出键值对的第二键;变量匹配结构VMS将映射CF实例的输出参数以便输出计算目标数据报文CGDM内的输出参数;VMSS中的所有VMS完全填充计算目标数据报文CGDM的所有输出键值对;
并且利用所述VMSS配置所述PF以调用所述计算函数CF,
其中所述CF被配置为执行与服务有关的操作。
6.根据权利要求5所述的方法,其中所述调用包括:
从所述数据报文确定输入数据;
将所述CF的参数从所述VMS映射到所述输入数据的数据部分;并且
根据所述映射利用所述数据部分调用所述CF。
7.根据权利要求5所述的方法,其中所述调用进一步使用存储在所述PF的内部数据结构中的数据,所述数据包括所述检索到的CF的先前调用的结果。
8.根据权利要求5所述的方法,其中所述数据报文具有JavaScript对象表示JSON格式。
9.根据权利要求5所述的方法,其中所述调用利用包括多个输入/输出I/O键值对的第二数据报文调用所述检索到的CF以回调第二PF。
10.根据权利要求5所述的方法,所述利用所述VMSS配置所述PF以调用所述计算函数CF,具体包括:
S901:解析PF调用以识别给定的PF和作为参数传递给PF的CGDM;
S902:加载与所识别的PF相关联的VMSS,并识别所标识的CGDM内的输入键值对和输出键值对;
S903:解析加载的VMSS的下一行;
S904:确定解析的行是否包含CF标签;如果是,则进入S905;如果否就进入S906;
S905:识别CF以从CF标签调用;返回S903;
S906:将VMS的当前键对的第一键与所识别的CF的选择的I/O参数相匹配,并且将当前键对的第二键与CGDM的选择的I/O键相匹配;
S907:将调用格式化成所识别的CF,使得CF的选择的I/O参数被传递给选择的I/O键的值;
S908:对VMS的每个键对重复S906和S907;确定是否解析VMS的最后一个键对,以确定是否完成解析;
如果没有完成,则返回步骤S906,前进到VMS的下一个键对;
如果完成,则返回步骤S902,解析VMSS的下一行以在此前识别的CF标签下寻找新的CF标签或另一个VMS。
11.基于组件的软件系统,计算机程序产品包括具有利用其实施的程序指令的计算机可读存储介质,所述程序指令可由计算机执行以执行包括以下步骤的方法:
将服务的输入/输出I / O转换成包括多个I / O键值对的相应计算目标数据报文CGDM;
配置程序的零件函数PF以接收所述计算目标数据报文CGDM作为输入参数;
生成变量匹配结构VMS序列VMSS;
所述变量匹配结构序列VMSS,包括一系列键对{{CF1,VMS1},...,{CFN,VMSN}};每对包括计算函数CF的名称CF1,CF2,…,CFN和各CF相对应的变量匹配结构VMS1,VMS2,…,VMSN;
所述VMSS包括VMS,所述VMS中的第一键对包括映射到所述CF的输入参数的第一键,以及映射到所述I/O键值对中的输入键值对的第二键;变量匹配结构VMS将CF实例的输入参数映射到计算目标数据报文CGDM内的输入参数;
其中,所述VMS第二键对包括映射到所述CF的输出参数的第一键,以及映射到所述I/O键值对中的输出键值对的第二键;变量匹配结构VMS将映射CF实例的输出参数以便输出计算目标数据报文CGDM内的输出参数;VMSS中的所有VMS完全填充计算目标数据报文CGDM的所有输出键值对;
并且利用所述VMSS配置所述PF以调用所述计算函数CF,
其中所述CF被配置为执行与服务有关的操作。
12.根据权利要求11所述的系统,还包括将所述VMSS存储在可通过所述数据报文的名称来索引的数据存储中。
13.根据权利要求11所述的系统,其中所述数据报文具有JavaScript对象表示JSON格式。
14.根据权利要求11所述的系统,所述利用所述VMSS配置所述PF以调用所述计算函数CF,具体包括:
S901:解析PF调用以识别给定的PF和作为参数传递给PF的CGDM;
S902:加载与所识别的PF相关联的VMSS,并识别所标识的CGDM内的输入键值对和输出键值对;
S903:解析加载的VMSS的下一行;
S904:确定解析的行是否包含CF标签;如果是,则进入S905;如果否就进入S906;
S905:识别CF以从CF标签调用;返回S903;
S906:将VMS的当前键对的第一键与所识别的CF的选择的I/O参数相匹配,并且将当前键对的第二键与CGDM的选择的I/O键相匹配;
S907:将调用格式化成所识别的CF,使得CF的选择的I/O参数被传递给选择的I/O键的值;
S908:对VMS的每个键对重复S906和S907;确定是否解析VMS的最后一个键对,以确定是否完成解析;
如果没有完成,则返回步骤S906,前进到VMS的下一个键对;
如果完成,则返回步骤S902,解析VMSS的下一行以在此前识别的CF标签下寻找新的CF标签或另一个VMS。
15.基于组件的软件系统,计算机程序包括零件函数PF,所述零件函数被配置为接收包括作为输入参数的多个输入/输出I/O键值对的计算目标数据报文CGDM,计算机程序产品包括具有利用其实施的程序指令的计算机可读存储介质,所述程序指令可由计算机执行以执行包括以下步骤的方法:
使用所述数据报文的名称检索包括多个元素的变量匹配结构序列VMSS,其中每个元素包括计算函数CF的名称和变量匹配结构VMS;
所述VMS中的第一键对包括映射到所述CF的输入参数的第一键,以及映射到所述I/O键值对中的输入键值对的第二键;变量匹配结构VMS将CF实例的输入参数映射到CGDM内的输入参数;
其中,所述VMS中的第二键对包括映射到所述CF的输出参数的第一键,以及映射到所述I/O键值对中的输出键值对的第二键;变量匹配结构VMS将映射CF实例的输出参数以便输出计算目标数据报文CGDM内的输出参数;VMSS中的所有VMS完全填充计算目标数据报文CGDM的所有输出键值对;
并且利用所述VMSS配置所述PF以调用所述计算函数CF,
其中所述CF被配置为执行与服务有关的操作。
16.根据权利要求15所述的系统,其中所述调用包括:
从所述数据报文确定输入数据;
将所述CF的参数从所述VMS映射到所述输入数据的数据部分;并且
根据所述映射利用所述数据部分调用所述CF。
17.根据权利要求15所述的系统,其中所述调用进一步使用存储在所述PF的内部数据结构中的数据,所述数据包括所述检索到的CF的先前调用的结果。
18.根据权利要求15所述的系统,其中所述数据报文具有JavaScript对象表示JSON格式。
19.根据权利要求15所述的系统,其中所述调用利用包括多个输入/输出I/O键值对的第二数据报文调用所述检索到的CF以回调第二PF。
20.根据权利要求15所述的系统,所述利用所述VMSS配置所述PF以调用所述计算函数CF,具体包括:
S901:解析PF调用以识别给定的PF和作为参数传递给PF的CGDM;
S902:加载与所识别的PF相关联的VMSS,并识别所标识的CGDM内的输入键值对和输出键值对;
S903:解析加载的VMSS的下一行;
S904:确定解析的行是否包含CF标签;如果是,则进入S905;如果否就进入S906;
S905:识别CF以从CF标签调用;返回S903;
S906:将VMS的当前键对的第一键与所识别的CF的选择的I/O参数相匹配,并且将当前键对的第二键与CGDM的选择的I/O键相匹配;
S907:将调用格式化成所识别的CF,使得CF的选择的I/O参数被传递给选择的I/O键的值;
S908:对VMS的每个键对重复S906和S907;确定是否解析VMS的最后一个键对,以确定是否完成解析;
如果没有完成,则返回步骤S906,前进到VMS的下一个键对;
如果完成,则返回步骤S902,解析VMSS的下一行以在此前识别的CF标签下寻找新的CF标签或另一个VMS。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201562193151P | 2015-07-16 | 2015-07-16 | |
US62/193,151 | 2015-07-16 | ||
PCT/US2016/042402 WO2017011718A1 (en) | 2015-07-16 | 2016-07-15 | Component-based software system and development method |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108139893A CN108139893A (zh) | 2018-06-08 |
CN108139893B true CN108139893B (zh) | 2021-08-06 |
Family
ID=57757721
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201680054204.0A Active CN108139893B (zh) | 2015-07-16 | 2016-07-15 | 基于组件的软件系统及开发方法 |
Country Status (9)
Country | Link |
---|---|
US (2) | US10599401B2 (zh) |
EP (1) | EP3323043A4 (zh) |
JP (2) | JP2018521438A (zh) |
KR (1) | KR102111152B1 (zh) |
CN (1) | CN108139893B (zh) |
AU (1) | AU2016293538B2 (zh) |
CA (1) | CA2997533C (zh) |
RU (2) | RU2702508C1 (zh) |
WO (1) | WO2017011718A1 (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
AU2016293538B2 (en) * | 2015-07-16 | 2020-03-12 | Yi YOUNG | Component-based software system and development method |
US10503497B2 (en) * | 2018-01-30 | 2019-12-10 | Microsoft Technology Licensing, Llc | Techniques for utilizing an expression language in service configuration files |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101593111A (zh) * | 2009-05-31 | 2009-12-02 | 大连新中连软件集团有限公司 | 一种业务组件及基于业务组件的应用软件开发方法和系统 |
CN103064787A (zh) * | 2012-12-21 | 2013-04-24 | 清华大学 | 一种基于扩展接口自动机模型的嵌入式组件建模与测试方法 |
US8667389B2 (en) * | 2003-12-22 | 2014-03-04 | Apple Inc. | Transforming a hierarchical data structure according to requirements specified in a transformation template |
Family Cites Families (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5471596A (en) * | 1992-04-13 | 1995-11-28 | Digital Equipment Corporation | Computer memory device holding a data structure for implementation of function objects |
US7614036B2 (en) * | 2001-03-22 | 2009-11-03 | Robert D Bjornson | Method and system for dataflow creation and execution |
US20060248504A1 (en) * | 2002-04-08 | 2006-11-02 | Hughes John M | Systems and methods for software development |
US7353501B2 (en) * | 2002-11-18 | 2008-04-01 | Microsoft Corporation | Generic wrapper scheme |
JP2005346408A (ja) * | 2004-06-03 | 2005-12-15 | Hitachi Ltd | ワークフローシステム間のwebサービス連携方法 |
US7278133B2 (en) * | 2004-07-23 | 2007-10-02 | Ntt Docomo, Inc. | Index-based parameter access and software for using the same |
US8745252B2 (en) * | 2005-09-21 | 2014-06-03 | Sap Ag | Headers protocol for use within a web services message processing runtime framework |
GB0521792D0 (en) * | 2005-10-26 | 2005-12-07 | Ibm | A method, apparatus and computer program for validating source code |
US20070234318A1 (en) * | 2006-04-04 | 2007-10-04 | International Business Machines Corporation | Method, system, and program product for generating source code for a function |
EP2071452A1 (en) * | 2007-12-07 | 2009-06-17 | Alcatel Lucent | Device and method for automatically building applications from specifications and from off-the-shelf components selected by semantic analysis |
US8145593B2 (en) * | 2008-12-11 | 2012-03-27 | Microsoft Corporation | Framework for web services exposing line of business applications |
US8429624B2 (en) * | 2010-08-17 | 2013-04-23 | Lsi Corporation | Application programming interface (API) router implementation and method |
US8739157B2 (en) * | 2010-08-26 | 2014-05-27 | Adobe Systems Incorporated | System and method for managing cloud deployment configuration of an application |
US8689235B2 (en) * | 2011-01-18 | 2014-04-01 | Gbc Industries | System and method for enabling interaction between a cloud application and a local application |
US8850199B2 (en) * | 2012-04-27 | 2014-09-30 | Certicom Corp. | Hashing prefix-free values in a signature scheme |
US20140196022A1 (en) * | 2013-01-08 | 2014-07-10 | Alexey Skutin | Cloud Based Application Packaging |
US9244857B2 (en) * | 2013-10-31 | 2016-01-26 | Oracle International Corporation | Systems and methods for implementing low-latency lookup circuits using multiple hash functions |
AU2016293538B2 (en) | 2015-07-16 | 2020-03-12 | Yi YOUNG | Component-based software system and development method |
-
2016
- 2016-07-15 AU AU2016293538A patent/AU2016293538B2/en active Active
- 2016-07-15 JP JP2018521484A patent/JP2018521438A/ja active Pending
- 2016-07-15 WO PCT/US2016/042402 patent/WO2017011718A1/en active Application Filing
- 2016-07-15 RU RU2018120190A patent/RU2702508C1/ru active
- 2016-07-15 CN CN201680054204.0A patent/CN108139893B/zh active Active
- 2016-07-15 RU RU2019130708A patent/RU2715803C2/ru active
- 2016-07-15 CA CA2997533A patent/CA2997533C/en active Active
- 2016-07-15 EP EP16825227.8A patent/EP3323043A4/en not_active Withdrawn
- 2016-07-15 KR KR1020187004507A patent/KR102111152B1/ko active IP Right Grant
-
2018
- 2018-01-15 US US15/871,254 patent/US10599401B2/en not_active Expired - Fee Related
-
2020
- 2020-03-19 US US16/823,780 patent/US11048481B2/en active Active
- 2020-10-13 JP JP2020172554A patent/JP2021009724A/ja active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8667389B2 (en) * | 2003-12-22 | 2014-03-04 | Apple Inc. | Transforming a hierarchical data structure according to requirements specified in a transformation template |
CN101593111A (zh) * | 2009-05-31 | 2009-12-02 | 大连新中连软件集团有限公司 | 一种业务组件及基于业务组件的应用软件开发方法和系统 |
CN103064787A (zh) * | 2012-12-21 | 2013-04-24 | 清华大学 | 一种基于扩展接口自动机模型的嵌入式组件建模与测试方法 |
Also Published As
Publication number | Publication date |
---|---|
US10599401B2 (en) | 2020-03-24 |
RU2702508C1 (ru) | 2019-10-08 |
RU2715803C2 (ru) | 2020-03-03 |
KR20180063043A (ko) | 2018-06-11 |
CA2997533C (en) | 2022-09-06 |
CA2997533A1 (en) | 2017-01-19 |
AU2016293538B2 (en) | 2020-03-12 |
AU2016293538A1 (en) | 2018-03-08 |
EP3323043A4 (en) | 2019-03-27 |
RU2019130708A3 (zh) | 2019-12-27 |
EP3323043A1 (en) | 2018-05-23 |
KR102111152B1 (ko) | 2020-06-09 |
WO2017011718A1 (en) | 2017-01-19 |
US11048481B2 (en) | 2021-06-29 |
JP2021009724A (ja) | 2021-01-28 |
US20200257505A1 (en) | 2020-08-13 |
JP2018521438A (ja) | 2018-08-02 |
RU2019130708A (ru) | 2019-10-10 |
CN108139893A (zh) | 2018-06-08 |
US20180150284A1 (en) | 2018-05-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10127250B2 (en) | Data transformation system, graphical mapping tool and method for creating a schema map | |
US11157560B2 (en) | System and method for managing graph data | |
US9201558B1 (en) | Data transformation system, graphical mapping tool, and method for creating a schema map | |
US11526656B2 (en) | Logical, recursive definition of data transformations | |
JP2020518069A (ja) | テンポラル−リレーショナルデータベースを有するリレーショナルデータベース管理システムにおけるクエリプランの生成および実行 | |
JP6720641B2 (ja) | 多言語データティアのデータ制約 | |
US20040036719A1 (en) | Quicker development of database applications having a graphical user interface | |
US20110173220A1 (en) | Generating web services from business intelligence queries | |
US20080183725A1 (en) | Metadata service employing common data model | |
US11163616B2 (en) | Systems and methods for enabling interoperation of independent software applications | |
US8918710B2 (en) | Reducing programming complexity in applications interfacing with parsers for data elements represented according to a markup language | |
US11893026B2 (en) | Advanced multiprovider optimization | |
WO2019015364A1 (zh) | 执行结构化查询语言sql指令的方法和装置 | |
CN108984541A (zh) | 一种基于对象数据模型的对象关系映射方法及装置 | |
US11561976B1 (en) | System and method for facilitating metadata identification and import | |
US20080295065A1 (en) | System and method for resolving interdependencies between heterogeneous artifacts in a software system | |
JP2021009724A (ja) | コンポーネントベースのソフトウェアシステムおよび開発方法 | |
US20170322988A1 (en) | Relational Conversion of Multiprovider Operations in a Calculation Scenario for Executing a Query | |
US11940951B2 (en) | Identification and import of metadata for extensions to database artefacts | |
US11036730B2 (en) | Business intelligence language type representing result structure | |
Nesteruk | Adapter | |
Heimler | Development of a Modular JavaScript Data Display Framework | |
Chanda et al. | ADO. NET Entity Data Model | |
Boyko et al. | Should we use Object Database Management Systems? |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20210706 Address after: Room 801, 8 / F, building a7-5, Hangu Jinggu, No. 7000, Jingshi Road, Jinan area, China (Shandong) pilot Free Trade Zone, Jinan City, Shandong Province, 250101 Applicant after: Shandong program meta Software Co.,Ltd. Address before: 138-10 Franklin Street, 12C apartment, flushing, NY Applicant before: Rong Yi |
|
TA01 | Transfer of patent application right | ||
GR01 | Patent grant | ||
GR01 | Patent grant |