2010-02-03 60 views
8

我正在开发价格计算引擎。我已经看遍了,没有什么能够真正适合我们需要的东西。不过,我现在正在寻找如何实施特定价格和/或折扣。我不想为我的最终用户引入基于规则的引擎,因为他们不会得到它。寻找计算复杂折扣的模式/最佳实践

例如,当您订购ItemX时,价格为30美元。但是与ItemY组合的ItemX的价格是20美元。或者当订购ItemX的五个时,每个之后将只有15美元。

任何想法从哪里开始?如何接受这个?也许一些(开源)示例应用程序包含这些实践?我可以使用的任何(技术)模式?最好在C#中。 在此先感谢!

回答

4

忙着看着类似的情况,并发现装饰模式是一个不错的选择。

http://www.dofactory.com/Patterns/PatternDecorator.aspx

退房:http://www.itarchitect.co.uk/articles/display.asp?id=357

干杯

还检查了STRAT型模式我期待在执行折扣: Discount strategy in shopping cart and orders

+0

我也认为装饰者是最好的解决方案。我正在做一系列责任链,以找出适合特定产品范围的“模块”,并为特定调整添加修饰器。 – 2010-03-11 07:25:54

2

我很抱歉不得不说这个,但这看起来像你将不得不应用一些定价规则引擎来实现你在之后。

会像你必须

  • 商店可用的项目,其 折扣每pruchase。
  • 存储哪些项目组合 会相互打折。
  • 也可以考虑每 单位/数量购买单位,或 可能每包/特殊。
  • 可能想看看在保持 存档/存储这些 特价品/包,只是柜面的 客户希望 原始发票的再版。

一般有很多的,可以被认为是可能的规则/组合,以及你作为开发人员可以实现这些并从用户隐藏它们,或者允许用户创建它们,但总得有人这样做

然后,当你不觉得实现自己,GOOGLE shold提供一些:

Open Source Rule Engines

4

有很多,你可以做到这一点的方式,但我认为其中一个可能是最有用的您将需要定义一个DSL,您可以用这种方式来表达折扣,以便可以轻松地向业务用户解释和合理化。从ayende's articles on DSLs in boo一个例子是:

apply_discount_of 5.percent: 
    when order.Total > 1000 and customer.IsPreferred 
    when order.Total > 10000 

suggest_registered_to_preferred: 
    when order.Total > 100 and not customer.IsPreferred 

正如你可以看到你所看到的,这是什么样的事情,你可以打印出来,展示给客户,他们会立即明白发生了什么事情。

当然,开发这样的东西既耗时又昂贵,而且充满了时髦的边缘情况。然而它具有代码可以被单元测试,执行和调试的好处。

如果boo不是你的东西,那么也许你可以看看在ironruby,ironpython或F#中定义类似的东西。但是我会建议远离XML来定义这些规则,除非你真的享受到一个痛苦的世界。然而,这是像Biztalk这样的产品被设计来处理的东西。你评估和发现哪些规则引擎缺乏?

+0

我认为DSL的选择是最好的,我不想给我的顾客这个。他们不理解它,会犯错误,我没有时间去执行例外,因为会有很多!但是,无论如何,也许我会仔细研究一下。 – 2010-03-11 07:25:04

3

我们对这种类型的复杂计算使用规则引擎。我们的平台是Java,我们使用Drools(我们很满意)。 Drools也可用于.Net。这里有一个开源的列表Rules Engines for .NET