NashZhou

广告算法工程师,目前致力于关键词广告的效果自动优化

程序扩展性的一个实例(上)

这段时间用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规则信息

整体思路就是这样,有想法大家一起讨论

posted on 2012-11-14 21:00  NashZhou  阅读(1032)  评论(0编辑  收藏  举报

导航