Реализация пошагового обновления GUI

268
28 января 2017, 08:40

Допустим необходимо реализовать следующую фичу. У меня есть GUI приложение со своей бизнес логикой. Модель довольно нетривиальная, и я хочу внедрить так называемый дебагинг. Другими словами, я хочу отслеживать изменение модели пошагово (например по нажатию клавиши F10). Хотел бы спросить, какое самое адекватное решение данной проблемы существует? На данный момент вижу два потенциальных решения:

  1. Вынесение работы с моделью в отдельный поток (при включенном режиме отладки, после каждого оповещения об изменении, поток с моделью замирает, дабы gui могла обновиться, по нажатию f10 - поток просыпается)
  2. Реализация на базе создания еще одного внутреннего цикла обработки сообщений (на каждом оповещении об изменении модели, мы создаем новый цикл посредством Dispatcher.PushFrame, и отключаем возможность изменения модели)

Не хочется городить велосипед, может уже существуют зарекомендовавшие себя подходы?

Answer 1

Мне кажется, устоявшийся подход — отлаживать программу по частям.

Когда вы тестируете вашу модель, вам всё равно, есть ли у вас UI. Вы просто подаёте на вход значения, запускаете модель, и убеждаетесь, что она выдаёт нужный результат. (Возможно, это стоит автоматизировать в виде юнит-тестов.) И вы можете вполне смотреть значение ваших переменных в отладчике, UI вам для этого не нужен.

Когда вы тестируете бизнес-логику/VM, в простых случаях вы тоже можете просто пройти нужные куски под отладчиком, вам не нужно для этого UI. В сложных случаях (например, много асинхронные событий, на которые отладчик влияет не лучшим образом) заведите адекватный логгинг.

Для тестирования UI, проще всего разбить сложный UI на отдельные контролы (UserControl, DataTemplate и т. п.), и тестировать их по отдельности на тестовом приложении.

Если вы замечаете, что у вас для отладки бизнес-логики нужно дождаться реакции UI, у вас что-то неправильно в архитектуре: ваша бизнес-логика частично находится в UI-уровне! (Пример: у вас связаны две VM через Binding в UI. Это плохо и неправильно.) Убедитесь, что бизнес-логика бежит нужным образом и в отсутствие UI. Это ликвидирует проблемы с отладкой, и улучшит модульность вашего приложения.

READ ALSO
Ввод ФИО в один TextBox, маска

Ввод ФИО в один TextBox, маска

Подскажите пожалуйста, можно ли реализовать, и если да, то как, такую затеюTextBox, в нём маска на ввод трёх слов - ФИО

509
UPDATE Command для DataAdapter

UPDATE Command для DataAdapter

Допустим, имеется DataTable t1 с полями f1,f2,f3 и нужно, что бы DataAdapter произвел вот такое обновление на реальной БД:

364
Вывод html элементов в ASP .NET MVC 5

Вывод html элементов в ASP .NET MVC 5

при выводе строке вида str="строка1 <br/> строка2 " выводится строка целиком с отображением <br/>, те

448
Составной ключ в Dictionary

Составной ключ в Dictionary

Допустим, есть класс, у которого есть 2 цифровых поля

427