本申请涉及计算机技术领域,特别涉及一种表单的创建方法、装置及计算机存储介质。
背景技术:
随着计算机技术的不断发展,表单的应用也越来越广泛。表单可以用于搜索用户输入的不同类型的数据。在一个表单中,通常可以包括多个表单组件。所述表单组件例如可以是输入(input)元素、复选框、单选按钮、提交按钮等。通过不同的表单组件,用户可以输入对应类型的数据,从而可以完成数据采集的过程。
目前,在创建表单时,通常是针对数据结构描述来设计表单的描述文件。然而,基于数据结构描述的描述文件中,一种数据类型会对应多种不同的用户界面,这样很难创建出符合用户预期的表单。
技术实现要素:
本申请实施方式的目的是提供一种表单的创建方法、装置及计算机存储介质,能够精准地创建表单。
为实现上述目的,本申请实施方式提供一种表单的创建方法,所述方法包括:获取目标表单的描述信息,所述目标表单中包括至少一个表单组件,所述描述信息中包括用于描述所述表单组件的对象;其中,所述对象中包括与描述的表单组件相关联的多个属性;解析所述对象中包含的所述属性的属性值,并按照解析出的所述属性值,创建所述目标表单。
为实现上述目的,本申请实施方式还提供一种计算机存储介质,其上存储有计算机程序,所述计算机程序被执行时,实现以下步骤:获取目标表单的描述信息,所述目标表单中包括至少一个表单组件,所述描述信息中包括用于描述所述表单组件的对象;其中,所述对象中包括与描述的表单组件相关联的多个属性;解析所述对象中包含的所述属性的属性值,并按照解析出的所述属性值,创建所述目标表单。
为实现上述目的,本申请实施方式还提供一种表单的创建装置,所述表单的创建装置中设置有上述的计算机存储介质。
由上可见,本申请提供的技术方案,可以根据想要创建的目标表单的具体界面来编写目标表单的描述信息。具体地,待创建的目标表单中可以包括至少一个表单组件,这样,在描述信息中,可以设置一个数组,该数组中的各个元素可以对应到目标表单中的各个表单组件。其中,数组的元素可以作为描述表单组件的对象。由于表单组件往往需要通过多种属性进行定义,因此,描述表单组件的对象中也可以包括与表单组件相关联的多个属性。这些属性例如可以限定表单组件的类型,还可以限定表单组件中的文字信息,还可以限定表单组件中的初始值。这样,在描述信息中按照不同的表单组件编写了对应的对象之后,前端渲染引擎可以获取该描述信息,并解析描述信息的对象中包含的各个属性的属性值,从而可以逐一在前端渲染出对应的各个表单组件,最终可以完成目标表单的创建过程。因此可见,本申请提供的技术方案,不是从数据结构类型来编写描述信息,而是从目标表单的具体界面来编写描述信息,从而使得最终创建的目标表单能够符合用户的预期,提高了表单创建的精度。
附图说明
为了更清楚地说明本申请实施方式或现有技术中的技术方案,下面将对实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施方式中表单创建系统的结构示意图;
图2为本申请实施方式中表单创建的方法流程图;
图3(a)为本申请实施方式中表单效果的第一展示图;
图3(b)为本申请实施方式中表单效果的第二展示图。
具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施方式中的附图,对本申请实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式仅仅是本申请一部分实施方式,而不是全部的实施方式。基于本申请中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施方式,都应当属于本申请保护的范围。
本申请提供一种表单的创建方法,所述方法可以应用于如图1所示的表单创建系统中。在图1中,该表单创建系统可以包含表单配置中心、后台服务器、数据库、前端渲染引擎等多个模块。其中,所述表单配置中心可供表单的编写人员编写待创建的表单的描述信息,编写后的描述信息可以存储于所述表单配置中心内。所述后台服务器中可以包括两个功能模块,其中一个是表单数据处理模块,该模块可以用于从上述的表单配置中心处获取编写完成的描述信息,并将获取的描述信息提供给所述前端渲染引擎。另一个功能模块是业务代码模块,该模块可获取用户在创建的表单中填写的数据,并将获取的数据传输至所述数据库。所述数据库可以用于存储用户在表单中填写的数据,并对数据进行更新。所述前端渲染引擎可以接收所述后台服务器的表单数据处理模块发来的描述信息,并根据所述描述信息渲染出表单中的各个组件,从而完成表单的创建过程。
本申请提供的表单的创建方法,其执行主体可以是图1中的前端渲染引擎,请参阅图2,所述方法可以包括以下步骤。
s1:获取目标表单的描述信息,所述目标表单中包括至少一个表单组件,所述描述信息中包括用于描述所述表单组件的对象;其中,所述对象中包括与描述的表单组件相关联的多个属性。
在本实施方式中,所述目标表单可以是待创建的表单,在创建所述目标表单之前,开发者可以预先构思出目标表单的具体界面,该具体界面中可以包括多个表单组件。例如,所述目标表单可以由文字输入框以及两个单选按钮构成,并且文字输入框的提示信息可以为“账号”,两个单选按钮的提示信息分别为“男”、“女”。这样,在确定了构成目标表单的各个表单组件之后,开发者可以在表单配置中心编写该目标表单的描述信息。在所述描述信息中,针对每个表单组件,可以编写对应的对象。各个表单组件各自对应的对象可以构成一个数组,该数组中的元素便可以是编写的对象。
在一个应用示例中,目标表单的描述信息可以是schema,该schema的具体形式可以为一个json((javascriptobjectnotation,js对象标记)格式的对象。需要说明的是,本申请中的schema与传统意义的schema并不相同。传统意义的schema是指数据库对象的集合,而在本申请中,schema指的是基于json编写的对目标表单的描述信息。在该示例中,所述schema可以包含fields属性,该属性可以是一个数组,数组中的各个元素,便可以是用于描述目标表单中表单组件的对象。
在本实施方式中,由于表单组件往往需要通过多个属性进行定义,因此在描述表单组件的对象中,也可以包括与描述的表单组件相关联的多个属性,这些属性可以从多方面对表单组件进行限定。具体地,在实际应用中,这些属性可以包括type、label、model、initialvalue、required、dependson、extra、rules、props等属性。其中,type属性可以用于限定表单组件的类型。所述表单组件的类型例如可以包括数组类型(formarr)、输入类型(input)、单选按钮类型(radiogroup)、上传图像类型(uploadimg)等。label属性可以限定表单组件的文字信息(标签)。例如,表单组件的文字信息可以是“性别”、“账号”、“商品名称”等用于提示用户辨识的信息。model属性可以确定所述label属性在数据库中对应的数据库字段。例如,“性别”对应的数据库字段可以是“sex”,“账号”对应的数据库字段可以是“account”。initialvalue属性可以限定表单组件的初始值。所述初始值不一定是一个具体的数值,也可以表示预先设置的一个字符串。例如,initialvalue可以限定类型为“radiogroup”的表单组件中单选按钮初始选择的性别为男性。required属性可以限定表单组件中的内容是否必须填写。dependson属性可以用于确定表单组件显示或者隐藏的条件。extra属性可以限定表单组件中除label属性限定的文字信息以外的额外提示信息。rules属性可以确定表单组件的渲染条件。props属性可以限定表单组件的其他特定属性。例如,props.disable可以限定表单组件是否弃用。当然,在实际应用中,描述表单组件的对象中可以包含更多或者更少的属性,本申请对此并不做限定。
在本实施方式中,当表单配置中心中的描述信息编写完成后,可以通过后台服务器的表单数据处理模块获取到编写完成的描述信息,并将该描述信息发送至前端渲染引擎。这样,前端渲染引擎便可以获取到所述目标表单的描述信息。
s3:解析所述对象中包含的所述属性的属性值,并按照解析出的所述属性值,创建所述目标表单。
在本实施方式中,前端渲染引擎可以逐个解析描述信息中的各个对象,从而可以确定各个对象中包含的属性,以及各个属性的属性值。然后,可以按照解析出的属性值依次渲染出各个表单组件,最终便可以完成目标表单的创建过程。
在一个实施方式中,尽管有些表单组件在描述信息中具备对应的对象,并且对象中也限定了该表单组件的一些属性,但由于部分特殊属性的存在,会使得表单组件需要根据实际情况选择正常显示还是隐藏。具体地,所述对象中可以包括用于限定表单组件的显示方式的属性,该属性例如可以是上述的dependson属性。该属性可以为表单组件的显示方式设置一些前提条件,只有设置的前提条件被满足时,表单组件才能正常显示,否则需要在目标表单中隐藏。在本实施方式中,该属性可以与至少一个其它属性相关联,被关联的其它属性便可以作为表单组件显示的前提条件。通过以下的一段伪代码来举例说明:
这段代码表明,目前该对象描述的表单组件的类型为输入框(input),该输入框的文字信息(label)为“账号”,该文字信息“账号”在数据库中的数据库字段为“account”,但是,该对象描述的表单组件存在一个显示的前提条件,就是只有在性别选择为男性(man)时,才显示该输入框。在该例子中,dependson属性可以与表征性别的属性相关联,该表征性别的属性便可以是上述的其它属性。
在本实施方式中,与所述用于限定表单组件的显示方式的属性相关联的其它属性可以具备标准属性值,所述标准属性值可以是所述其它属性在所述用于限定表单组件的显示方式的属性中注明的属性值。例如上述的伪代码例子中,表征性别的属性的标准属性值便可以是“man”。
在一个实施方式中,当对象中存在上述的dependson属性时,则需要根据其关联的其它属性的具体属性值,来判断该对象描述的表单组件是显示还是隐藏。在创建目标表单时,所述其它属性会具备初始值,如果该其它属性的初始值与dependson属性中限定的标准属性值一致时,那么该对象描述的表单组件便可以正常显示。但如果该其它属性的初始值与dependson属性中限定的标准属性值不一致时,那么在渲染过程中,可以隐藏该对象描述的表单组件,也就是说,在最终创建的目标表单中,不会显示该对象描述的表单组件。
此外,在本实施方式中,用户在与创建的目标表单进行交互时,往往会改变表单组件中的部分属性的属性值。因此,本实施方式中提供的方案,可以根据用户针对所述目标表单输入的操作数据,动态地对目标表单的显示方式进行调节。具体地,前端渲染引擎可以接收用户针对所述目标表单输入的操作数据,并根据所述操作数据,确定与dependson属性关联的所述其它属性当前的实际值。例如,用户根据自身实际情况在填写数据时,可以将目标表单中表征性别的属性调整为“女”,那么该表征性别的属性当前的实际值便为“女”。当然,用户在与目标表单进行交互时,可能也不会改变所述其它属性的属性值,因此,在确定所述其它属性当前的实际值时,可以判断所述操作数据是否指定了所述其它属性的属性值,若指定了,则可以将指定的数值作为所述其它属性当前的实际值。例如,用户将表征性别的属性调整为“女”,那么该表征性别的属性当前的实际值便为“女”。若所述操作数据未指定属性值,则可以将所述其它属性的初始属性值作为所述其它属性当前的实际值,也就是说,如果用户没有改变该其它属性的属性值,那么该其它属性可以沿用初始设定的属性值。这样,在确定了与dependson属性关联的其它属性当前的实际值之后,可以将所述其它属性当前的实际值与各自的所述标准属性值进行对比,并根据对比结果调整所述对象描述的表单组件在创建的所述目标表单中的显示方式。例如,当两者一致时,可以显示表单组件,而当两者不一致时,则可以隐藏该表单组件。
在一个实施方式中,所述用于限定表单组件的显示方式的属性的类型会决定表单组件最终的显示效果。在实际应用中,该属性的类型可能是对象类型,也可能是数组类型。并且,所述用于限定表单组件的显示方式的属性关联的其它属性的数量可能不止一个。例如,关联的其它属性可以包括表征性别的属性,还可以包括表征年龄的属性。
其中,针对对象类型,可以判断各个所述其它属性当前的实际值是否与各自的标准属性值一致,若均一致,则可以将所述对象描述的表单组件在所述目标表单中显示。这里的均一致,是指每个其它属性当前的实际值都与自身的标准属性值一致。例如,关联的所述其它属性有两个,其中一个是表征性别的属性,另一个是表征年龄的属性。那么只有在这两个属性当前的实际值均与各自的标准属性值一致时,才会显示该表单组件。若所述其它属性中存在当前的实际值与标准属性值不一致的属性,则在所述目标表单中隐藏所述对象描述的表单组件。也就是说,只要有一个其它属性当前的实际值与自身的标准属性值不一致,就隐藏所述表单组件。
此外,针对数组类型,可以判断各个所述其它属性当前的实际值是否与各自的标准属性值一致,若所述其它属性中存在当前的实际值与标准属性值一致的属性,则将所述对象描述的表单组件在所述目标表单中显示。也就是说,当类型为数组时,并不需要每个其它属性当前的实际值都与各自的标准属性值一致,而是只要存在一个当前的实际值与标准属性值一致的其它属性,就可以将所述表单组件正常显示。若各个所述其它属性当前的实际值均与各自的标准属性值不一致,则在所述目标表单中隐藏所述对象描述的表单组件。
这样,随着用于限定表单组件的显示方式的属性的类型的不同,最终表单组件的显示方式也可能存在不同。在实际应用中要根据属性的类型进行对应的判断。
在一个实施方式中,针对类型为数组的表单组件,还可以动态地增加或者减少数组表单中的表单组件。所述目标表单中存在与所述对象描述的表单组件处于同一数组的至少一个组内表单组件,并且所述对象描述的表单组件的显示方式,与所述至少一个组内表单组件的指定属性相关。具体地,所述对象中包括用于限定表单组件的显示方式的属性,该属性例如可以是上述的dependson属性。在该dependson属性中,可以关联组内表单组件的指定属性。例如,所述对象描述的表单组件为表示账号名称的表单组件,该表单组件与表示用户性别的表单组件处于同一个数组中,因此,表示用户性别的表单组件可以是表示账号名称的表单组件的组内表单组件。描述表示账号名称的表单组件的对象中,可以包括dependson属性,该dependson属性中关联的指定属性可以是表示用户性别的表单组件中的label属性。具体地伪代码可以如下所示:
其中,表示账号名称的表单组件中包含dependson属性,并且dependson属性中包含“__array__”属性,该“__array__”属性引出了表示账号名称的表单组件正常显示的前提条件,该前提条件为:组内表单组件中label属性(sex)的属性值为男性(man)。因此,该伪代码中,组件表单组件的指定属性为label属性。并且,在dependson属性中,为所述指定属性限定了标准属性值。只有当该指定属性符合标准属性值时,表示账号名称的表单组件才会显示。
需要说明的是,由于组内表单组件的数量可能不止一个,那么不同组内表单组件的指定属性也可能不同。例如,对于某个组内表单组件而言,其指定属性可以是label属性,但是对于另一个组内表单组件而言,其自定属性可以是initialvalue属性。
这样,在创建目标表单时,可以判断各个所述组内表单组件中指定属性当前的实际值是否与各自的标准属性值一致,若均一致,则将所述对象描述的表单组件在所述目标表单中显示;若各个所述组内表单组件的指定属性中存在当前的实际值与标准属性值不一致的属性,则在所述目标表单中隐藏所述对象描述的表单组件。也就是说,只有当“__array__”属性引出的各个前提条件均被满足时,所述对象描述的表单组件才能正常显示,只要有一个前提条件不满足,该表单组件便会被隐藏。
在一个实际的表单中,需要采集男性玩家的账号名称,那么当用户选择的性别为女性时,创建的表单可以如图3(a)所示,在图3(a)中,并没有显示采集账号名称的输入框。但如果用户选择的性别为男性时,创建的表单可以如图3(b)所示,在图3(b)中,采集账号名称的输入框显示在性别选择的下方。在该示例中,表示账号名称的表单组件,可以与表示性别的表单组件处于同一个数组中,并且表示账号名称的表单组件的dependson属性中,通过“__array__”属性引出了表单组件正常显示的前提条件为:性别为男性。
在一个实施方式中,还能够支持动态弃用表单组件的场景。例如,在某些场景下,表单中原本显示了选择性别的表单组件以及显示了用于采集用户详细资料的表单组件。但是,采集用户详细资料的表单组件只有在选择的性别为女性时才会被激活,如果没有选择性别或者选择的性别为男性,采集用户详细资料的表单组件便无法录入用户的数据。在这种情况下,可以通过限定表单组件是否被弃用的属性来实现。该属性例如可以是prop.disable属性,该属性可以预先设定指定属性值,该指定属性值根据不同场景可以灵活设置。例如在上述的场景中,该指定属性值可以设置为表征“男性”或者“无选择”的属性值。那么当所述用于限定表单组件是否被弃用的属性当前的属性值为该指定属性值时,可以将所述对象描述的表单组件弃用,弃用的表单组件尽管可以显示于目标表单中,但无法与用户进行交互,从而无法接收用户输入的操作数据。
在一个实施方式中,除了预先设定的一部分表单组件,还可以在所述目标表单的描述信息中添加用于描述自定义表单组件的对象。在添加自定义表单组件的对象时,为了使得添加的对象后续能够被正常识别,需要按照描述信息的编写规则,设定所述用于描述自定义表单组件的对象的调用接口以及触发条件。其中,所述调用接口可以是受控属性value或其它与valuepropname的值同名的属性,所述触发条件可以是onchange事件或与trigger的值同名的事件。用户通过描述信息中指定的扩展指令,可以将添加的自定义的表单组件的对象添加至描述信息中。并且在扩展后,前端渲染引擎可以根据描述信息中自定义表单组件的type属性来动态渲染该自定义表单组件。
本申请还提供一种计算机存储介质,其上存储有计算机程序,所述计算机程序被执行时,实现以下步骤:
s1:获取目标表单的描述信息,所述目标表单中包括至少一个表单组件,所述描述信息中包括用于描述所述表单组件的对象;其中,所述对象中包括与描述的表单组件相关联的多个属性。
s3:解析所述对象中包含的所述属性的属性值,并按照解析出的所述属性值,创建所述目标表单。
在一个实施方式中,所述对象中包括用于限定表单组件的显示方式的属性,所述用于限定表单组件的显示方式的属性与至少一个其它属性相关联;其中,所述其它属性具备标准属性值,所述显示方式包括显示表单组件或者隐藏表单组件;相应地,所述计算机程序被执行时,还实现以下步骤:
接收用户针对所述目标表单输入的操作数据,并根据所述操作数据,确定所述其它属性当前的实际值;
将所述其它属性当前的实际值与各自的所述标准属性值进行对比,并根据对比结果调整所述对象描述的表单组件在创建的所述目标表单中的显示方式。
在一个实施方式中,所述计算机程序被执行时,还实现以下步骤:
若所述用于限定表单组件的显示方式的属性的类型为对象,判断各个所述其它属性当前的实际值是否与各自的标准属性值一致,若均一致,将所述对象描述的表单组件在所述目标表单中显示;若所述其它属性中存在当前的实际值与标准属性值不一致的属性,在所述目标表单中隐藏所述对象描述的表单组件;
若所述用于限定表单组件的显示方式的属性的类型为数组,判断各个所述其它属性当前的实际值是否与各自的标准属性值一致,若所述其它属性中存在当前的实际值与标准属性值一致的属性,将所述对象描述的表单组件在所述目标表单中显示;若各个所述其它属性当前的实际值均与各自的标准属性值不一致,在所述目标表单中隐藏所述对象描述的表单组件。
在本申请中,所述计算机存储介质可以包括用于存储信息的物理装置,通常是将信息数字化后再以利用电、磁或者光学等方法的媒体加以存储。本实施方式所述的计算机存储介质又可以包括:利用电能方式存储信息的装置,如ram、rom等;利用磁能方式存储信息的装置,如硬盘、软盘、磁带、磁芯存储器、磁泡存储器、u盘;利用光学方式存储信息的装置,如cd或dvd。当然,还有其他方式的存储器,例如量子存储器、石墨烯存储器等等。
本申请还提供一种表单的创建装置,所述表单的创建装置中设置有上述的计算机存储介质。
本说明书实施方式提供的计算机存储介质以及表单的创建装置,其实现的具体功能,可以与本说明书中的前述实施方式相对照解释,并能够达到前述实施方式的技术效果,这里便不再赘述。
由上可见,本申请提供的技术方案,可以根据想要创建的目标表单的具体界面来编写目标表单的描述信息。具体地,待创建的目标表单中可以包括至少一个表单组件,这样,在描述信息中,可以设置一个数组,该数组中的各个元素可以对应到目标表单中的各个表单组件。其中,数组的元素可以作为描述表单组件的对象。由于表单组件往往需要通过多种属性进行定义,因此,描述表单组件的对象中也可以包括与表单组件相关联的多个属性。这些属性例如可以限定表单组件的类型,还可以限定表单组件中的文字信息,还可以限定表单组件中的初始值。这样,在描述信息中按照不同的表单组件编写了对应的对象之后,前端渲染引擎可以获取该描述信息,并解析描述信息的对象中包含的各个属性的属性值,从而可以逐一在前端渲染出对应的各个表单组件,最终可以完成目标表单的创建过程。因此可见,本申请提供的技术方案,不是从数据结构类型来编写描述信息,而是从目标表单的具体界面来编写描述信息,从而使得最终创建的目标表单能够符合用户的预期,提高了表单创建的精度。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmablelogicdevice,pld)(例如现场可编程门阵列(fieldprogrammablegatearray,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logiccompiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardwaredescriptionlanguage,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)与verilog2。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
本领域技术人员也知道,除了以纯计算机可读程序代码方式实现前端渲染引擎以外,完全可以通过将方法步骤进行逻辑编程来使得前端渲染引擎以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种前端渲染引擎可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施方式或者实施方式的某些部分所述的方法。
本说明书中的各个实施方式均采用递进的方式描述,各个实施方式之间相同相似的部分互相参见即可,每个实施方式重点说明的都是与其他实施方式的不同之处。尤其,针对计算机存储介质和装置的实施方式来说,均可以参照前述方法的实施方式的介绍对照解释。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
虽然通过实施方式描绘了本申请,本领域普通技术人员知道,本申请有许多变形和变化而不脱离本申请的精神,希望所附的权利要求包括这些变形和变化而不脱离本申请的精神。