siria resumen hoy guerra force explicacion empezó cómo conflicto comenzo combined combatientes civil 21st oop design-patterns

oop - hoy - guerra de siria resumen 2018



¿Cómo usar el patrón de estado correctamente? (8)

He encontrado algunas implementaciones de patrones de estado en mi experiencia de programación, y he hecho algunas. Los he visto usar en varios escenarios (principalmente UI y análisis sintáctico). El problema es que todos ellos, bajo la presión de un desarrollo rápido, se convirtieron en trozos de código difícilmente comprensibles y fáciles de mantener. Estoy considerando refaccionar uno de estos, pero estoy teniendo problemas para encontrar buenos recursos para esto en línea. Hay muchos ejemplos simples de State Pattern en línea, pero necesito algunos más recursos en profundidad.

Entonces estoy buscando:

  • Ejemplos de trampas comunes al implementar un patrón de estado y cómo evitarlos,
  • Ejemplos del mundo real del patrón de estado hecho correctamente (como en algún proyecto / marco de código abierto)
  • Las experiencias personales con el patrón de estado también son bienvenidas

Gracias por tu tiempo


Entonces estoy buscando:

  • Ejemplos de trampas comunes al implementar un patrón de estado y cómo evitarlos,

El patrón de estado no escala bien. Imagínese una máquina de estado con 10 estados y 10 tipos de transición diferentes. Agregar un nuevo estado significa que el estado tiene que definir las 10 transiciones. Agregar una nueva transición significa que los 10 estados deben definirla. En resumen, no use el patrón de estado si su máquina de estado no es estable y / o tiene muchos estados / transiciones.

  • Ejemplos del mundo real del patrón de estado hecho correctamente (como en algún proyecto / marco de código abierto)

Definir correctamente :-) El ejemplo de Java citado en https://.com/a/2707195/1168342 es para JSF Lifecycle, pero creo que solo hay una transición. Ninguna de las otras respuestas cita nada para el Estado.

  • Las experiencias personales con el patrón de estado también son bienvenidas

Head First Design Patterns usa un ejemplo de máquina Gumball para ilustrar el estado. Es irónico, pero cada vez que extienden el diseño (agregando un nuevo estado o transición), hay un montón de código repetido (especialmente para las transiciones inválidas dentro de estados específicos). Además, de acuerdo con quién decide cuál es el siguiente estado, las clases de estados individuales se pueden acoplar entre sí (dependencias entre estados). Consulte la explicación al final de esta respuesta: https://.com/a/30424503/1168342 .

El libro de GoF menciona que las alternativas basadas en tablas tienen ventajas, a saber, su regularidad. Cambiar los criterios de transición requiere cambiar la tabla (y no el código).


@Ivan: hay una serie de recursos disponibles en la web para Hierarchical State Machines (HSM). Miro Samek ha escrito extensamente sobre este patrón de diseño y ofrece mucha información útil.

Algunos artículos que deberían ser de interés:

El gran beneficio de usar HSM sobre los gráficos de estado FSM planos descritos por Mealy y Moore es que la jerarquía crea una separación de responsabilidades. Los estados secundarios solo necesitan manejar aquellas condiciones para las que están expresamente diseñados: los eventos no administrados se pasan al estado principal, si el estado principal no está diseñado expresamente para manejarlo, entonces se pasa al siguiente nivel superior. padre y así sucesivamente Le permite crear máquinas de estado pequeñas y manejables que tienen un único propósito, una que puede caber dentro de un solo objeto. A medida que se agregan nuevas características, o cuando se agregan nuevas clases, solo necesitan manejar su propia pequeña parte del mundo y transmitir los eventos no controlados a sus respectivos padres.

Cuando se implementa correctamente, obtiene un programa robusto con baja complejidad ciclomática, que es fácil de modificar o actualizar según sea necesario.


Debe usar el patrón de estado, si tiene un comportamiento diferente para cada estado. Quizás necesites reconfigurar las transiciones en tiempo de ejecución. Otra razón para usarlo es que quizás deba agregar más estados más adelante.

Imagine un juego de tablero como las damas chinas, tiene diferentes estados de GUI para elegir un peón, seleccione un espacio de destino, etc. En cada estado, la GUI debe comportarse de manera diferente, algunas entradas deben ser manejadas y otras ignoradas. Es posible usar un interruptor / caja simple, pero el patrón de estado es útil ya que la lógica está encapsulada, el código relacionado es el mismo. Esto facilita la introducción de nuevos estados sin afectar a la mayoría de los demás estados (dependiendo de quién sea el responsable de establecer las transiciones: o bien el estado conoce sus transiciones salientes, o bien podrían darse en tiempo de ejecución, por ejemplo, utilizando el constructor).

Como puede ver en este ejemplo , el GuiController utiliza una interfaz IGuiState para cambiar su comportamiento a pedido. Una implementación se puede ver aquí .

El principal inconveniente es utilizar el interruptor / caja, cuando necesita flexibilidad. Dado que la indirección toma un poco más de tiempo, lo recomendaría para una cantidad fija de declaraciones bastante simples. Tengo que implementar un protocolo de red de bajo nivel bastante rápido, que suele ser muy costoso.


Estoy construyendo un evaluador de expresiones que tiene la capacidad de evaluar conjuntos de elementos. Encontré que el patrón de estado es muy útil para discriminar lo que se puede y no se puede hacer a un conjunto dependiendo de su estado. es decir: abierto, cerrado, inactivo, activo ect. Los FSM son muy fáciles de dibujar y reducen la complejidad del código al eliminar la necesidad de grandes bloques de declaraciones ifelse para definir qué debe hacer la característica dependiendo de sus atributos adjuntos. Hace que estas condiciones sean más explícitas al convertir las condiciones en clases. Es uno de mis patrones favoritos hasta ahora.


La mayoría de las veces, los estados en un diseño de patrón de estado manejan más de un estado (o subestados del estado) lo que los hace más difíciles de mantener.

Si un estado tiene algún tipo de selección, se trata principalmente de más de un estado.

Tomo mucha disciplina para mantener limpios a los estados.

Una posible solución a esto es crear estados más complejos statemachines (HSM). Esto lo hace mucho más legible en el nivel superior porque tiene que lidiar con menos estados.


Solo mis 2 centavos, el patrón de estado siempre resulta difícil de mantener, ya que es difícil de entender para quienes no lo han codificado. Por lo general, me reincorpo a la matriz estándar anterior de punteros de función / método, como lo hice en mi antigua experiencia en C. Usted acaba de construir una matriz de dos dimensiones de indicadores de función con estado / señal para líneas / columnas. Más fácil de entender. tienes una clase que administra eso y tú delegas a otra clase para manejar la complejidad ...

my2c


eche un vistazo a la máquina de estados finitos . Casi todos los lenguajes maduros tienen buenos ejemplos propios. Como no ha especificado su idioma preferido, le daré un ejemplo de C ++: Boost FSM library . Lo más probable es que sea mucho más complicado de lo que necesita, pero puede darle algunos consejos de diseño para asegurarse


Como probablemente haya leído, el patrón de diseño de estado es útil cuando el estado varía el comportamiento de algún objeto cuya composición incluye ese estado. Esto implica la idea de una clase abstracta del State , una interfaz o un tipo enumerado , aunque también depende del lenguaje que Duck Typing hará, que define cualquier comportamiento común y / o métodos requeridos.

Aspectos clave

En realidad, hay dos aspectos clave a considerar al trabajar con el patrón de estado: enumeración y transición. La enumeración simplemente significa identificar el conjunto de estados posibles (por ejemplo, días de la semana) o más abstractivamente los tipos de estados (es decir, metaestados) como inicio, finalización y en el medio para un motor de flujo de trabajo. Transición significa decidir cómo modelar el movimiento entre estados donde esto normalmente se hace capturando todas las transiciones posibles en una representación tabular (es decir , máquina de estados finitos ) o hace que cada estado conozca sus posibles "transiciones" a otros estados.

Por lo general, las transiciones van de la mano con los metaestados porque no es posible conocer todos los estados y las relaciones por adelantado en un sistema tan dinámico donde los estados nuevos, y por lo tanto las transiciones, se pueden agregar en tiempo de ejecución. Además, con el enfoque de transición, cierto comportamiento-notificaciones por ejemplo-se convierte en parte de la transición, en lugar del estado mismo.

Ejemplos

Hay varios escenarios en los que he trabajado o discutido cuando esta es una instalación de uso:

  1. Flujo de trabajo
  2. Juego de computadora oponente AI
  3. Orquestación de procesos

Por flujo de trabajo me refiero a algo así como jBPM . Los sistemas de este tipo se preocupan por controlar la atención adecuada de las personas adecuadas en el momento adecuado. Por lo general, envían muchos correos electrónicos u otro tipo de notificación. Y, el proceso que representan necesita la capacidad de cambiar a medida que la organización cambia, mientras que los datos que se administran normalmente cambian mucho más lentamente.

Juego de computadora El oponente AI se explica por sí mismo. No es algo que haya escrito, pero en una conversación con quienes lo han hecho, estos sistemas suelen ser autónomos. En otras palabras, a diferencia del flujo de trabajo, el juego generalmente no tiene la capacidad de alterar el proceso utilizado para controlar a los oponentes de la computadora.

Process Orchestration es similar al flujo de trabajo, pero se enfoca en la integración del sistema, en lugar de la interacción de las personas. El marco Apache Mule es un ejemplo. Aquí el estado puede describir el estado (por ejemplo, iniciado, en proceso, finalizado) y el tipo (por ejemplo, punto de integración ftp, punto de integración sql).

Conclusión

A diferencia de otras respuestas, creo que la encapsulación de estado es una excelente manera de gestionar el cambio en los sistemas de software. Hecho bien, facilita esos cambios o permite a los usuarios hacerlo en tiempo de ejecución. Usted hace una compensación de más flexibilidad a cambio de una mayor complejidad de implementación. Entonces, tal enfoque probablemente no sea útil para el carro de compras, por ejemplo, donde el comportamiento es probablemente muy conocido y no le gusta cambiar. Por otro lado, cuando el proceso está sujeto a cambios, encaja muy bien.