Estoy explorando diferentes maneras de crear un simple motor de reglas de negocios en Java. Necesito presentar al cliente con una simple aplicación web que le permite configurar un montón de reglas. Un ejemplo de regla de base podría tener este aspecto :

Aquí el ejemplo:

 IF (PATIENT_TYPE = "A" AND ADMISSION_TYPE="O")
 SEND TO OUTPATIENT
 ELSE IF PATIENT_TYPE = "B" 
 SEND TO INPATIENT

El motor de reglas es bastante simple, la acción final podría ser sólo una de las dos acciones, el envío a pacientes internados o ambulatorios. Los operadores que intervienen en una expresión podría ser =,>,<,!= y operadores lógicos entre las expresiones son AND, OR and NOT.

Quiero construir una aplicación web donde el usuario va a escribir en un pequeño script en un textarea, y me gustaría evaluar la expresión – de esta manera, las reglas de negocio se explica en un inglés sencillo y de negocios de usuario tiene control completo sobre la lógica.

De la investigación que he hecho hasta ahora, que me encontré, ANTLR y escribiendo mi propio lenguaje de scripting como las posibles opciones para solucionar este problema. No he explorar opciones como cae la baba motor de reglas, porque tengo una sensación de que podría ser una exageración aquí. Ha tenido usted alguna experiencia en la resolución de este tipo de problemas? Si sí, ¿cómo usted va sobre él?

  • stackoverflow.com/questions/4329858/… podría ayudar
  • Parece una exageración para pasar el tiempo reimplementing algo que ya existe (incluso si no vas a reutilizar todo lo que está disponible).
  • Me preocupa que el esfuerzo de configuración aquí. No todos los opensource marco satisfacer mi necesidad y no sería un poco de personalización de los involucrados. A veces, el tiempo dedicado a la personalización de algo que podría exceder la construcción de una alternativa más sencilla.
  • para el caballero que molestó a voto negativo de una simple pregunta – ¿podría usted por favor explique sus intenciones detrás de este acto noble a este mediocre mundo!?
  • En contra de lo que muchos otros están diciendo, yo creo que si se decide que el ADSL va a ser bastante simple y estático, la implementación de usted mismo podría ser mejor que el uso de un peso pesado marco. Hay dos inconvenientes para re-inventar la rueda, pero también hay desventajas a la inclusión de un peso pesado de los marcos. Si usted no está familiarizado con ellos, tienen maneras de hacer que usted pagar más tarde. Me recuerdan constantemente de esto cuando yo uso varios ORM s (tos de Hibernación de la tos), por ejemplo. Si lo que usted proporcione es todo DSL, usted podría analizar las normas de uso de FSM.
  • Fuera de la parte superior de mi cabeza, usted podría: este Modelo con una FSM. La transición entre estados para cada token de sus reglas. Si encuentro un token sin una transición de su estado actual, entonces usted puede dar un ser humano amable mensaje de error. Como inicio, se puede seguir un montón de ejemplos en línea para la creación de algo así como un postfix calculadora. Básicamente, usted podría acortar el texto y, a continuación, traducir a la de Java operador equivalentes. Se podría asegurar que la estructura lógica es correcta mediante el ensamblaje de un árbol de expresión. Para obtener más información, Google algunas palabras clave como «java evaluación de la expresión postfijo».
  • usted probablemente tiene la downvote debido a la interna de la plataforma / softcoding antipatrones thedailywtf.com/Articles/Soft_Coding.aspx – es mejor resumió en la frase «Hm, tengo un martillo, ahora que se puede construir una herramienta para clavar algunos clavos en» y un montón de consejos que recibió aquí es justamente el uso de su lenguaje de programación para el modelo de su lógica de negocio thedailywtf.com/Articles/The-Mythical-Business-Layer.aspx
  • He ampliado mi último comentario en una respuesta completa a la mejor elaboradas a lo que me refiero, stackoverflow.com/questions/20763189/…

InformationsquelleAutor Jay | 2013-12-24

13 Comentarios

  1. 19

    Básicamente… no lo hagas

    A entender por qué ver:

    1. http://thedailywtf.com/Articles/The_Customer-Friendly_System.aspx
    2. http://thedailywtf.com/Articles/The-Mythical-Business-Layer.aspx
    3. http://thedailywtf.com/Articles/Soft_Coding.aspx

    Sé que parece una gran idea desde lejos, pero el motor de reglas de negocio, invariablemente terminan siendo más difícil de mantener, implementar y depurar, a continuación, el lenguaje de programación que fue escrito en – no hacer sus propios lenguajes de programación si usted puede ayudar.

    Personalmente, he sido por ese camino en una ex empresa y no he visto donde se va después de un par de años (gigante undebuggable scripts sentado en una base de datos escritos en un lenguaje que vino directamente de una dimensión paralela donde Dios nos odia que al final nunca se cumplen el 100% de las expectativas del cliente debido a que no son tan potentes como un buen lenguaje de programación y al mismo tiempo son demasiado enrevesada y el mal para desarrolladores de manejar (no importa el cliente)).

    Sé que hay un cierto tipo de cliente que está enamorado con la idea de que ellos no pagan programador horario para «regla de negocio adaptaciones» y poco se entiende de que va a ser peor en la final y para atraer a este tipo de cliente, usted tendrá que hacer algo en esta dirección – pero hagas lo que hagas no inventar algo de su propia.

    Existe una gran cantidad de decente lenguajes de secuencias de comandos que vienen con buenas herramientas (que no requiere compilación, por lo que pueden ser cargados dinámicamente etc) hay que puede ser hábilmente la interfaz y llamar desde el código Java y tomar ventaja de su implementado apis de Java que usted ponga a su disposición, consulte http://www.slideshare.net/jazzman1980/j-ruby-injavapublic#btnNext por ejemplo, Jython, posiblemente, demasiado,

    y cuando el cliente se da de escribir estas secuencias de comandos se se quedar con la feliz deber de mantener su fallido legado – asegúrese de que que legado es de lo más sencillo que puede ser.

    • Yo LOLed en la descripción de las secuencias de comandos. +1
    • «Sé que hay un cierto tipo de cliente que está enamorado con la idea de que ellos no pagan programador horario para la ‘regla de negocio adaptaciones «» yo soy un dev. Mi trabajo es hacer buenas recomendaciones técnicas. He aquí cómo me gustaría frase de su recomendación en esta respuesta: «Que la solución que históricamente ha demostrado ser menos fiable y más propenso a errores. No es probable para ahorrar esfuerzo (y por lo tanto dinero) en el largo plazo. Se necesitará más tiempo y el resultado en más errores.» La última frase se traduce, «más de tiempo (y dinero durante ese tiempo) y más apoyo de dólares».
  2. 10

    Yo sugeriría el uso de algo como Cae la baba. Crear su propia solución sería excesivo, ya que tendría que depurar, y aún así proporcionar la funcionalidad, sin duda, menor que el proporcionado por un motor de reglas de como cae la baba. Entiendo que cae la baba tiene una curva de aprendizaje, pero no me gustaría compararlo con la creación de un lenguaje personalizado, o una solución personalizada…

    En mi opinión, para que un usuario a escribir las reglas, él/ella tendría que aprender algo. Aunque supongo que se podría prever un lenguaje más simple que el cae la baba regla de idioma, nunca capturar todas sus necesidades. Cae la baba regla idioma sería bastante simple de reglas simples. Además, puede proporcionar a él/ella con un bien formados documentación. Si el plan para el control de las reglas creadas por el usuario final y aplicado en el sistema, entonces tal vez sería más inteligente para crear una interfaz gráfica de usuario que darían forma a las reglas que se aplican en la cae la baba.

    Espero que me ayudaron!

    • He leído cae la baba de la documentación. Todavía no estoy seguro de cómo ir sobre la que pide al usuario que escriba un cae la baba regla – eso no es algo que un usuario de negocios pudiera entender. ¿Cómo puedo hacer que sea sencillo para el usuario final?
    • «¿Cómo puedo hacer que sea sencillo para el usuario final» – Nos enfrentamos a un problema similar – hemos creado una plantilla de hoja de cálculo (Decisión de la mesa), que un usuario rellena con sus criterios de la regla, esta se convirtió entonces en formal cae la baba reglas. Por favor, consulte docs.jboss.org/drools/release/5.2.0.Final/drools-expert-docs/… para obtener más detalles y un ejemplo.
  3. 5

    De la experiencia del pasado, el «texto sin formato» basado en las reglas de solución es una MUY mala idea, no deja mucho margen para el error, también, tan pronto como usted tiene que agregar varias reglas simples o complejos, que va a convertirse en una pesadilla para el/los código /debug/mantener/modificar…

    Lo que yo hice (y funciona excepcionalmente bien) es crear strict/clases concretas que se extienden a una regla abstracta (1 para cada tipo de regla). Cada implementación sabe qué información se necesita y cómo procesar esa información para obtener el resultado deseado.

    En la web/front-end lado, vamos a crear un componente (por cada regla de aplicación) que estrictamente coincide con la regla. Entonces, usted puede dar al usuario la opción de lo que la regla que desea utilizar y actualización de la interfaz en consecuencia (por recargar la página/javascript).

    Cuando la regla se añade/modifica iterar sobre todos los de la regla de las implementaciones para conseguir la implementación correspondiente y que la implementación de analizar los datos en bruto (id recomendamos el uso de json) desde el front-end, a continuación, ejecutar la regla.

    public abstract class AbstractRule{
      public boolean canHandle(JSONObject rawRuleData){
        return StringUtils.equals(getClass().getSimpleName(), rawRuleData.getString("ruleClassName"));
      }
      public abstract void parseRawRuleDataIntoThis(JSONObject rawRuleData); //throw some validation exception
      public abstract RuleResult execute();
    }
    public class InOutPatientRule extends AbstractRule{
      private String patientType;
      private String admissionType;
    
      public void parseRawRuleDataIntoThis(JSONObject rawRuleData){
        this.patientType = rawRuleData.getString("patientType");
        this.admissionType= rawRuleData.getString("admissionType");
      }
      public RuleResultInOutPatientType execute(){
        if(StringUtils.equals("A",this.patientType) && StringUtils.equals("O",this.admissionType)){
          return //OUTPATIENT
        }
        return //INPATIENT
      }
    }
    • Estoy totalmente de acuerdo en que el uso de un cuadro de texto va a ser propenso al error y realmente complicar el manejo de errores. El uso de componentes como @NeilA mencionado sería una buena idea. Usted todavía podría tener un área de texto o algo así que a la salida de la expresión final si desea mostrar al usuario en una forma textual. Probablemente la mejor manera de no disponer de ellos de edición que, a pesar de que.
  4. 5

    Estás preparando para el fracaso por dos razones principales:

    1. De análisis de texto gratis desde el usuario es DURO.
    2. Escribir analizadores en Java es algo engorroso

    De problemas 1. es o va a empujar a la difusa dominio de la PNL, para lo cual puede utilizar una herramienta como OpenNLP o algo de ese ecosistema. Debido a la gran cantidad de formas sutilmente diferentes, el usuario puede escribir las cosas que usted encontrará su pensamiento sesgo hacia un sistema más formal de la gramática. La fabricación de este trabajo va a terminar en un DSL tipo de solución, o tendrás que diseñar su propio lenguaje de programación.

    He tenido resultados razonables usando Scala analizador de combinadores para analizar tanto el lenguaje natural y más formalizado gramáticas. Los problemas son los mismos, pero el código que debe escribir para resolverlos es más legible.

    Parte inferior de la línea, incluso si usted está pensando en una regla muy simple lenguaje, vas a encontrar que subestiman la cantidad de escenarios que usted tiene que probar. NeilA es derecho de los consejos para reducir la complejidad mediante la creación de una interfaz de usuario adecuada para cada tipo de regla. No trates de ser demasiado genérico, o que va a explotar en la cara.

  5. 5

    Si usted está buscando algo más ligero que cae la baba, pero con una funcionalidad similar puede comprobar http://smartparam.org/ proyecto. Permite almacenar los parámetros de las propiedades de los archivos, así como en la base de datos.

  6. 3

    En lugar de construir su propio motor de reglas, usted puede ser que desee considerar el Abrir de la Fuente de N-CUBO de motor, un Java de código Abierto motor de reglas que utiliza Groovy como Lenguaje Específico de Dominio (DSL).

    Es un secuencial motor de reglas frente a un no-secuencial motor de reglas como una RED basada en el motor de reglas. El beneficio de un secuencial motor de reglas es que es mucho más fácil de depurar las reglas. Tratando de descifrar inferencias a partir de grandes conjuntos de reglas puede ser muy difícil, pero con un secuencial motor de reglas como el N-CUBO, el seguimiento de las reglas es muy similar a la siguiente secuencial de código ‘lógica’.

    N-CUBO se ha incorporado en el soporte para Tablas de Decisión y Árboles de Decisión. Las Tablas de Decisión y Árboles dentro de N-CUBO de permitir que los datos o el código a ejecutar dentro de las células, muy parecida a la de un multi-dimensional de Excel. El ‘macro’ de idioma (DSL) es Groovy. Al escribir el código dentro de una célula, no es necesario definir un paquete de instrucción, de las importaciones, un nombre de clase, o de la función de todo esto se agrega para usted, haciendo que el DSL fragmentos de código fácil de leer /escribir.

    Esta regla motor está disponible en GitHub en https://github.com/jdereg/n-cube.

  7. 2

    Lugar de textArea, proporcionar es como una caja de opción para fijados por el estado(PATIENT_TYPE) y los operadores fijos() y que se hará con él.
    De todos modos puede controlar la aplicación web parece.

  8. 2

    Una simple regla de motor se puede construir sobre los cierres, yo.e en Groovy:

    def sendToOutPatient = { ... };
    
    def sendToInPatient = { ... };
    
    def patientRule = { PATIENT_TYPE ->
        {'A': sendToOutPatient,
         'B': sendToInPatient}.get(PATIENT_TYPE)
    }
    
    static main(){
        (patientRule('A'))()
    }

    Podría definir sus reglas como los cierres, reutilización/reasignar ellos o incluso construir un DSL sobre ellos.

    Y Groovy puede ser fácilmente integrado en Java, por ejemplo:

    GroovyShell shell = new GroovyShell(binding);
    binding.setVariable("foo", "World");
    System.out.println(shell.evaluate("println 'Hello ${foo}!';));
    • gracias por tu ejemplo, pero no creo que se dirige a mi problema. Mi objetivo es dar al usuario una manera fácil de especificar las reglas. Si otra persona, y o no, y operadores matemáticos – esto es sólo el dominio.
    • Cae la baba parece impresionante. Sin embargo, me gustaría advertir a @Jay a la investigación a fondo y tomar el tiempo para entender que antes de comprometerse. He visto muchos ejemplos de devs «la pintura sí mismos en las esquinas» con marcos de trabajo como este. Se empieza bien, usted consigue su caso de uso sencillo trabajo. Un par de meses abajo de la línea, tiene su cliente querer algo ayer, pero que están atrapados en un laberinto de un marco. Dicho esto, yo también soy un gran fan de la no re-inventar la rueda. La pregunta es: se cae la baba con una rueda, o es un motor de jet y OP realmente sólo necesita una rueda de goma?
    • JIC le sea de utilidad, un ejemplo de Groovy DSL: Log4j DSL. Martin Fowler es un defensor de la DSL y interfaces fluidas, incluso había escrito un libro sobre ellos.
  9. 2

    Esto es lo que yo haría. Puedo crear un conjunto de regex variables, dependiendo de la correspondencia, I código de la lógica de negocio. Si el conjunto de reglas va complejo que esto, me gustaría ir para apache commons CommandLineParser la aplicación en el servidor.

    Pero usted puede usar interfaz gráfica de usuario /HTML y un conjunto de listas desplegables y sub menús desplegables. De esa manera usted puede hacer consultas de base de datos con claridad.

  10. 1

    Como código de análisis con Java sólo es una implementación de suicidio, puede que desee escribir un simple compilador mediante Jflex y CUP, que son de la versión de Java de GNU FLEX y YACC. De esta manera usted puede generar quesitos con Jflex (un token es una palabra clave como IF, ELSE etc), mientras que la COPA se consumen los token con el fin de ejecutar el código.

  11. 1

    Tener una buena conversación con sus usuarios, les está preguntando por qué esto debe ser configurable, y lo que los cambios en la configuración que esperan para venir. Averiguar lo que los próximos cambios son ciertos, probables, posibles remotamente, extremadamente raro. Y la rapidez con la que tendría que ser implementado. Para cada cambio, iba a escribir una pequeña publicación de la actualización de ser aceptable o no?

    Con esta cantidad de la necesaria flexibilidad en la mente, evaluar la opción de rodar su propia solución contra de la incorporación de un motor completo. «Prueba» de su solución simple en contra de los próximos escenarios de cambio por escrito brevemente cómo cada cambio sería implementado. Es muy bueno si algunas raro escenarios de gran costo. Si es probable que los escenarios son demasiado costoso, sin embargo, es mejor elegir una solución más genérica.

    Como de las opciones a tener en cuenta, me gusta tanto cae la baba y la sugerencia de escribir su propio. Una tercera opción: Cuando financiero de la implementación de un paquete de inscripción anuales actualizaciones legales, hemos tenido muy buen éxito de aplicación de las normas en el código, pero dejando a sus ajustes configurables en las tablas sql. Así que, en su caso, que podría significar una tabla algo como esto:

    patient_type | admission_type | inpatient_or_outpatient
    -------------------------------------------------------
    'A'          | 'O'            | 'Outpatient'
    'B'          | NULL           | 'Inpatient'

    (Nuestras mesas tienden a tener una fecha desde y una fecha-la validez de las columnas que permiten al usuario hacer cambios de fase)

    Si usted acaba de escribir un DSL, echa un vistazo a http://martinfowler.com/books/dsl.html que ofrece descripciones minuciosas de los varios enfoques.
    Como una advertencia: en su Q y Una sección de Martin Fowler escribe:

    Así es este el gancho – la gente de negocios escribir las reglas?

    En general, yo no lo creo. Es un montón de trabajo para hacer un ambiente
    que le permite a la gente a escribir sus propias reglas. Usted tiene que hacer
    una cómoda herramienta de edición, herramientas de depuración, herramientas de prueba, y así sucesivamente.
    Usted obtiene la mayor parte de los beneficios de la empresa frente Dsl haciendo lo suficiente para
    permitir a los empresarios a ser capaz de leer las reglas. A continuación, pueden
    la revisión de los mismos para la exactitud, hablar de ellos con los desarrolladores y
    proyecto de cambios para los desarrolladores para implementar correctamente. Llegar Dsl a ser
    negocios legible es mucho menos esfuerzo que el negocio de la escritura, pero
    los rendimientos de la mayoría de los beneficios. Hay momentos en los que vale la pena hacer
    el esfuerzo para hacer que el Dsl de negocios-escritura, pero es una más
    avanzado objetivo.

  12. 0

    La implementación de un motor de reglas es no trivial. Un significativo basado en las reglas del sistema tiene un motor de inferencia que es compatible tanto con encadenamiento hacia adelante y hacia atrás en cadena, así como la primera extensión y profundidad en primer lugar las estrategias de búsqueda. Fácil de Reglas tiene nada de esto, simplemente ejecuta todas las reglas de una vez y sólo una vez. Cae la baba apoya hacia adelante y hacia atrás de encadenamiento, y afaik también apoya primero la profundidad y la amplitud de la primera. Se explica aquí.

    Desde mi experiencia, cae la baba es la única significativa del Motor de reglas para java. Tiene sus limitaciones. Debo decir, que he utilizado cae la baba 5+ años.

Dejar respuesta

Please enter your comment!
Please enter your name here