这段时间用python写了很多report脚本,当时没考虑那么多,思路清楚后就开始写了。
但是后面需要对某些report进行扩展时,发现问题就出来了,改动的地方太多,而且容易出错。
看了一些设计模式,发现没找到我想要的。手头现在又有一个report需求,打算尽量将代码写的易扩展些。
问题描述
给出report,返回不正常的账户
不正常的规则很多,后续会扩展,判断是否符合某个规则需要搜集某些数据。
不同规则判断所依赖的数据可能来自同一个地方,即具有一定的重复性。
一个账户满足的不正常规则可能会很多,故每个规则判断具有一定的优先级。
目标是搜集满足不同规则下的账户信息及具体违规数据,并注重扩展性。要求用python实现,输出csv文件。
如下图所示:
扩展性的体现:增加新功能不需要修改已有的代码,只增加代码(没有任何重复的代码)。
这个问题中,以后主要的扩展方向就是规则和数据。
1.规则的优先级
我首先想到的是树,但是实现起来比较复杂,python貌似没有现成的树结构
优先级的引入主要是为了避免不必要的规则判断。
先用list嵌套list的方式实现吧。记作rule_relation
2.规则判断程序
加入一个规则rule_i,就会加入一个判断是否符合该规则的程序judge_rule_i。
这些不同的判断程序以何种方式组织是一个问题。如何与rule_relation结合又是一个问题。
还是用对象好,一个rule是一个对象,里面有树结点信息存储rule_relation。又有judge_rule这个抽象方法。
一个规则的引入就继承rule基类。然后实现方法judge_rule。前面两个问题都迎刃而解了。
3.判断不同规则可能需要不同的数据
这个也可以用rule对象解决,init里初始化好数据,需要相同数据就互相继承,面向对象真好
4.结果收集
整理下整体的思路。
初始化rule_relation,扩展的话,需要新建一个类。然后在rule_relation 里多插入一个结点。
遍历账户list,依照rule_relation的根结点依次进行judge_rule。
rule_relaton遍历实现起来好像也不轻松,子结点还是用对象list好。孩子结点可以多个。
一旦符合某个规则,就跳出执行下一个账户。
结果需要先打印规则信息,然后打印满足这个规则的所有账户及具体信息。
直接想法是 维护多个规则list,然后append,遍历输出。
那不是多一个规则就要多加一个list,不好不好。
如果只有一个list,那么需要排序,过度数据时需要打印规则信息。
可以将list 当作参数输入到judge_rule里,judge_rule将结果包括排序key append到list里
遍历,然后判断当前key和上一个是否一致,不一致则print规则信息
整体思路就是这样,有想法大家一起讨论