C4CCloudApplicationStudio用于ABSL开发的一些性能最佳实践。文章中概述了一些准则。下面是一些具体的例子。批量调用BOaction的一个不好的例子:第一行和第四行有两个循环,然后在第二个循环中调用一个定义在ServiceRequestBO的item节点上的标准actionFinishFulfilmentProcessing,比较耗时。代码的时间复杂度为o(n2)。正确做法:优化的原则是C4C和很多其他基于Netweaver的SAP产品一样,在其BO核心服务中支持批量操作。所谓批量操作,从技术上讲就是这些服务的输入参数是一张内表,而不是单条数据。如果你做过CRM开发,你可以把它比作CRM_ORDER_MAINTAIN这个功能模块,它的输入参数都是内部表结构。C4C的BO提供的服务的接口定义也完全采用了这种支持批量操作的设计。对于上面的坏例子,编译后的ABAP代码伪代码如下:(由于C4C的后台代码不对合作伙伴和客户开放,我只能提供伪代码)。可见,BO的动作虽然是进行批量操作,但是这种写法并没有起到批量操作的作用。循环中作为输入参数的内标,每次都在第二行清空,导致每次调用BO动作时的输入。该参数只有一条记录。举个正确的例子,编译后生成的伪代码是:可以清楚的看到,BO动作的执行已经放在循环外了。如何批量执行BORetrieve当我们尝试通过CloudStudio中的代码自动补全功能调用BO的Retrieve方法时,IDE会提示我们Retrieve方法有3个重载(Overload),说明Retrieve可以支持不同参数的输入。正确和不推荐的做法如下图蓝色和红色代码所示。可以看出蓝色代码retrieve接受的入参是一个集合,其中包含两个ID为3和4的元素,这样在第41行的调用可以一次返回两个ServiceRequests的数据。第43行编译后生成的ABAP代码伪代码:第41行编译后生成的ABAP代码伪代码:通过对比可以发现,如果传给retrieve的参数是一个ID的集合,那么编译生成的ABAP代码会调用一个interface是内表的retrieve方法,用于批量读取数据。如何批量执行BOCreate基本的Create操作见下面代码第54行,只支持基于单个节点的数据创建。但是对于CreateWithReference场景,和第二个例子中的Retrieve场景一样,不仅支持传入单个数据(第56行),还支持传入一个集合(第58行)。这两种不同的输入会导致编译生成的ABAP代码分别进入CREATE_WITH_REF_1和CREATE_WITH_REF_N的执行逻辑,造成性能差异。
