¿Cómo puedo separar la interfaz de usuario de la lógica de negocios mientras mantengo la eficiencia?

16

Digamos que quiero mostrar una forma que representa 10 objetos diferentes en un cuadro combinado. Por ejemplo, quiero que el usuario elija una hamburguesa de 10 diferentes que contienen tomates.

Como quiero separar la UI y la lógica, tendría que pasar la forma de una representación en cadena de las hamburguesas para mostrarlas en el cuadro combinado. De lo contrario, la interfaz de usuario tendría que profundizar en los campos de objetos. Luego, el usuario tomaría una hamburguesa del cuadro combinado y la enviaría al controlador. Ahora el controlador tendría que encontrar otra vez dicha hamburguesa en función de la representación de cadena utilizada por el formulario (¿quizás una identificación?).

¿No es eso increíblemente ineficiente? Ya tenías los objetos de los que querías escoger. Si envió al formulario todos los objetos y luego devolvió un objeto específico, no tendría que volver a encontrarlo más adelante, ya que el formulario ya devolvió una referencia a ese objeto.

Además, si me equivoco y realmente debería enviar todo el objeto al formulario, ¿cómo puedo aislar la IU de la lógica?

    
pregunta Uri 28.12.2011 - 02:23

2 respuestas

30

En primer lugar, el ejemplo que proporcionó no es increíblemente ineficiente; Es solo un poco ineficiente; Su ineficiencia está por debajo del nivel perceptible. Pero, en cualquier caso, sigamos con la pregunta.

De la forma en que lo entiendo, cuando hablamos de separación de UI y lógica , queremos decir evitar el acoplamiento cercano .

Cerrar acoplamiento se refiere a la situación en la que la interfaz de usuario conoce (e invoca) la lógica, y la lógica conoce (e invoca) la interfaz de usuario. Para evitar el acoplamiento cercano, no es necesario recurrir a la eliminación total del acoplamiento. (Eso es lo que parece apuntar al demoler la interfaz entre ellos hasta una interfaz de cadena de mínimo denominador). Todo lo que hay que hacer es emplear acoplamiento suelto .

Acoplamiento suelto significa que A conoce B, pero B no lo sabe A. En otras palabras, las dos partes involucradas juegan al cliente y servidor roles, donde el cliente conoce el servidor, pero el servidor no conoce al cliente.

En el caso de la interfaz de usuario y la lógica, la mejor manera de arreglar esto en mi opinión es ver la lógica como un servidor y la interfaz de usuario como un cliente. Por lo tanto, la interfaz de usuario está diseñada para la lógica, tiene conocimiento de la lógica e invoca la lógica, mientras que la lógica no sabe nada acerca de la interfaz de usuario, y simplemente responde a las solicitudes que recibe. (Y estas solicitudes provienen de la interfaz de usuario, pero la lógica no lo sabe).

Para ponerlo en términos más prácticos, en ningún lugar dentro de los archivos de código fuente de la lógica debería encontrar alguna declaración de inclusión / importación / uso que se refiera a archivos de la interfaz de usuario, mientras que los archivos de código fuente de la interfaz de usuario estarán llenos de incluir / Importar / usar declaraciones que se refieren a archivos de Logic.

Por lo tanto, para volver a su caso, no hay absolutamente nada de malo en el hecho de que el código UI que llena el combo-box sabe acerca de la clase de hamburguesas. Habría un problema si la clase de hamburguesas supiera algo acerca de los cuadros combinados.

Por cierto, este diseño permite otra cosa que debería esperar de un sistema de este tipo: debería ser posible conectar tantas interfaces de usuario diferentes como desee a la lógica, y todo debería seguir funcionando.

    
respondido por el Mike Nakis 28.12.2011 - 11:49
4

Debes separar cada pieza del Modelo, Ver & Controlador, pero no hay ninguna razón por la que no pueda (por ejemplo) pasar objetos de Modelo entre el Controlador y la Vista.

Entonces, en su caso, los objetos Hamburger serían parte del Modelo. A continuación, utiliza su Controlador para obtener la lista requerida de Hamburger s, y pase esos objetos a la Vista (cuadro combinado) para mostrar. Cuando su usuario haya seleccionado qué hamburguesa, puede volver a pasar el objeto Hamburger al Controlador para su procesamiento.

El punto es que aún puede probar la lógica "fetch Hamburger s" y la lógica "process Hamburger " por separado de la visualización real de las hamburguesas.

    
respondido por el Dean Harding 28.12.2011 - 02:35

Lea otras preguntas en las etiquetas