论坛首页 综合技术论坛

请教怎么把计价类的程序写好。。。。

浏览 3280 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-14  
  计价往往错综复杂。小弟就遇到了这种事情。

  事情是这样的,我们的项目(注意是项目,意味着不同的地方有不同的需求)是一个MIS,里面涉及到计价。这个计价不幸由小弟编写。

  第一版程序很快出来,很简单,只需要设置收费依据,收费依据相关的属性,收费方式,与收取金额,然后再给各种业务关联上各种各样的收费,就可以在不同的业务中按预先关联好的收费项目中收费。在测试的时候,工作得挺正常的。给第一个地方使用的时候没什么问题,很好,很强大。

  因为另一个地方也需要同样的功能,不过需求有点不同,于是给加了一个功能,就是在真正计价之前,弹出一个对话框,让用户自行选择按哪种收费项目收费。因为之前的程序是没有GUI的,这次总不能弹出一个CMD窗口来吧,于是就把窗口加上,并且写上相应的代码。这是第一次变更,不是很大。

  第三个地方也开始用这个模块了。他们又提出,因为在不同的地点做的业务收取的费用也是不同的……寒。因为之前没考虑到同一个地方收费也是不同的,所以没有这方面的设置,于是又给加上。又一次变更,也不是很大。

  现在第四个地方也来了……这次提出的问题更BT,是一个无法正交分解的收费方式。

  现在正在头疼着。问题的原因就在于,这个计价程序把容易变的逻辑部分写死在程序当中。因此,每次变更一个需求,就得改一次代码。

  对于这个问题,如果用规则引擎的话,似乎有点杀鸡用牛刀。因为这个功能只能算是一个易用性的需求,不是一个关键的需求,并且我们的项目并不是基于Java的,JBOSS Drools之类的东西也应用不上。

  所以想问大家,有没有什么办法,能让我把计价的规则提取出来,写成一个别的配置文件。这样以后需求变更起来就不需要去更改代码了。

PS:在opera下貌似无法发帖。
   发表时间:2007-09-14  
脚本语言?
0 请登录后投票
   发表时间:2007-09-14  
  这个问题是脚本语言和非脚本语言基本没有什么差别。
  问题的关键在于,现在计价的逻辑表现在一堆的if else里面。不论是用脚本语言还是用非脚本的语言,都免不了写一堆的if else。
  虽然说if else是一定要用的,但是最好是通过某些配置文件,让程序自己去if else,而不需要人自己去写if else。
0 请登录后投票
   发表时间:2007-09-14  
林杰杰 写道
  这个问题是脚本语言和非脚本语言基本没有什么差别。
  问题的关键在于,现在计价的逻辑表现在一堆的if else里面。不论是用脚本语言还是用非脚本的语言,都免不了写一堆的if else。
  虽然说if else是一定要用的,但是最好是通过某些配置文件,让程序自己去if else,而不需要人自己去写if else。

让程序去if else?那么也许你该使用strategy模式,利用多态来消除条件语句。你这边只是一个地方有这么一个规则,况且这个规则也是不需要业务人员去修改的吧?规则引擎就算了,如果确实需要业务人员去修改,那么内嵌一个脚本解释器(比如ruby),定义DSL处理也不错。
0 请登录后投票
   发表时间:2007-09-14  
  strategy模式估摸也用不上。因为各种计价规则之间并无明显的继承关系。比如说A业务登记费用与B业务登记费用其实并不存在多大的关系。

  内嵌一个ruby解释器可能可以,但是其实就是把用C语言写的代码换成用ruby写了而已,省去了编译分发的过程。

  定义DSL可能是一个可行的方法。

  所以就请问大家一下,在这个领域的DSL定义上,有没有可以让小弟借鉴的经验?
0 请登录后投票
   发表时间:2007-09-14  
规则?提取出来?根据楼主的描述,规则本身都在不停的进化,要想“提取”出来,除非楼主对客户业务非常熟悉,预先了解他们的规则变化,然后就可以花几个月写一套“通用”的可制定规则的计价程序。不过这个“通用”能维持多久就不知道了。

所以我建议楼主能则修修补补,不能就重新设计。
0 请登录后投票
   发表时间:2007-09-15  
你第四种无法正交分解的是什么意思?详细描述出来看看。
加个决策表,这个在上万种计价逻辑也搞得定。从你前面描述的业务来看, 决策表很适用你说的, 而且这个决策表是个相当小的决策表
0 请登录后投票
   发表时间:2007-09-17  
我说的无法正交分解,指的是在原本的设计中显得很别扭。
原来的设计很简单,基本上像下面那个:
foreach(收费 in 所有收费项目)
    foreach(物品 in 所有物品)
        计价(收费,物品)
    endfor
endfor

现在出现了一些收费方式,没办法应用到上面的那个循环中去。

关于那个决策表的,我以前没有接触过。等我去了解一下什么叫决策表先,嘿嘿。
0 请登录后投票
   发表时间:2007-09-17  
林杰杰 写道
我说的无法正交分解,指的是在原本的设计中显得很别扭。
原来的设计很简单,基本上像下面那个:
foreach(收费 in 所有收费项目)
    foreach(物品 in 所有物品)
        计价(收费,物品)
    endfor
endfor

现在出现了一些收费方式,没办法应用到上面的那个循环中去。

关于那个决策表的,我以前没有接触过。等我去了解一下什么叫决策表先,嘿嘿。


你这个不用太复杂的决策, 关系型的决策就行,用1个矩阵决策足够了,这么简单也没必要按照范式分解。
(因素A, 因素B, 因素C, ……,因素N, 计价算法(或者算法标志) )
0 请登录后投票
   发表时间:2007-09-20  
@ zengjin8310:
  关于这个决策表,这几天我百度了几下,都没找到什么有用的资料。不知道在哪里可以找到这方面的资料呢? ^_^
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics