OC

Knowledge OS
登录 注册
全部话题 移民 创业 iOS Mac Objective-C Swift Android 招聘 求职

一个保险领域通用计算引擎的设计

尼克徐
尼克徐 发布于 2014年05月09日 | 更新于 2016年04月15日
cnsoft 等0人欣赏。

我近期正在做的一个东西,是维护和扩展一个保险方面的计算引擎。

根据被保险人的年龄,性别,所选产品等的情况,来计算保费,以及保单利益等,最后产生报表(报表在几页到十几页之间)。

这个引擎采用c语言,部署到ios平台和windows平台。

几十种产品,上百个数据表,中间的计算也很复杂。

以前的计算引擎代码,有十几年历史,除了一些数据表外,各种全是硬编码。

近三十万行代码,一旦出错或改动,只能debug。多么痛苦的事情。

而且最近还要改成为另一个国家用的。于是我要做一个重构(除了重用数据以外,其实是推倒重来...)。

目前已经完成主要部分,还有一些正在编程中。

在这里分享一下基本思路。(待续)

共39条回复
楼长 ·
LLeiFeng 回复于 2014年05月09日

期待更新...

2楼 ·
尼克徐 回复于 2014年05月09日

重构引擎的目的

1, 尽量把计算保费和各种数据的步骤和输入输出等,都放在配置文件里。减小开发新保险产品时的代码量(最终减小到零代码量)。

2, 提高开发效率和维护效率100%-200%

3,最终目标:非专业人士在短期培训后,就可以用ipad所见即所得配置计算引擎,配置好后,把配置文件email给开发人员。一个新的保险产品的计算引擎部分就完成了。

以下是设计框图,解释待续。

alt text

3楼 ·
tinyfool 回复于 2014年05月09日

赞,虽然这个行业我不懂,但是我觉得你做的事情很有意思,也有挑战,加油

4楼 ·
淮左青衣 回复于 2014年05月09日

相当于自己实现一个公式分析器?最早之前在做电信产品的时候,我们的PM设计过类似的一个东西。设计师用IBM的rose设计业务流程图,然后用code去分析Rose的文件(某个旧版本的rose生成的文件好像是普通文本,可以用code直接分析,高版本的就不行了),生成我们自己的业务规则,然后用自己的引擎去跑这一条条的规则。

最后实现的效果就是业务设计人员50%+的改动不需要程序员的参与就可以完成了,而且无需等待部署:)

5楼 ·
Silence 回复于 2014年05月09日

感觉各种测试可能是关键。

6楼 ·
尼克徐 回复于 2014年05月09日

一,Engine Calculation (引擎计算部分)

这一部分是这个引擎的核心部分。

因为所有的保费和报表计算部分,都可以用excel来模拟(在我们这里叫做mock up),所以我就做了一个excel的解释执行器。

先把excel转成xml,然后用c语言解释执行。

一段excel转的xml:

<tr>
 <td type="double" index="A16"><![CDATA[1.0]]></td>
 <td type="string" index="B16"><![CDATA[Accidental Death & Dismemberment]]></td>
 <td type="expression" index="C16"><![CDATA[IF($C7ドル="Y","PP","PW")&"I"&K16]]></td>
 <td type="expression" index="D16"><![CDATA[VLOOKUP($C5ドル&"I"&$D7ドル&C16&$C6,ドルsc_premium!A3:E546,4,0)]]></td>
 <td type="expression" index="E16"><![CDATA[VLOOKUP($C5ドル&"I"&$D7ドル&C16&$C6,ドルsc_premium!A3:F546,5,0)]]></td>
 <td type="expression" index="F16"><![CDATA[VLOOKUP($C5ドル&"I"&$D7ドル&C16&$C6,ドルsc_premium!A3:F546,6,0)]]></td>
 <td type="expression" index="G16"><![CDATA[TRUNC(E16*F16/$F14,4ドル)]]></td>
 <td type="expression" index="H16"><![CDATA[ROUND($G16*H13,2ドル)]]></td>
 <td type="expression" index="I16"><![CDATA[ROUND($G16*I13,2ドル)]]></td>
 <td type="expression" index="J16"><![CDATA[ROUND($G16*J13,2ドル)]]></td>
 <td type="string" index="K16"><![CDATA[A]]></td>
 <td type="string" index="L16"><![CDATA[]]></td>
 <td type="string" index="M16"><![CDATA[]]></td>
 <td type="string" index="N16"><![CDATA[]]></td>
 <td type="string" index="O16"><![CDATA[]]></td>
 <td type="string" index="P16"><![CDATA[]]></td>
 <td type="string" index="Q16"><![CDATA[]]></td>
</tr>
7楼 ·
尼克徐 回复于 2014年05月09日

为了方便开发者查看excel在ios上的执行情况,我在ipad上做了一个excel的ui编辑界面。

alt text

最麻烦的地方就是查错(我不希望用debugger),尤其是excel的公式执行时出错。所以我在公式的错误检查上下了不少功夫:

alt text

以及公式的单步执行:

alt text

8楼 ·
尼克徐 回复于 2014年05月09日 | 更新于 2016年04月15日

这个计算模块已经重构了两次,比较成熟了,经历了10多个保险产品的考验,性能和结果准确性满足要求。

做这个模块时所遇见的问题及其解决方案。

1, 多平台部署时的内存问题。

这个引擎部署在ios上使用时效果很好,但转成dll后部署到windows平台,就会crash.其主要问题在于对string的内存释放时出错。目前虽已经稳定,总觉得string的alloc和释放还有些不规矩。正在考虑用stringtable来整体解决string的alloc和释放。

2, 性能问题

最开始时,这个计算引擎只能把excel表格从头到尾计算一遍来获得结果。

当excel表格很大时(700-1000行以上),整个计算一遍速度就太慢了。可以很明显看到延迟。

现在这个引擎已经能做到局部计算,不用计算全表,只计算所需要的量。根据所求的量的公式,来追溯公式里所需的其他变量(跨表),而其他变量又追溯另外的变量,引起连锁反应而获得此数值。经过这方面的加强,性能有了很大提高。

有些数据的计算,需要大量的相关表格,此时,可以把相关表格的计算结果做成一个表格来使用,就不需要引用那么多表格了。

目前的计算引擎是解释执行的,最近学了一些编译原理,有想法把excel转成汇编语言执行,性能想必又会有提高...

9楼 ·
moulton 回复于 2014年05月09日

听这就头晕。。。。

10楼 ·
尼克徐 回复于 2014年05月09日

3楼 @tinyfool 谢谢!

4楼 @淮左青衣 公式分析器肯定是其中一部分啦。你说的那个产品很有趣啊。

5楼 @Silence 测试,测试,再测试!

9楼 @moulton 如果你看到以前的引擎的一堆shit代码时,头可以更晕一些...

本帖有39个回复,因为您没有注册或者登录本站,所以只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。
登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]

AltStyle によって変換されたページ (->オリジナル) /