Программирование с графическим интерфейсом пользователя - это представление данных и обработка сложных взаимодействий. Программист GUI обычно занимается не UX и дизайном, а их реализацией. А это непростая задача. Чтобы понять, почему, давайте исследуем проблемы программирования с графическим интерфейсом. Я сгруппирую проблемы для большей ясности.

Пожалуй, наиболее очевидной является категория визуальное. Он включает сложные макеты, стили, анимацию и переходы. По моему опыту, реализация макетов и стилей часто может быть раздражающей и сизифовой, но не такой сложной. С другой стороны, сложно выразить сложные анимации и переходы.

Еще одна проблема - это ограничения внутри и между элементами графического интерфейса. Яркий пример - формы. Некоторые поля должны принимать только определенные виды содержимого. Содержание одних полей может влиять на другие поля. В зависимости от содержимого всех полей форма должна соответствующим образом реагировать. Добавьте асинхронные запросы, а также отзывы об ошибках, и у вас возникнет серьезная проблема.

Отзывчивость включает оптимистичные обновления, предварительную выборку, кеширование и обратную связь с пользователем о текущем состоянии графического интерфейса. Целью быстрого реагирования является минимизация воспринимаемых периодов загрузки и передача пользователю текущего состояния графического интерфейса. Оптимистичное обновление графического интерфейса означает действовать так, как если бы ответ асинхронного API был успешным. Сложная часть - это возврат, когда фактический ответ оказывается неудачным. Обработка дальнейших оптимистичных обновлений, пока запрос API еще не завершен, тоже непросто. Предварительная выборка позволяет сразу же отображать некоторые данные, когда пользователь переключается на другое представление. Когда выполнять предварительную выборку и как передать данные следующему представлению, - нетривиальные вопросы. Кэширование может быть очень сложным, и кеширование в программировании с графическим интерфейсом ничем не отличается.

Даже с приведенной выше оптимизацией требуется обработка состояний загрузки и сбоя. Вы не можете рассчитывать на постоянное подключение. В зависимости от требований многие компоненты должны иметь возможность отображать индикатор загрузки и обратную связь об ошибках. Отзыв об ошибке, скорее всего, будет зависеть от типа полученной ошибки. Для некоторых ошибок имеет смысл разрешить пользователю повторить попытку самостоятельно. Возможность инструментировать графический интерфейс (или его API) для наблюдения за тем, как он справляется с медленной загрузкой и ошибками, чрезвычайно полезна, но ее нелегко достичь. Как видите, обработка ошибок может быть сложной.

Следующая проблема - одна из самых сложных: асинхронность. Асинхронность участвует во взаимодействии пользователей, таких как клики, обработка сигналов с устройств (например, IoT), управление анимацией и, что наиболее важно, обмен данными с удаленными API или API с высокой задержкой. Координация нескольких взаимозависимых запросов при правильной обработке ошибок может нервировать. Вдобавок к этому асинхронность открывает дверь в условия гонки, которые, как известно, трудно предотвратить.

Управление государством и распространение изменений, вероятно, являются самыми сложными задачами. Они являются всеобъемлющими, поскольку участвуют почти в каждой части реализации графического интерфейса пользователя и глубоко влияют на подходы ко всем ранее упомянутым проблемам. Цель состоит в том, чтобы правильно отразить изменения данных во всем графическом интерфейсе. Если дело было пропущено, могут отображаться устаревшие данные. Противодействие устареванию может привести к выходу за рамки допустимого и обновлению графического интерфейса пользователя, когда он не нужен. Для правильной логики обновления может потребоваться много шаблонного кода. Функциональность отмены / повтора делает все еще сложнее.

За последние годы произошли значительные инновации с точки зрения инструментов, фреймворков, библиотек и парадигм - и нет никаких признаков замедления. Тем не менее, даже имея в руках идеальные инструменты, эти проблемы остаются. Вот почему программирование с графическим интерфейсом является захватывающим.