Это действительно просто вопрос практики и самодисциплины. Я имею в виду, мы все сделали это. И мы все время от времени продолжаем делать это в неправильных условиях (менеджер / клиент кричит, чтобы что-то было сделано «прямо сейчас» против «правильно» и т. Д.).
Одна вещь, которую я делаю, когда пишу код для управления пользовательским интерфейсом (больше на веб-стороне, но применимо то же самое), это спрашивать себя с каждой единицей кода (одна строка, условие, цикл и т. Д.) зависит ли этот кусок кода от наличия пользовательского интерфейса. Если я пишу в текстовое поле, это зависит от пользовательского интерфейса, так что он идет туда. Но если я вычисляю результат, который попадет в это текстовое поле, это, вероятно, бизнес-логика.
Другой подход (на который ссылался ChrisW во время набора текста) - сначала разработать логику в библиотеке классов без пользовательского интерфейса. Добавьте туда как можно больше логики (используйте свое суждение относительно того, что определяет «логику»), которая не зависит от библиотек на основе пользовательского интерфейса. Затем создайте пользовательский интерфейс, чтобы использовать эту логику. Существуют различные подходы, позволяющие одновременно разрабатывать эти две части, такие как создание заглушки логической сборки за классами интерфейса и просто кодирование частей пользовательского интерфейса в эти интерфейсы (затем использование внедрения зависимостей для подключения классов сборки к интерфейсам) и т. Д.