2008-09-15 15 views
6

A menudo necesito implementar algún tipo de sistema de reglas que sea editable por el usuario - los requisitos son generalmente lo suficientemente diferentes como para que el mismo sistema no sea directamente aplicable, por lo que con frecuencia me encuentro con el mismo problema - ¿cómo diseño un sistema de reglas que¿Buenas referencias/consejos para diseñar sistemas de reglas?

  1. es mantenible
  2. equilibra adecuadamente expresividad con la facilidad de uso
  3. se puede ampliar fácilmente (si/cuando me sale (2) mal).

Creo que los sistemas de reglas/DSL son extremadamente valiosos, pero no me siento cómodo con mi capacidad para diseñarlos correctamente.

¿Qué referencias/sugerencias tiene para ofrecer que pueden ayudar a hacer esto más fácil?
Debido a la naturaleza de los problemas que encuentro, los idiomas existentes generalmente no son aplicables. (Por ejemplo, podría no requerir que los usuarios de computadoras generales aprenden Python para escribir un filtro de correo electrónico). De forma similar, la regla idiomas, como JESS, son solo una solución parcial, ya que algunas necesidades de interfaz de usuario (más simples) para ser construido sobre el lenguaje de reglas para que los no programadores puedan hacer uso de él. Esta interfaz invariablemente implica eliminar algunas características, o hacer que esas características sean más difíciles de usar, y que process presenta los mismos problemas descritos anteriormente.

Editar: Para aclarar, la pregunta es sobre diseñando un motor de reglas, no estoy buscando un motor de reglas pre-construidos. Si sugiere un motor de reglas, explique cómo aborda la pregunta sobre cómo tomar buenas decisiones de diseño.

Respuesta

0

Una cosa que he encontrado es que la posibilidad de definir reglas como los árboles de expresión hace que la implementación tanto más simple. Como mencionaste correctamente, los requisitos de proyecto a proyecto son tan diferentes que tienes que volver a implementarlos todo el tiempo. Los árboles de expresión junto con algo así como el patrón de visitante crean un marco expresivo muy (sin juego de palabras) que es fácilmente extensible. Y puede colocar fácilmente una GUI muy dinámica sobre los árboles de expresiones que cumpla con ese aspecto de su requerimiento.

Espero que esto no suene como si dijera que todo parece un clavo con mi martillo porque ese no es el caso ... es solo que en mi experiencia, esto ha sido útil más de una vez :-)

+0

No estoy seguro de entender la aplicabilidad de los árboles de expresión. ¿Los está sugiriendo como un aspecto del intérprete de lenguaje de reglas, o los usa para representar las opciones para cada regla? Estoy un poco confundido. – rcreswick

0

En primer lugar, normalmente no se recomienda dejar que los usuarios finales definan las reglas. Esto se debe a que no tienen antecedentes de desarrollo y simplemente pueden escribir "código" que entra en ciclo infinito o hace otras cosas extrañas.

Entonces, o el sistema tiene que protegerse contra ese tipo de comportamiento (por lo tanto, haciéndolo más complejo), acepta tal posibilidad o no permite que los usuarios finales hagan esto.

Si está trabajando con .NET, es increíblemente fácil crear su propia DSL extendiendo el compilador Boo (es decir, con Rhino.DSL puede tener DSL simple con una clase).

2

Tuvimos una demostración en la casa de esta herramienta por su proveedor: http://www.rulearts.com/rulexpress.php

Como empresa, tenemos una gran cantidad de experiencia con motores de reglas (por ejemplo CleverPath Aion), sino instrumentos mayormente orientado al desarrollador. Esta herramienta (rulexpress) está orientada a las personas de negocios. No es un motor de reglas. Pero puede generar todos los datos en xml (básicamente, cualquier formato que desee), y esto es algo que luego consideraríamos como entrada para un motor de reglas real, p. Windows Workflow Foundation (no es uno de los motores de reglas más grandes/mejores, pero aún así).

La herramienta en sí misma se veía bastante bien, algo que nunca había visto en ninguna herramienta orientada al desarrollador.

También hay algunas herramientas para la administración de reglas basadas en WF, si ese es el motor de reglas que prefiera, consulte InRule.


Editado después pregunta original se aclaró: Aunque he incursionado en esto hace mucho tiempo (escritura de un lenguaje poco en javacc), Me parece que es una inversión de tiempo malo ahora. Mi comentario anterior tiene el mismo espíritu: tome un motor de reglas simple, una interfaz de usuario simple (comercial) que facilite el mantenimiento de los usuarios comerciales, y solo invierta tiempo en vincular los dos.

Cuestiones relacionadas