c# - Motor de reglas para.NET
rules drools (7)
100K no es un gran cambio, pero un programador decente por un año costará más que eso, ¿tienes un programador más barato que puede hacerlo más rápido que un año? ¿Será igual de bueno (para tus necesidades) o mejor?
Tenemos un requisito comercial para que los usuarios avanzados puedan editar las reglas de inscripción y las tasas de seguro. Necesitamos una interfaz de usuario web que les permita decir "este producto es solo para personas <55 a menos que sean de Texas y tengan un caniche" o lo que sea. Editar para aclarar: el seguro es una locura. Las reglas difieren de un producto a otro, de un estado a otro y cambian constantemente.
Nos fijamos en un par de motores de reglas, pero los comerciales son 100K + y los de código abierto no parecen haber terminado. El flujo de trabajo de Windows funciona si creamos las reglas con anticipación, pero construirlas en tiempo de ejecución parece requerir que se omita la seguridad de acceso al código. Eso asusta.
¿Estamos locos por reinventar esta rueda? ¿Hay alguna alternativa mejor para .net?
Creo que como con la mayoría de las decisiones de compra y compra, siempre es un compromiso que tiene que hacer personalmente. Si compra una solución lista para usar que cuesta 100K + y solo va a utilizar un 1% de lo que probablemente sea dinero gastado imprudentemente. Sin embargo, si el producto es perfecto, entonces casi puede estar seguro de que nunca podrá fabricarlo por menos (suponiendo que tengan mucha experiencia en ese campo en particular).
Entonces, no está loco para reinventar esta rueda mientras no intente hacer todo lo que hace el producto de la estantería y simplemente enfóquese en la funcionalidad específica que necesita y no se deje tentar por la idea de construir una muy buena (pero caro) framework para algo muy simple.
El problema es que estas cosas están tan interrelacionadas con la forma en que una empresa opera de manera única, es difícil, si no imposible, utilizar una solución lista para usar.
He hecho algo como esto de dos maneras diferentes.
El más reciente (en VS 2005 / Framework 2.0) fue crear un motor base que manejara los requisitos mínimos comunes que serían los casos generales. Esto sería cosas como nombre, dirección, etc. Luego escribí una serie de DLL de extensión que usaban interfaces comunes que se cargarían a través de la reflexión para tipos / regiones específicos, por ejemplo, por estado o línea de productos. Los usuarios avanzados podrían usar una aplicación simple para crear la configuración de cuenta que necesitaban (las configuraciones se almacenaron en una base de datos). Si las cosas cambiaran, la DLL subyacente podría modificarse o agregarse una nueva. Solo tuve que agregar una nueva extensión DLL durante los 4 años que estuve en este proyecto, pero generalmente se necesitaban una o dos modificaciones pequeñas al mes para las reglas.
En un proyecto VB6 mucho más antiguo, utilicé un VBScript guiado para proporcionar a los usuarios avanzados la capacidad de codificar ciertas reglas. Aunque los usuarios conocían bien las secuencias de comandos de Excel y se escribió una interfaz de asistente para ayudarles a hacer lo que tenían que hacer, por lo general solo me dieron el trabajo de codificar las reglas. Ese tipo de plan fue contraproducente, por eso no lo usé más tarde, sino que opté por un enfoque más "revisa esto, selecciona eso" para construir reglas.
Escribir tu propio motor funciona si tus reglas son simples. Cuanto más complicados se vuelvan, más tiempo llevará mantenerlo.
Puede usar Drools Server para ejecutar sus reglas y aún hacer su aplicación principal con .NET o el idioma que desee. Todavía necesitas Java para la parte del Servidor Drools.
Este no es mi campo, me encontré con esta pregunta por casualidad, por lo que puedo estar fuera, pero echaría un vistazo a Wolfram Mathematica . Es un entorno informático técnico y un lenguaje de programación multi-paradigma (propietario), que admite muchos estilos de programación (incluida la programación basada en reglas y funcional). Tiene un motor de reglas muy general en su núcleo. A pesar del nombre y la reputación como software matemático (que es), es un lenguaje de programación de propósito general, de muy alto nivel. Un subconjunto de él puede compilarse a C. Puede cargar archivos DLL externos de forma dinámica, y interactúa de forma transparente con las plataformas Java y .Net. Tiene una versión web: webMathematica (que se basa en Java, sin embargo, jsp + Tomcat, pero nadie le impide interactuar directamente con su capa web basada en .Net, solo un poco más de trabajo). El beneficio adicional es que, si alguna vez necesita cálculos matemáticos, análisis, gráficos, estadísticas, todo está allí y el estado de la técnica.
Creo que debería ser mucho más rápido desarrollar la funcionalidad que necesita en Mathematica que en muchos otros idiomas / soluciones (yo programo profesionalmente en Mathematica, C, Java y Javascript, por lo que al menos puedo comparar estos idiomas). La licencia comercial completa debería ser 2 o 3 K para una sola máquina (4 núcleos), creo. Tiene varias características de paralelización. Lo más difícil en este enfoque sería encontrar un programador de Mathematica competente, pero alguien con experiencia en programación funcional / basada en reglas (LISP / Prolog, por ejemplo) debería poder recoger las cosas con bastante rapidez. Además, puede que no sea lo suficientemente rápido si necesita un rendimiento muy alto; realmente no sé cómo se compara en términos de rendimiento con otros motores de reglas. En ocasiones, tuve la oportunidad de comparar en Mathematica una solución basada en reglas para algún problema con la compilada en C, y diría que el código basado en reglas bien escrito debería estar en el nivel de Python en términos de rendimiento, y en promedio, quizás un orden de magnitud o más lento que el compilado para C. Pero eso se debió principalmente a problemas numéricos / computacionales o relacionados con la manipulación de datos, por lo que creo que para problemas inherentemente basados en reglas, la brecha de rendimiento podría ser más pequeño
Una cosa de la que estoy seguro es que en Mathematica puede crear conjuntos de reglas de generalidad y complejidad con bastante facilidad con una pequeña cantidad de código. Es una mejor herramienta para la programación exploratoria basada en las reglas que encontré hasta ahora, con un ciclo de desarrollo muy corto. Los invito a visitar la etiqueta de Mathematica aquí en SO para ver qué tipos de problemas están resolviendo las personas con ella. Para un proyecto prominente escrito completamente en lenguaje Mathematica (15 millones de líneas de código), consulte el motor de conocimiento WolframAlpha .
No creo que la evaluación de las reglas sea el reto. Creo que el mayor desafío es analizar las reglas que el usuario puede ingresar. Para analizar las reglas debe considerar crear un DSL. Martin Fowler tiene algunos pensamientos sobre esto here . Entonces quizás ANTLR valga la pena echarle un vistazo.
Para la parte de evaluación: trabajo en la industria financiera y también hay reglas complicadas, pero nunca tuve que usar un motor de reglas. Los medios de un lenguaje de programación imperativo (en mi caso C #) eran (hasta ahora) suficientes. En algunas ocasiones, estaba considerando un motor de reglas, pero los riesgos tecnológicos (*) de un motor de reglas siempre fueron mayores que los beneficios esperados. Las reglas eran (hasta ahora) nunca tan complicadas, ese modelo de programación declarativo era necesario.
Si está utilizando un lenguaje orientado a objetos, puede intentar aplicar el Patrón de especificación . Eric Evans y Martin Fowler han escrito una explicación más detallada, que puede encontrar here . Alternativamente, puedes escribir tu propio motor de reglas simples.
(*) Nota al pie: de alguna manera, necesitará incrustar el motor de reglas en su aplicación, que es muy probable que esté escrito en algún lenguaje orientado a objetos. Así que hay algunos límites tecnológicos, que hay que salvar. Todo tal puente es un riesgo tecnológico. Una vez fui testigo de una aplicación web Java utilizando un motor de reglas escrito en C. Al principio, el programa C a veces producía volcados de memoria y demolía toda la aplicación web.
¿Hay alguna alternativa mejor para .net?
Una opción es usar un motor de script incorporado dentro de su código .net, como Iron Python. Proporcione una GUI para que sus usuarios creen reglas, conviertan "la regla" a un script de Python, llame al motor de script de Python dentro de .Net para ejecutar el script.
¿Estamos locos por reinventar esta rueda?
Si nada del estante satisface sus necesidades, entonces No.