开发者社区> 问答> 正文

如何动态扩展代码

现在我做的订单模块,经常需要修改下单部分的代码,可是经常修改这部分的代码对整个订单系统的稳定非常不利。
修改的原因往往是因为促销策略、优惠策略的增加,比如买十送一,买满多少每件商品减多少元等策略
可是我想不到除了修改代码以外更好的方法了,希望各位前辈能指导一下,给点建议意见,谢谢各位前辈了

展开
收起
蛮大人123 2016-02-25 18:37:48 2753 0
3 条回答
写回答
取消 提交回答
  • 把这部分抽象成规则,用脚本语言表达这些规则

    2019-07-17 18:47:53
    赞同 展开评论 打赏
  • 表达式引擎

    2019-07-17 18:47:53
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    说一说我的一点看法:
    一、优惠策略有多种形式,但是无论哪种都是在所选购商品种类、数量以及订单金额上做文章,因此可以设计一个通用的过滤器Filter,它接受一个订单(账号、商品号、数量、单价、总价)作为输入,同时返回一个新的订单(账号、商品号、数量、单价、总价、优惠类型),每一个Filter都可以在内部定义一套优惠方案。
    二、优惠策略的组合方式有
    1.可叠加的(买二送一、满500打7折可以同时使用)
    2.选最有利的(满500减100和会员卡打7折不能同时使用,但是可以选择其中一个使得价格最低)
    3.互斥的(促销商品不能同时享受满减优惠)
    等多种情况。
    因此为Filter设计一套组合系统:
    每一个Filter内部都可以由其他的Filter组合而成,并有如下几种方式:
    1.并联(选最大优惠/最小优惠)
    2.优先级(当多个优惠策略同时满足时,选优先级最高的)
    3.串联(可以同时使用)
    三、针对常见的优惠(如满减、满送、折扣等)做一套模板,可以随时使用参数进行实例化:
    例如满减: OffAtFilterFactory(type, off, at)可以指定type类型商品满at的时候减去off,并产生一个相应的Filter以供使用。
    每出现新的优惠,就手动画一画图,把优先级、串并联关系捋清,然后从最内层开始构造Filter,层层嵌套起来(想来也不会超过三层吧)。
    之后做一套配置系统,使用XML也好JSON也好,可以直接把优惠写在配置文件里,Filter的生成、组合都由程序读取配置文件后自动进行。
    最好的莫过于做一套图形化配置系统,可以通过拖模块画图的方式来写生成配置文件。
    实现的话,简单说一下吧,做到手动写Filter还是不难的,至于怎么根据配置文件生成代码,就需要较大篇幅这里就不提了。
    看你加了Java话题,我没正经用过Java,就只说一下伪代码哈哈:
    class Order {

    //存储订单的各项信息

    }

    //这个类要作为一个抽象类
    abstract class Filter {

    //构造函数什么的
    
    //对订单o执行操作
    abstract Order apply(Order o);

    }

    //这个类是最基础的,非组合式的Filter,也就是说它只能完成一个优惠策略
    class PrimitiveFilter extends Filter {

    boolean fit(Order o) {
        //返回o是否符合优惠条件
    }
    
    Order apply(Order o) {
        //直接对o进行操作,获取订单信息,根据优惠策略生成对应的优惠后的订单并返回
    }

    }

    class ParallelFilter extends Filter {

    Vector<Filter> pvf;    //pvf按照优先级存储各个Filter
    
    Boolean fit(Order o) {
        //按照优先级(使用i从0到pvf.length迭代),判断订单o是否符合pvf[i]中的条件(使用fit方法),如果发现符合的,就返回true
        //都不符合返回false
    }
    
    Order apply(Order o) {
        //按照优先级(使用i从0到pvf.length迭代),判断订单o是否符合pvf[i]中的条件(使用fit方法),如果符合,即返回pvf[i].apply(o)
        //如果不符合,继续判断下一个Filter
        //如果所有的Filter都不符合,返回原订单
    }

    }

    class SerialFilter extends Filter {

    Vector<Filter> svf;    //按照串联顺序存储Filter(其实这个也没什么顺序可言)
    
    Boolean fit(Order o) {
        //svf中所有Filter都符合才返回true
        //有一个不符合就返回false
    }
    
    Order apply(Order o) {
        //按顺序把o通过所有的Filter
        //用Vector的reduce方法就好了,不知道Java里有没有
        //没有的话:
        Order t = o;
        for (Filter f in svf) {
            t = f(t);
        }
        return t;
    }

    }
    上面这些就足够实现三种优惠组合方案啦。

    2019-07-17 18:47:52
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
动态、高效,蚂蚁动态卡片的内核逻辑 立即下载
ui-model,跨框架复用 立即下载
“静态调用链路发现”应用场景分析及实践探索 立即下载