Шаблоны GUI Framework?

Мы разрабатываем среду встроенного типа и обнаруживаем, что нам нужно создать собственную структуру пользовательского интерфейса.

Я делал это раньше, но мне интересно провести небольшое исследование общих шаблонов проектирования для фреймворков.

Типы вещей, которые я считаю шаблонами (несколько далеко идущие):

  • Виджет Фокус / расфокусировка
  • Виджет Анимация
  • Обмен данными между элементами
  • Присоединение команд к виджетам
  • Состояние сохранения (MVC?)

Что вы рекомендуете для чтения по шаблонам GUI Framework?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
2 634
6

Ответы 6

У меня есть два для вас, обратный вызов или уведомление, может быть, это то, что вы называете «прикреплением команд к виджетам», вы хотите каким-то образом реагировать на изменения состояния в вашем элементе пользовательского интерфейса. Контроллер должен быть проинформирован о том, что произошло изменение.

Какао / UIKit имеет шаблон, который называется «Делегирование», и уведомления для этого, другие используют функции или объекты обратного вызова (Java Swing) или «сигналы и слоты» (QT).

Я очень полезный шаблон, который не встречается в дикой природе очень часто, - это возможность предотвращать изменение состояния, самый простой вариант использования для этого - проверка ввода, вы хотите предотвратить потерю фокуса из виджета, когда текст в виджете не согласны с тем, что вы ожидаете. Раньше в Windows Forms это было для некоторых элементов, но не для всех, Cocoa может это сделать. Этого можно достичь, используя возвращаемые значения или ссылочные параметры (или указатели) в обратных вызовах, где вызываемый объект может связываться с исходным виджетом.

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

Шаблон Gang of Four Decorator также иногда используется для расширения возможностей виджета, делая что-то прокручиваемое, что можно сделать с помощью декоратора. Все зависит от того, насколько далеко вам нужно будет зайти с элементами пользовательского интерфейса. Удачи, это непростая задача

EDT: применяйте MVC везде, где можете. Первыми кандидатами являются любые виды списков, не возлагайте на них ответственность за сохранение элементов, которые они отображают. Это определенно относится к полю со списком, списку, таблицам и деревьям, вы можете реализовать это для текстового ввода, но это может не окупить накладных расходов.

Некоторые вещи, которые я узнал, помогая разрабатывать SingStar PS3

  • Это помогает разделить логику компонентов (как работает кнопка) и визуальную логику (как визуализировать изображение). Это особенно приятно, когда вы придумываете совершенно новый способ визуализации чего-либо, и он прозрачно работает с вашими старыми кнопками управления.
  • Настройте гибкий способ привязки источника данных в своем приложении к странице, полной компонентов, чтобы одни и те же компоненты могли отображать все песни на одной странице или все фотографии на другой. Вот где MVC пришел на помощь SingStar
  • Модели отправки / получения событий (например, вы подписываетесь на нажатие кнопки) - довольно хороший способ привязать макет страницы к вашему коду. Если вы не будете осторожны, из него могут получиться спагетти.
  • Не изобретайте другой язык программирования для описания вашей логики, ваш текущий язык программирования, вероятно, подойдет.
  • Обдумайте шаги при переходе с одной страницы на другую. Во многом это связано с использованием памяти, но может быть момент, когда либо загружаются две страницы, либо никакие страницы не загружаются. Подумайте о межстраничном общении здесь.
  • Данные управляют макетом вашей страницы. Разрешите горячую замену макета (нажмите клавишу, чтобы перезагрузить его со своего компьютера), так как вы будете интенсивно повторять его.

Изучите XAML, особенно привязки.

Microsoft проделала действительно хорошую работу над чистым языком XML для описания макета графического интерфейса, и если вы используете упрощенную версию XAML для описания своего пользовательского интерфейса, вы сможете использовать их инструменты для дизайнеров для создания макетов пользовательского интерфейса.

Несколько советов по классическим паттернам проектирования; Я думаю, это связано с построением графического интерфейса:

  • Шаблон MVC очевидно.
  • Образец наблюдателя; например, View должен наблюдать за моделью (чтобы знать, когда ее состояние изменяется), а Controller должен наблюдать за View (чтобы знать, когда нажимается кнопка).
  • Шаблон стратегии; в некотором смысле использование контроллера в качестве связующего звена между представлением и моделью означает выбор стратегии. Теоретически вы должны иметь возможность прозрачно переключать контроллер.
  • Составной узор; Ваше представление похоже на дерево панелей, виджетов и так далее. Наличие общего интерфейса и способа перебора этой коллекции полезно, когда вам нужно вызвать что-то вроде "view.paint ()".

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

У вас есть требования / особые потребности для вашей структуры? Вы, вероятно, захотите потерять пару «хороших принципов», если ваша целевая платформа ограничена в памяти / процессоре.

Паттерн Цепочка командования.

Пример в контексте графического интерфейса:

interface IWidget
{
    bool HandleEvent(Event event); // returns true if event was handled
                                   // or false if event was ignored
}

class Button : IWidget
{
    public override bool HandleEvent(Event event)
    {
        switch(event.Type)
        {
            case EventType.MousePressed: DoStuff(); return true;
            case EventType.MouseScrolled: return false;
        }
    }
}

Здесь Buttons не заботятся о событиях прокрутки, поэтому они позволяют своим родителям (цепочка подчинения) обрабатывать их. Итак, если у вас есть кнопка, например, HTML-страница, и пользователь прокручивает кнопку, это обрабатывается родительским виджетом (представление HTML), и вся страница прокручивается.

Для примера реального использования в Qt framework смотрите bool QWidget :: event (QEvent *) и документация по фильтрам событий.

См. Также: Шаблоны проектирования в KDE. KDE - это кроссплатформенная коллекция объектно-ориентированных библиотек и программного обеспечения C++ с открытым исходным кодом, очень популярная в качестве среды рабочего стола Linux. Это слайды с конференции KDE 2003 года.

Иногда может пригодиться Внедрение зависимости.

Другие вопросы по теме