读BAC7.5 源码有感

累,脑细胞不知道死了多少了。而且由于官方放出的源代码太少,只有反编译JAR来获得源代码,可读性很差!都是为了生活啊。不过收获还是不小滴!

每个rule都继承至BaseRule,而BaseRule对外的借口就是execute方法。BLE引擎就是调用这个方法来完成计算。

在execute方法中会调用calculate方法,calculate大体来说干四件事情:

1、调用calculateKpi方法来完成计算,并把计算结果保存在KPI的RuleObjective中。


2、调用 calculateValueForObjective把calculateKpi的计算结果取出来,当然也可以完成一些逻辑计算,但是主要的计算都是在calculateKpi中完成。

3、调用evaluateObjective方法把结果转换为换为KPI的status[0,5,15,20]; 它是通过ObjectiveEvaluator.evaluateObjective来完成计算。

4、最后利用updateStatus方法设置(更新)KPI的status,status也是保存在KPI的RuleObjective中。它的实现是通过BaseRuleImp.updateStatus调用objective.setResultValue("status", status)来完成,同时通过objective.setTransientValue("__ACT_PREV_STATUS", prevStatus)来保存上次状态。


calculateKpi和calculateValueForObjective主要的功能就是逻辑计算。

其中evaluateObjective和updateStatus不需要重写。而calculateKpi和calculateValueForObjective都必须重写来完成特定的功能,唯一的例外就是GroupRule及其子类不用重写calculateKpi。它对该方法的实现为空,啥也不干,这也很好理解,因为GroupRule一般来说只是取子KPI的值,比如BestChildRule。所有逻辑都写在calculateValueForObjective方法中了。

KPI的结果会保存在KPI的RuleObjective属性里,在RuleObjective中有一个Map性质的对象,专门用于保存KPI的结果,包括value和status等,当然我们也可以保存其他的。
一般来说calculateKpi的结果会保存为value。

在BAC的代码体系中,RuleDimension代表KPI,RuleNode代表CI。RuleObjective代表KPI的结果存放地,附属于某个KPI,KPI可以包含多个RuleObjective。

 

你可能感兴趣的:(生活)