coding style - ¿Es posible incrustar el contenido textual UML de caso de uso de estilo Cockburn en la base de código para mejorar la legibilidad del código?
coding-style readability (2)
Creo que esta es una variación del Patrón del Mediador de los Patrones de Diseño (Banda de los Cuatro), así que diría que es una forma válida de hacerlo. En el Patrón, discuten que la complicada interacción entre los controles es la razón para usarlo.
Editar: Enlace a Mediator en Wikipedia
experimentando con casos de uso Cockburn en el código
Estaba escribiendo un código de UI complicado. Decidí emplear casos de uso de Cockburn con peces, cometas y niveles del mar (discutido por Martin Fowler en su libro ''UML Distilled''). Envolví casos de uso de Cockburn en objetos estáticos de C # para poder probar condiciones lógicas contra constantes estáticas que representaban pasos en un flujo de trabajo de IU. La idea era que pudieras leer el código y saber lo que estaba haciendo porque los objetos envueltos y sus contenidos públicos te daban casos de uso de INGLÉS a través de espacios de nombres.
Además, iba a usar el reflejo para bombear mensajes de error que incluían los casos de uso descritos. La idea es que el seguimiento de la pila podría incluir algunos pasos del caso de uso de la interfaz de usuario en inglés ... Resultó ser una forma divertida de lograr un mini idioma de dominio ligero pero sin tener que escribir un compilador de DSL. Entonces mi pregunta es si esta es o no una buena manera de hacer esto. ¿Alguien ha hecho alguna vez algo similar?
c # ejemplos de fragmentos siguen
Supongamos que tenemos una página aspx que tiene 3 controles de usuario (con muchas cosas clicables). El usuario debe hacer clic en cosas en un control de usuario particular (posiblemente haciendo algún tipo de selección) y luego la IU debe indicarle al usuario que la selección fue exitosa. Ahora, mientras se selecciona ese elemento, el usuario debe navegar a través de una vista en cuadrícula para buscar un elemento dentro de uno de los otros controles del usuario y luego seleccionar algo. Esto suena fácil de administrar, pero el código puede ponerse feo.
En mi caso, el usuario controla todos los mensajes de eventos enviados que fueron capturados por la página principal. De esta manera, la página actuó como un procesador central de eventos de IU y podría hacer un seguimiento de lo que sucede cuando el usuario hace clic.
Entonces, en la página principal de aspx, capturamos el primer evento de control de usuario.
using MyCompany.MyApp.Web.UseCases;
protected void MyFirstUserControl_SomeUIWorkflowRequestCommingIn(object sender, EventArgs e)
{
// some code here to respond and make "state" changes or whatever
//
// blah blah blah
// finally we have this (how did we know to call fish level method?? because we knew when we wrote the code to send the event in the user control)
UpdateUserInterfaceOnFishLevelUseCaseGoalSuccess(FishLevel.SomeNamedUIWorkflow.SelectedItemForPurchase)
}
protected void UpdateUserInterfaceOnFishLevelGoalSuccess(FishLevel.SomeNamedUIWorkflow goal)
{
switch (goal)
{
case FishLevel.SomeNamedUIWorkflow.NewMasterItemSelected:
//call some UI related methods here including methods for the other user controls if necessary....
break;
case FishLevel.SomeNamedUIWorkFlow.DrillDownOnDetails:
//call some UI related methods here including methods for the other user controls if necessary....
break;
case FishLevel.SomeNamedUIWorkFlow.CancelMultiSelect:
//call some UI related methods here including methods for the other user controls if necessary....
break;
// more cases...
}
}
}
//also we have
protected void UpdateUserInterfaceOnSeaLevelGoalSuccess(SeaLevel.SomeNamedUIWorkflow goal)
{
switch (goal)
{
case SeaLevel.CheckOutWorkflow.ChangedCreditCard:
// do stuff
// more cases...
}
}
}
Por lo tanto, en el espacio de nombres MyCompany.MyApp.Web.UseCases podríamos tener un código como este:
class SeaLevel...
class FishLevel...
class KiteLevel...
Los casos de uso del flujo de trabajo integrados en las clases pueden ser clases internas o métodos estáticos o enumeraciones o lo que sea que le proporcione el espacio de nombres más limpio. No puedo recordar lo que hice originalmente pero entiendes la imagen.
Nunca lo he hecho, pero a menudo he pensado en escribir código en estilo UC, con la ruta principal de éxito primero y las extensiones incluidas como excepciones a continuación. No he encontrado la excusa para hacerlo. Me encantaría ver a alguien probarlo y codificar, incluso si después del experimento concluimos que es horrible, todavía será interesante probarlo y consultarlo.