2010-09-22 8 views
13

tengo que crear un programa para un tipo de proces complejas. Bueno, el proceso no es complejo, pero hay muchas variables que controlan el proceso. No puedo describir en detalle el proceso, así que hice uno, que tiene la misma carga de IF:Cómo puedo estructurar un programa (proces) con un número muy elevado de instrucciones IF

el proceso es: ¿deberíamos detener el horno de fusión de hierro o no? tenemos esos parámetros: si la temperatura sube por encima de 800 grados centígrados, basta Excepto cuando se espera que el agua fría que estará disponible del horno 2 en los próximos 20 minutos, podemos continuar

Excepto, cuando la temperatura aumenta 10 grados en los próximos 10 minutos, no podemos esperar otros 10 minutos para el agua fría, entonces tenemos que parar.

Excepto que cuando la temperatura baja por alguna razón a 790-800 grados durante 5 minutos, agregamos 5 minutos adicionales al tiempo que necesitamos el agua fría adicional.

Excepto que cuando la temperatura baja por alguna razón a 780-790 grados durante 5 minutos, agregamos 5 minutos adicionales al tiempo que necesitamos el agua fría adicional.

etc etc

toda Puede pensar en otra 20, excepto/si/entonces es

en nuestro proceso tenemos> 50 situaciones, todo por un objetivo: si la parada de la máquina o no.

Debo decir que normalmente no tengo tantas situaciones para un objetivo/problema (a saber: detener la máquina o no), y también es de tiempo limitado: si esto está sucediendo durante 10 minutos, entonces ...., y tenemos que calcular la situación cada minuto nuevamente.

¿Hay una manera de programar esto de una manera inteligente?

(y también prueba de unidad, porque tenemos montones y montones de combinaciones que son todas las pruebas unitarias separadas supongo?)

+0

¿Está "Excepto" un objeto o significa como de costumbre en inglés? Porque veo algo así como "stop it Except", "continue Except" y "Except, when the temp ..." – vodkhang

+0

@ vodkhang: creo que se olvidó de unos pocos períodos. – Joren

+2

Como en inglés habitual, léelo como 'do a, excepto cuando esto sea cierto, luego haz b, excepto cuando c hace algo durante 10 minutos, luego haz c, etc. – Michel

Respuesta

6

Algunos espacios problemáticos no encajan en el principio OOP muy elegantemente. Parece que su situación puede manejarse mucho mejor en un paradigma basado en reglas (especialmente cuando las reglas cambian). Aquí hay un resumen de un marco basado en reglas para .NET: http://www.codeproject.com/KB/cs/Drools_NETPrimer.aspx

+0

Podría estar equivocado, pero no puedo evitar sentir que eso solo está cambiando el problema a las reglas. Como la parte de la pregunta de OP es solo comenzar o detenerse, entonces probablemente terminarías con las mismas reglas que ya tenía como declaraciones. – eglasius

+0

El problema que veo con las construcciones If es el mantenimiento y la comunicación con los ingenieros. En mi experiencia, las especificaciones de la máquina generalmente se expresan como reglas basadas en el estado y se debe preferir implementar un mecanismo para convertir esas reglas proporcionadas lo más cerca posible del dominio. Puede ser mucho más fácil incluso habilitar a los ingenieros para cambiar las reglas basadas en entornos cambiantes dado un modelo sólido para todos los participantes (por ejemplo, motor/refrigerador ...) sin cambiar los detalles de implementación de la aplicación. – MrDosu

+0

Estoy de acuerdo con MrDosu. La legibilidad del código usando if constructs será difícil. Las reglas son 'planas' en el sentido de que no necesita apilar los if anidados para comprender el impacto de una regla. – stombeur

7

En lugar de trabajar manualmente todas las situaciones en las que debe detener el horno en función de su Conociendo cómo funciona un horno, podrías hacer que la computadora lo haga por ti.

intenta programar un modelo de cómo funciona un horno y en cada punto de tiempo se puede ejecutar una simulación de lo que sucederá en los próximos 10 minutos más o menos. Si la simulación muestra que pronto ocurrirá un problema grave, puede detener el horno ahora; de lo contrario, déjelo funcionar durante un minuto, lea las entradas y vuelva a ejecutar la simulación.

Codificación un modelo preciso requerirá un poco de esfuerzo, pero como su requisito de cambio ligeramente (por ejemplo, se ha actualizado o reparado su exceso) será relativamente fácil de actualizar el modelo - en el mejor de los casos que acaba de modificar los parámetros del modelo o actualizar una sola fórmula.

Con su enfoque actual, si modificó ligeramente el horno, primero tendría que calcular manualmente los efectos que tendrá, y luego pasar por todo el código línea por línea actualizando las diferentes condiciones.


En cuanto a las pruebas unitarias - idealmente debería comprobar si el modelo de datos de un auténtico horno en una variedad de situaciones y comprobar que su simulación predice los resultados medidos reales (con un poco de tolerancia permitida por imprecisiones de lectura).Si esto no es posible, puede codificar algunos escenarios de ejemplo y el resultado esperado (por ejemplo, sobrecalentamiento) y probar que la simulación predice correctamente el resultado.

+0

+1 pero eso va a ser un cambio serio de estrategia y si ya están escribiendo código probablemente sea demasiado tarde – annakata

+0

esta respuesta se está hundiendo en mis cerebros en este momento, cómo construir un modelo así – Michel

+0

@Michel: necesitas tener alguna comprensión de cómo funciona el horno. Si la temperatura es actualmente de 400 ° C y la configura para calentar a 500 ° C, la temperatura no cambia instantáneamente.Si puede encontrar una fórmula que describa la tasa de cambio de temperatura, puede usarla para predecir la temperatura en 1 minuto, 2 minutos, etc. Si no conoce la fórmula, puede ver algunos datos reales y encontrar una fórmula eso le da un buen calce, o puede pedirle a alguien que entienda los procesos físicos para ayudarlo a obtener una fórmula. –

2

+1 bump Respuesta de MrDosu en motores de reglas. Un motor de reglas simple como el motor de reglas WF puede ser suficiente para lo que necesita. Siempre que use .NET 3.0+ puede usar esto programáticamente sin usar flujos de trabajo.

EDITAR: pruebas unitarias esto debería ser fácil, pero laborioso para crear todos los escenarios para probar. Los datos (una clase) que envía como entrada al motor de reglas es el estado actual del escenario. Cree un número de estados o escenarios y envíelos al motor de reglas en una prueba unitaria. O se podría combinar varios estados, uno tras otro en una sola unidad de prueba para probar una progresión lógica

Edit2: algo de código fuente para usar WF conjuntos de reglas

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ServiceModel.Description; 
using System.Xml.Schema; 
using System.Workflow.Activities.Rules; 
using System.Workflow.ComponentModel.Serialization; 

namespace ServiceMediation.Behaviors 
{ 
    public class TransformingMessageServiceBehavior : IServiceBehavior 
    { 
     private string _ruleSetPath = null; 
     private RuleSet _ruleSet = null; 

     public TransformingMessageServiceBehavior(string ruleSet) 
     { 
      if (!string.IsNullOrWhiteSpace(ruleSet)) 
      { 
       _ruleSetPath = ruleSet; 
       WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer(); 
       XmlTextReader reader = new XmlTextReader(_ruleSetPath); 
       RuleDefinitions rules = serializer.Deserialize(reader) 
        as RuleDefinitions; 
       _ruleSet = rules.RuleSets[0]; 
      } 
     } 
... 

y luego algo así como

RuleValidation validation = new RuleValidation(typeof(EvaluationData), null); 
RuleExecution exec = new RuleExecution(validation, data); 
_ruleSet.Execute(exec); 

con EvaluationData = los datos que da como entrada. Las reglas se escriben a esta información. También sirve como resultado de salida, verifica el resultado de ejecutar el conjunto de reglas en una propiedad de los datos.

+0

Nunca he pensado en utilizar el motor de reglas de WF para escenarios de reglas más simples que excluyan los flujos de trabajo. Voy a criticar inmediatamente un poco el código: D. Gracias – MrDosu

+0

@Steven - gracias por el formateo. No sabía que era solo una cuestión de sangrado. ¡Gracias! – stombeur

+0

Simplemente comienza una línea de código con 4 espacios y listo ;-) – Steven

4

en la forma en que está razonando sobre el problema se asemeja mucho a una máquina de estado.

Así que es más sobre los estados de modelado y lo que puede hacer en cada uno de ellos. WF fue mencionado para un uso diferente (en realidad su conjunto de reglas), pero me gustaría ver más en los flujos de trabajo basados ​​en el estado, ya que allí se puede enfocar en cada uno de esos estados y cómo puede hacer la transición entre ellos.

Cuestiones relacionadas