2011-07-21 11 views
5

En REST - revertable DELETE se dio una buena introducción sobre cómo cambiar los cambios de estado en REST. Básicamente, si tiene un recurso con un campo estado, simplemente coloca una nueva versión de ese recurso con una actualización estado campo.REST - transiciones de estado del modelo

En este tema, me gustaría extender este modelo. Digamos que tiene un recurso que puede estar en dos estados: 1 y 2. En contraste con el modelo simple como se describe en la publicación citada, hay tres transiciones para atravesar del estado 1 al estado 2, en lugar de solo uno.

Mi pregunta es: ¿cómo modelizarías las transiciones de estado en REST?

yo mismo no puedo pensar en un POST de RPC-similares, que no es muy probable que RESTian:

POST http://server/api/x 
    target_state=2&transition=3 

Esta cambios en los recursos x del estado 1 al estado 2 mediante el uso de transición 3.

Respuesta

2

Esto no está limitado a REST; es más una pregunta básica sobre las máquinas de estado. La máquina de estado debe encapsular todo el estado, de modo que si se encuentra creando múltiples transiciones de un estado a otro, y la diferencia es significativa, entonces esa diferencia también se debe capturar en el estado.

Por ejemplo, supongamos que no tengo un hogar. Puedo pasar del estado "sin hogar" al estado "hogar" de tres maneras: puedo rentar uno, puedo comprar uno, puedo robar uno. ¿Tres transiciones de "sin hogar" a "hogar"? No en el mundo de las máquinas. O las diferencias son significativas, o no lo son. Si no lo son, entonces para la máquina no tiene sentido hacer una distinción en absoluto. Simplemente, PONGA el nuevo estado de "hogar". Si lo son, entonces necesitamos expandir nuestro concepto de estado para abarcar las diferencias. Por ejemplo:

  homeless 
     A A A 
    / | \ 
     V  |  V 
possessor <--|--- renter 
     A  | /
     \ | /
     V V V 
      owner 

Puedo pasar de ser una persona sin hogar al poseedor al robar una casa. Si me agacho lo suficiente, podría ser el dueño. O podría quedar sin hogar y alquilar una casa, o incluso alquilar con opción a compra. O podría comprar uno directamente. Las tres rutas me llevan al estado "propietario", pero usan estados intermedios para representar las transiciones significativamente diferentes.

Si quiere representar "sin hogar" frente a "en un hogar" (poseedor | inquilino | propietario), no hay problema para exponer eso como un recurso de solo lectura y calculado por derecho propio. Simplemente no permita que nadie lo PONGA/PUBLIQUE, ya que la transición es ambigua. Tampoco hay problema para mantener el historial de transiciones de estado como un conjunto adicional de recursos, si ese estado es significativo.

+0

En primer lugar, muchas gracias por su respuesta detallada. Muy genial. Pero todavía no estoy realmente convencido de que cada transición se pueda modelar fácilmente como un estado. Creo que hay una gran diferencia entre estados intermedios y estados permanentes. Cubriste el segundo grupo. Sobre el primer grupo, un ejemplo: digamos que puede atravesar de personas sin hogar a poseedores de 3 maneras: usted paga por ello, lo hereda o lo gana en una lotería. ¿También vas a modelar esto como estados separados? ¿Esto no conduce a una explosión de estados simplemente por representar diferentes transiciones como estados? ¿Cómo ve eso? –

+0

[Por "poseedor" quise decir "robado". Si pagas o ganas en una lotería, estás en el estado "propietario".] Si a tu aplicación le importa qué camino tomar, entonces sí, debes emplear estados intermedios, crear estados terminales nuevos, o agregar estado adicional (como un recurso para la hipoteca) para representar las diferencias. – fumanchu

+0

Muy bien, tiene sentido. Solo temo una explosión de estados "virtuales", generada por el producto cruzado de todas las transiciones posibles. –

Cuestiones relacionadas