2010-02-03 10 views
8

Estoy desarrollando un motor de cálculo de precios. Miré por todas partes y no hay nada que realmente se adapte a lo que necesitamos. Sin embargo, ahora estoy buscando cómo implementar precios y/o descuentos específicos. No quiero introducir un motor basado en reglas a mis usuarios finales, porque no lo obtendrán.Buscando patrones/mejores prácticas para calcular descuentos complejos

Por ejemplo, cuando solicita un ItemX el precio es de $ 30. Pero en combinación con ItemY, el precio de ItemX es de $ 20. O al pedir cinco de ItemX, cada uno después de solo $ 15.

¿Alguna idea de por dónde empezar? ¿Cómo llevar esto? Tal vez algunas aplicaciones de ejemplo (de código abierto) que contienen prácticas como estas? ¿Algún patrón (técnico) que pueda usar? Preferiblemente en C#. ¡Gracias de antemano!

Respuesta

4

Ocupado mirando una situación similar y encontrando el patrón Decorator como una buena opción.

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

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

Saludos

también comprobar si hay un patrón de tipo Strat Estoy buscando en los descuentos de ejecución: Discount strategy in shopping cart and orders

+0

También creo que el decorador es la mejor solución. Estoy haciendo una combinación de cadena de responsabilidad para descubrir qué 'módulo' es apropiado para el rango de producto específico y para agregar el decorador para ajustes específicos. –

2

Lamentamos tener que decir esto, pero esto parecería que tendría que aplicar algún Motor de reglas de precios para lograr lo que busca después de.

Parecería como si tuviera que

  • tienda los artículos disponibles, y sus rebajas por pruchase.
  • Almacenar qué elementos en combinación se descuentan entre sí.
  • También tal vez pensando en por unidad /cantidad comprada por unidad, o tal vez por paquete/especial.
  • posible que desee ver en el mantenimiento de un archivo/almacenamiento de estos especiales/paquetes, sólo en caso de que el cliente quiere una reimpresión de la factura original .

En general, hay una gran cantidad de posibles reglas/combinaciones que pueden ser considerados, y usted como desarrollador puede implementar estos y ocultarlos de usuario, o permitir al usuario crear ellos, pero alguien tiene que hazlo.

Y luego, cuando te sientes como la implementación de su propia, GOOGLE shold proporcionar alguna:

Open Source Rule Engines

4

Hay muchas maneras que usted puede conseguir esto, pero creo que el que podría ser más útil para Debería definir una DSL que pueda usar para expresar sus descuentos de manera tal que pueda ser fácilmente explicada y racionalizada con los usuarios comerciales. Un ejemplo de uno de ayende's articles on DSLs in boo es:

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 

Como se puede ver se puede ver, este es el tipo de cosa que usted puede imprimir y mostrar a un cliente y de inmediato se va a entender lo que está pasando.

Por supuesto, desarrollar algo así es lento, costoso y lleno de funky edge cases. Sin embargo, tiene el beneficio de ser un código que puede ser probado, ejecutado y depurado por unidades.

Si boo no es lo tuyo, entonces tal vez podrías buscar definir algo similar en ironruby, ironpython o F #. Sin embargo, le sugiero que se mantenga alejado de XML para definir estas reglas a menos que realmente disfrute de un mundo de dolor.

Sin embargo, este es el tipo de cosas que los productos como Biztalk fueron diseñados para manejar. ¿Qué reglas de motores has evaluado y encontrado que faltan?

+0

creo que la opción de DSL es la mejor No quiero darle esto a mi cliente Ellos no lo entienden, cometerán errores y no tengo tiempo para implementar las excepciones, ¡porque habrá muchos! Pero gracias de todos modos, tal vez lo investigue algún tiempo. –

3

Utilizamos un motor de reglas para este tipo de cálculos complejos. Nuestra plataforma es Java y utilizamos Drools (con lo que estamos contentos). Drools también está disponible para .Net. Aquí hay una lista de código abierto Rules Engines for .NET.

Cuestiones relacionadas