no deja de ser una cuestión de práctica y la autodisciplina. Quiero decir, todos lo hemos hecho. Y todos seguimos haciéndolo de vez en cuando bajo las condiciones incorrectas (gerente/cliente gritando para hacer algo "en este momento" frente a "correcto", etc.).
Una cosa que hago al escribir código para conducir la IU (más en el lado web, pero lo mismo se aplica) es preguntarme a mí mismo con cada unidad de código (una sola línea, un condicional, un bucle, etc.) si ese fragmento de código depende de la presencia de la IU. Si escribo en un cuadro de texto, eso depende de la interfaz de usuario, por lo que va allí. Pero si estoy calculando el resultado que irá en ese cuadro de texto, esa es probablemente la lógica comercial.
Otro enfoque (como ChrisW aludió mientras estoy escribiendo) es desarrollar la lógica primero en una biblioteca de clases que no sean UI. Pon toda la lógica que puedas (sin embargo, usa tu juicio sobre lo que define la "lógica") que no depende de las bibliotecas basadas en la interfaz de usuario. Luego crea la interfaz de usuario para hacer uso de esa lógica. Existen diferentes enfoques para permitir el desarrollo simultáneo de estas dos piezas, como anular el ensamblaje lógico detrás de las clases de interfaz y simplemente codificar las piezas de UI en esas interfaces (luego usar la inyección de dependencia para conectar las clases de ensamblaje a las interfaces), etc.
Gracias - Creo que este es un buen punto de partida práctico para ayudarme a pensar de la manera correcta. – Andy