zoukankan      html  css  js  c++  java
  • 程序扩展性的一个实例(上)

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

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

  • 相关阅读:
    php-文件系统
    php
    php
    php
    关于学习上面的感悟
    php
    Error: PostCSS plugin tailwindcss requires PostCSS 8.
    常用/不常用的HTTP状态码
    小程序云托管无需服务器部署PHP
    Docker-镜像操作
  • 原文地址:https://www.cnblogs.com/2010Freeze/p/2770384.html
Copyright © 2011-2022 走看看