用于加载程序模块的方法和系统的制作方法

文档序号:7681440阅读:251来源:国知局
专利名称:用于加载程序模块的方法和系统的制作方法
技术领域
应用程序处理领域。更具体地,本发明尤其涉及对应用程序中具有层级关系的程序模块进行加载的方法及系统。
背景技术
随着计算机应用程序的规模、代码量日益庞大以及程序模块化程度的不断提升,越来越多的程序开发人员通过引用已有的通用代码(例如通用库文件Common Library)来避免重复性的编程工作。这些具有复用性的代码可能包括程序类Class以及其它代码包, 它们是构成一个应用程序的组件或模块。一个大型应用程序可能由多个这样的程序模块构成,并且这些程序模块间往往存在者层级关系(也可理解为父子关系或调用的依赖关系)。目前很多应用程序在开发、测试或运行时,需要通过网络传输/调用/加载这些可复用的存在层级关系的众多程序组件或模块。目前存在以下几种通过网络传输程序模块的技术方案。第一种是加载整个库文件(Library)。由于库文件通常体积庞大,而真正需要调用其实只是库文件中的部分模块,因此加载整个库文件会导致不必要的内容传输,延长了加载的时间。第二种现有技术中的技术方案是仅加载所需要的代码单元。例如,客户端的微件Widget A需要某个库文件中的100个代码包,而客户端的微件Widget B需要该库文件中的50个代码包(其中有一些代码包和Widget A需要的代码包相同),虽然在传输的过程中Widget A和B均可以只请求服务器端传输其所需的代码包,并且也可以避免传输相同的代码包,可以避免不必要的及重复的代码内容传输,但是由于Widget A和B需要对其所需的每个代码包向服务器发出一个请求(request),导致网络请求的数量剧增,同样会大大延长加载的时间。第三种现有技术中的技术方案是由程序开发人员事先将客户端不同的应用(例如Widget)所需要的代码包进行打包,然后在每个Widget调用时直接将打包好的程序包发送至客户端。这种技术方案的好处是可以避免加载整个库文件,也可以避免过多的网络请求,但缺点是可能有大量的重复的代码包被发送至客户端,因为客户端的Widget A所需要的代码包与Widget B所需要的代码包存在重复,在松稱合(Loose-Coupling)程序开发的情形下(松耦合是指某一应用程序存在多个开发人员,例如Widget A的开发人员和WidgetB的开发人员彼此不知晓对方所开发的Widget里面是否需要调用相同的代码包),不同的程序开发者无法事先知晓哪些代码包是重复的。

发明内容
考虑到上述存在的问题,本发明的目的之一在于提供一种能够在松耦合的情况下加载具有层级关系的程序模块的方法或系统。本发明的又一目的在于提供一种能够在松耦合的情况下加载具有层级关系的程序模块,并且能够避免重复代码传输。本发明的又一目的在于提供一种能够在松耦合的情况下加载具有层级关系的程序模块,并且能够避免不必要的代码传输。本发明的又一目的在于提供一种能够在松耦合的情况下加载具有层级关系的程序模块,并且能够避免大量的或复杂的网络请求。上述四个子目的彼此独立,本发明的发明目的并非要同时达到上述四个子目的,而是可能仅实现目的之一或任意数量的组合。根据本发明的一个方面,提供了一种用于加载具有层级关系的程序模块的方法,包括接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息;根据所述请求中的根模块信息,获取所述待加载根模块以及所述待加载根模块的子模块;以及将所述根模块以及所述根模块的子模块发送至所述客户端。根据本发明的一个实施例,上述方法还包括接收来自客户端的关于已加载的程序模块的通知,所述通知中包含已加载的程序模块中的根模块信息;以及根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息。根据本发明的另一方面,提供了一种用于加载具有层级关系的程序模块的系统,包括请求接收装置,被配置为接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息;第一获取装置,被配置为根据所述请求中的根模块信息,获 取所述待加载根模块以及所述待加载根模块的子模块;以及加载装置,被配置为将所述根模块以及所述根模块的子模块发送至所述客户端。根据本发明的一个实施例,上述系统还包括通知接收装置,被配置为接收来自客户端的关于已加载的程序模块的通知,所述通知中包含已加载的程序模块中的根模块信息;以及第二获取装置,被配置为根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息。通过本发明的方法和系统,可以在松耦合的情况下加载具有层级关系的程序模块,并且能够避免重复代码传输和/或避免不必要的代码传输和/或避免大量的网络请求。


通过对结合附图所示出的实施方式进行详细说明,本发明的上述以及其他特征将更加明显,本发明附图中相同的标号表示相同或相似的部件。在附图中,图I示出了适于用来实现本发明实施方式的示例性计算系统100的框图;图2示出了根据本发明一实施例的用于加载具有层级关系的程序模块的方法的流程图;图3A示出了根据本发明又一实施例的用于加载具有层级关系的程序模块的方法的流程图;图3B示出了根据本发明一个具体实施例的通过客户端请求加载程序模块的层级关系图;图4示出了根据本发明一实施例的用于加载具有层级关系的程序模块的系统的框图;图5示出了根据本发明一实施例的用于加载具有层级关系的程序模块的系统的框图。
具体实施例方式在下文中,将参考附图通过实施方式对本发明提供的用于加载具有层级关系的程序模块的方法和系统进行详细描述。图I示出了适于用来实现本发明实施方式的示例性计算系统100的框图。如所示,计算机系统100可以包括CPU(中央处理单元)101、RAM(随机存取存储器)102、R0M(只读存储器)103、系统总线104、硬盘控制器105、键盘控制器106、串行接口控制器107、并行接口控制器108、显示控制器109、硬盘110、键盘111、串行外部设备112、并行外部设备113和显示器114。在这些设备中,与系统总线104耦合的有CPU 10URAM 102, ROM 103、硬盘控制器105、键盘控制器106、串行控制器107、并行控制器108和显示控制器109。硬盘110与硬盘控制器105耦合,键盘111与键盘控制器106耦合,串行外部设备112与串行接口控制器107耦合,并行外部设备113与并行接口控制器108耦合,以及显示器114与显示控制器109耦合。应当理解,图I所述的结构框图仅仅为了示例的目的而示出的,而不是对本发明范围的限制。在某些情况下,可以根据具体情况而增加或者减少某些设备。
图2示出了根据本发明一实施例的用于加载具有层级关系的程序模块的方法的流程图。图2所示的方法从步骤201开始,在步骤201中,接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息。这里所指的客户端是一个相对于服务器端的概念,可以是客户端代理、浏览器、微件Widget、程序开发人员在开发、测试过程中请求加载程序模块的计算机等,并非一定是终端用户。总之,任何发出加载程序模块请求的应用、插件、计算机等软、硬件均可被理解为这里所指的客户端。根据本发明的一个实施例,加载程序模块的请求中仅包含待加载程序模块中的根模块信息。根据本发明的又一实施例,加载程序模块的请求中包含待加载程序模块中的根模块信息以及部分或全部该根模块的子模块信息。如果加载程序模块的请求中仅包含待加载程序模块中的根模块信息,可以根据根模块信息和程序模块间的层级关系信息来获取该根模块的所有子模块。如果加载程序模块的请求中包含待加载程序模块中的根模块信息以及部分或全部该根模块的子模块信息,虽然存在部分重复分析的过程,但是仍然能够确保获取该根模块的所有子模块。当然,客户端是无法获取尚未加载的程序模块间的层级关系的,因此客户端在发送请求时,如果待加载的程序模块尚未被加载至客户端,客户端并不知晓这些待加载的程序模块中哪些是根模块,哪些是子模块,因此其请求中可能仅包含根模块,也可能既包含根模块又包含子模块。但是无论如何,根模块是一定会包含在请求中的(因为如果一个模块是客户端需要加载的并且尚未被加载,并且没有其它需要加载的模块依赖于该模块,那么这个模块是根模块,并且一定会包含在客户端发送的请求中)。需要指出的是,具有层级关系的程序模块间存在调用与被调用,或者依赖与被依赖的关系。因此,在本发明中,将仅依赖于其它程序模块而不被其它程序模块所依赖的程序模块称为根模块(最顶级的模块),将根模块所依赖的程序模块称为子模块。根模块与子模块的关系可以简单地理解为在树形图中的根节点与子节点的关系。还需要指出的是,来自客户端的一个加载程序模块的请求中可能包含加载一个或多个根模块的信息,例如客户端请求加载两个程序模块,这两个程序模块间彼此不具有层级关系,且对于这个客户端而言,没有任何其它需要加载的程序模块(需要加载的程序模块不包含已经被加载过的程序模块)依赖于这两个模块,那么这两个程序模块均为根模块。根据本发明的一个实施例,本发明中的程序模块为可复用的代码包、代码单元、代码组件、程序类Class中的一个或多个。本领域技术人员应当理解,程序模块的概念强调的是构成程序的单元、部分,其在不同的编程环境下可能体现为不同的形式。根据本发明的一个实施例,本发明中的具有层级关系的程序模块为未经编译的源代码模块。根据本发明的又一实施例,本发明中的具有层级关系的程序模块为经过编译的目标代码(二进制代码)模块。本领域技术人员应当理解,无论程序模块是源代码还是目标代码,只要它们彼此之间存在着层级关系信息就可以应用于本发明。接下来,图2所示的方6进行至步骤202,在步骤202中,根据所述请求中的根模块信息,获取所述待加载根模块以及所述待加载根模块的子模块。之所以能够根据请求中的根模块信息来获取待加载根模块及其子模块,是因为程序模块间的层级关系信息已经被获取。根据本发明的一个实施例,通过依次分析每个程序模块,获取所有程序模块间的层级关系信息。根据本发明的另一实施例,响应于所述来自客户端的加载程序模块的请求,获取待加载的程序模块间的层级关系信息。根据本发明的再一实施例,通过程序开发人员的输入来获取待加载的程序模块间的层级关系信息。利用已经取得的程序模块间的层级关系信息以及程序模块加载请求中的根模块信息,可以分析出待加载的根模块的一级子模块,以及一级子模块的子模块,以此类推,从而确定所有待加载的具有层级关系的程序模块信息,并 进而获取待加载的具有层级关系的程序模块。本领域技术人员应当了解,层级关系信息可以通过多种方式获取,上文中给出的三种实施例仅仅是示例性说明的目的,并不构成对具体实施方式
的任何限制。接下来在步骤206中,将所述根模块以及所述根模块的子模块发送至所述客户端。这样,客户端就可以实现对所有待加载程序模块的加载。根据本发明的一个实施例,步骤201中的请求接收以及步骤206中的模块发送均是通过以太网或其它网络进行的。通过图2所示的方法,区别于现有技术方案,客户端在发送加载程序模块的请求时可以仅告知待加载程序模块的根模块信息,而通过仅发送一次加载请求(并且加载请求非常简单,仅包含根模块信息)就完成对所有待加载模块的加载(并且仅加载了客户端必需的程序模块),从而实现了本发明避免传输不必要的代码内容以及避免复杂的网络请求的目的。图3A示出了根据本发明又一实施例的用于加载具有层级关系的程序模块的方法的流程图。图3A所示的方法中的步骤301和302分别对应于图2所示的方法中的步骤201和202,在此不再赘述。在步骤303中,接收来自客户端的关于已加载的程序模块的通知,所述通知中包含已加载的程序模块中的根模块信息。由于在之前的加载过程中(例如客户端的另一个请求加载程序模块的微件Widget或其它插件),有一些程序模块可能已经加载到客户端,为了避免重复加载相同的程序模块,优选地,客户端会通知当前待加载的程序模块中已经加载过的程序模块信息。根据本发明的一个实施例,关于已加载的程序模块的通知中仅包含已加载的程序模块中的根模块信息。这是因为,虽然可能有很多程序模块已经被加载,出于简化网络请求(通知本质上也可归为网络请求的一种)的目的,由于已加载的程序模块间也是具有层级关系的,因此客户端已经建立了已加载的程序模块之间的层级关系,并且仅通知已加载的程序模块中的根模块。根据本发明的一个实施例,客户端在本地维护已加载的程序模块间的层级关系(例如通过构造并维护一个本地全局变量的方式)。
接下来,在步骤304中,根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息。步骤304类似于步骤202,在此不再赘述。步骤304与步骤202的不同之处在于步骤202中需要实际获取待加载的根模块及其子模块,而步骤304中只需要获取已加载的根模块及其子模块的信息即可,无需实际获取已加载的根模块及其子模块。在步骤305中,从所获取的根模块以及所述根模块的子模块中删除已加载的根模块及其所有子模块。为了避免将已加载的程序模块再次加载,把这些已加载的程序模块从待加载的程序模块中删除。接下来,在步骤306中,将被删除已加载的根模块及其所有子模块后的剩余程序模块发送至所述客户端。步骤306可以理解为对应于图2中的步骤206,其实质均在于将最终确定的需要通过网络传输至客户端的待加载模块发送至客户端。需要指出的是,尽管在图3以及上文的文字描述中对步骤301-306的顺序有所设定,但是步骤301-306的执行顺序或步骤间的关系在不脱离本发明构思的前提下可能存在 多种变化。根据本发明的一个实施例,在步骤301接收到的加载程序模块的请求中除了待加载的程序模块的根模块信息外,还包含关于已加载的程序模块的通知。也就是说,步骤303中的通知和步骤301中的请求可以同时由客户端发出。根据本发明的一个实施例,可以先执行步骤304,根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息。然后执行步骤302,根据所述请求中的根模块信息,获取所述待加载根模块以及所述待加载根模块的子模块。由于在执行步骤302之前,已经知晓哪些程序模块已经被加载,因此在执行步骤302时,就可以仅获取待加载程序模块中的未被加载过的程序模块,也就是说,无需先获取全部的待加载程序模块再从中删除已加载的程序模块,而是在分析层级关系信息阶段就确定了需要最终传输的待加载程序模块。这样的话,步骤305也无需再次执行。总之,图2及图3中的步骤间的顺序仅仅是示例性的说明,而不构成对本发明的限制。通过图3A所示的方法,区别于现有技术方案,客户端在发送加载程序模块的请求时可以仅告知待加载程序模块的根模块信息,并且通知哪些程序模块已经被加载(通知时仅通知已加载程序模块的根模块),仅发送一次加载请求和通知(并且加载请求非常简单,仅包含根模块信息)就完成对所有待加载模块的加载(并且仅加载了客户端必需的并且尚未被加载过的程序模块),从而实现了本发明避免传输不必要的代码内容、避免传输重复的代码内容以及避免复杂的网络请求的目的,大大节省了网络带宽及加载多个程序模块时的延时。图2及图3A所示的方法还有一个技术效果在HTTP请求下尤其明显。为了满足HTTP请求的Catch特性,必须使用HTTP请求中的Get请求(Get请求中仅包含URL地址),而不能使用HPPT请求中的Post请求(Post请求中包含很多参数信息,不能满足Catch特性)。然而,通常在客户端请求加载大量程序模块时,无法通过Get请求(具体的URL地址)将所需的所有程序模块加载。本发明的好处就在于请求中仅包含根模块,而不包含其它模块的信息,可以利用Get请求来发送加载程序模块的请求,从而可以满足Catch特性。关于Catch特性的具体内容属于本领域的公知常识,在此不再赘述。下面结合图2及图3A所示的方法,通过一个简单的例子对本发明提供的用于加载具有层级关系的程序模块的方法进行描述。图3B示出了程序模块间的层级关系图。假设客户端浏览器中具有两个微件,分别是Widget A和Widget B。开始阶段,客户端没有任何已加载的程序模块。现在Widget A请求加载类Class A (Class A为程序模块),并且ClassA包含子类(子模块)AO和B0,并且AO进一步包含子类Al,BO进一步包含子类BI。那么Widget A仅向服务器端发出请求加载Class A(根模块)的请求。当服务器端接收到这条请求后,利用程序模块间的层级关系信息以及请求中的根模块信息,获取了 Class A以及它的全部四个子类A0、Al、B0、BI,并将这五个类打包后发送至客户端,从而完成了 Widget A的加载请求。接下来,假设同一客户端的另一微件Widget B请求加载类Class B,而Class B包含子类(子模块)BO和CO,并且类BO包含子类BI,那么Widget B向服务器端发送加载Class B的请求(请求中仅包含根类Class B),并且通知服务器端类Class BO已经被加载(通知中仅包含根类Class B0)。服务器在收到Widget B发送的请求和通知后,即确定Widget B要加载的类为Class B、B0、BI、CO,而Class BO和BI已经被加载,因此服务器端仅获取Class B和Class CO,并将这两个程序类打包后发送至客户端,从而完成Widget B的加载程序模块的请求。
图4示出了根据本发明一实施例的用于加载具有层级关系的程序模块的系统的框图。图4所示的系统在整体上由系统400表示。具体地,系统400包括请求接收装置401,被配置为接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息;第一获取装置402,被配置为根据所述请求中的根模块信息,获取所述待加载根模块以及所述待加载根模块的子模块;以及加载装置406,被配置为将所述根模块以及所述根模块的子模块发送至所述客户端。本领域技术人员应当理解,系统400中的装置401、402和406分别对应于图2所示的方法中的步骤201、202和206,在此不再赘述。图5示出了根据本发明一实施例的用于加载具有层级关系的程序模块的系统的框图。图5所示的系统在整体上由系统500表示。具体地,系统500包括请求接收装置501,被配置为接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息;第一获取装置502,被配置为根据所述请求中的根模块信息,获取所述待加载根模块以及所述待加载根模块的子模块;通知接收装置503,被配置为接收来自客户端的关于已加载的程序模块的通知,所述通知中包含已加载的程序模块中的根模块信息;第二获取装置504,被配置为根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息;删除装置505,被配置为从所获取的根模块以及所述根模块的子模块中删除已加载的根模块及其所有子模块;以及加载装置506,被配置为将所述根模块以及所述根模块的子模块发送至所述客户端。本领域技术人员应当理解,系统500中的装置501-506分别对应于图3所示的方法中的步骤301-306,在此不再赘述。附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。虽然以上结合具体实例,对本发明的利用远程应用处理本地文件的系统及方法进行了详细描述,但本发明并不限于此。本领域普通技术人员能够在说明书教导之下对本发 明进行多种变换、替换和修改而不偏离本发明的精神和范围。应该理解,所有这样的变化、替换、修改仍然落入本发明的保护范围之内。本发明的保护范围由所附权利要求来限定。
权利要求
1.一种用于加载具有层级关系的程序模块的方法,包括 接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息; 根据所述请求中的根模块信息,获取待加载的根模块以及所述待加载的根模块的子模块;以及 将所述根模块以及所述根模块的子模块发送至所述客户端。
2.如权利要求I所述的方法,还包括 删除所获取的根模块以及根模块的子模块中已加载的根模块及其所有子模块;并且, 其中将所述根模块以及所述根模块的子模块发送至所述客户端包括 将删除已加载的根模块及其所有子模块后的剩余程序模块发送至所述客户端。
3.如权利要求2所述的方法,还包括 接收来自客户端的关于已加载的程序模块的通知,所述通知中包含已加载的程序模块中的根模块信息;以及 根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息。
4.如权利要求3所述的方法,其中 根据所述请求中的根模块信息,获取待加载的根模块以及所述待加载根模块的子模块包括 根据所述请求中的根模块信息以及程序模块间的层级关系,获取所述待加载的根模块以及所述待加载根模块的所有子模块;并且,其中 根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息包括 根据所述通知中的根模块信息以及程序模块间的层级关系,获取所述已加载的根模块以及所述已加载的根模块的所有子模块信息。
5.如权利要求1-4任一所述的方法,还包括 通过依次分析每个程序模块,获取所有程序模块间的层级关系信息。
6.如权利要求1-4任一所述的方法,还包括 响应于所述来自客户端的加载程序模块的请求,获取待加载的程序模块间的层级关系信息。
7.如权利要求I所述的方法,其中程序模块为程序类Class,并且所述具有层级关系的程序模块间是松耦合的。
8.如权利要求1-7任一所述的方法,其中所述请求中仅包含待加载程序模块中的根模块信息,并且所述通知中仅包含已加载的程序模块中的根模块信息。
9.一种用于加载具有层级关系的程序模块的系统,包括 请求接收装置,被配置为接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息; 第一获取装置,被配置为根据所述请求中的根模块信息,获取待加载的根模块以及所述待加载根模块的子模块;以及 加载装置,被配置为将所述根模块以及所述根模块的子模块发送至所述客户端。
10.如权利要求9所述的系统,还包括 删除装置,被配置为删除所获取的根模块以及所述根模块的子模块中的已加载的根模块及其所有子模块;并且, 其中加载装置被进一步配置为 将删除已加载的根模块及其所有子模块后的剩余程序模块发送至所述客户端。
11.如权利要求10所述的系统,还包括 通知接收装置,被配置为接收来自客户端的关于已加载的程序模块的通知,所述通知中包含已加载的程序模块中的根模块信息;以及 第二获取装置,被配置为根据所述通知中的根模块信息,获取已加载的根模块以及所述已加载的根模块的子模块信息。
12.如权利要求11所述的系统,其中 第一获取装置被进一步配置为 根据所述请求中的根模块信息以及程序模块间的层级关系,获取待加载的根模块以及所述待加载根模块的所有子模块;并且,其中 第二获取装置被进一步配置为 根据所述通知中的根模块信息以及程序模块间的层级关系,获取所述已加载的根模块以及所述已加载的根模块的所有子模块信息。
13.如权利要求9-12任一所述的系统,还包括 第三获取装置,被配置为通过依次分析每个程序模块,获取所有程序模块间的层级关系信息。
14.如权利要求9-12任一所述的系统,还包括 第三获取装置,被配置为响应于所述来自客户端的加载程序模块的请求,获取待加载的程序模块间的层级关系信息。
15.如权利要求9所述的系统,其中程序模块为程序类Class,并且所述具有层级关系的程序模块间是松耦合的。
16.如权利要求9-15任一所述的系统,其中所述请求中仅包含待加载程序模块中的根模块信息,并且所述通知中仅包含已加载的程序模块中的根模块信息。
全文摘要
本发明涉及应用程序处理领域。更具体地,本发明尤其涉及对应用程序中具有层级关系的程序模块进行加载的方法及系统。本发明提供了一种用于加载具有层级关系的程序模块的方法,包括接收来自客户端的加载程序模块的请求,所述请求中包含待加载程序模块中的根模块信息;根据所述请求中的根模块信息,获取所述待加载根模块以及所述待加载根模块的子模块;以及将所述根模块以及所述根模块的子模块发送至所述客户端。
文档编号H04L29/08GK102810065SQ20111014428
公开日2012年12月5日 申请日期2011年5月31日 优先权日2011年5月31日
发明者戴海斌, S.海尼斯, J.加里, 邬海杰 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1