Организация приложения с графическим интерфейсом - PullRequest
9 голосов
/ 23 января 2009

Это будет общий вопрос.

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

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

Пример:

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

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

Теперь компонент редактора фиксирует нажатия клавиш. Он должен иметь доступ к сопоставлениям клавиш, которые являются сеансами, поэтому ему нужен доступ к сеансу. Является ли соединение редактора с сессией хорошей идеей? Другим компонентам также потребуется доступ к сочетаниям клавиш, поэтому сеанс теперь становится общим и может быть одноэлементным ...

Есть ли хорошие отзывы о разработке приложений с графическим интерфейсом, выходящие за рамки MVC?

Это Python и wxPython, FWIW.

[РЕДАКТИРОВАТЬ]: добавлен конкретный вариант использования.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2009

Извините, что так поздно задал этот вопрос, но ничего, я имею в виду ничто не может сравниться с источником приложения, которое делает что-то подобное. (Я мог бы порекомендовать что-то вроде http://pida.co.uk,, но существует множество расширяемых IDE wx + Python, поскольку это звучит как то, что вы делаете).

Если бы я мог сделать несколько заметок:

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

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

  3. Для сочетаний клавиш я склонен использовать какую-то систему «действий». Действия - это вещи высокого уровня, которые пользователь может делать, например: «Сохранить текущий буфер», и они могут быть удобно представлены в пользовательском интерфейсе с помощью кнопок панели инструментов или пунктов меню. Таким образом, ваши скрипты / плагины создают действия и регистрируют их с помощью чего-то центрального (например, какой-то объект реестра - см. 1 и 2). И их участие на этом заканчивается. Кроме того, у вас есть какая-то служба привязки ключей, которая сопоставляет ключи с действиями (которые перечислены в реестре, за сеанс или иным образом). Таким образом, вы добились разделения кода плагина и связывания клавиш, разделения редактора и кода действия. В качестве дополнительного бонуса ваша задача «Конфигурирование ярлыков» или «Пользовательские карты клавиш» стала особенно легкой.

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

2 голосов
/ 23 января 2009

Если вы смотрели на MVC, вы, вероятно, движетесь в правильном направлении. MVC, MVP, пассивный просмотр, контролирующий контроллер. Это все разные способы, каждый со своими плюсами и минусами, для достижения того, что вы ищете. Я считаю, что пассивное представление является «идеальным», но оно заставляет вас вводить слишком много виджетов в свои интерфейсы GUI (т.е. IInterface). В целом я считаю, что Supervising Controller - это хороший компромисс.

1 голос
/ 23 января 2009

В MVC материал модели является общим состоянием информации.

Элемент управления - это общее состояние настроек управления графическим интерфейсом и реакции на щелчки мышью и что-то еще.

Ваш угол сценария может

1) Обновление объектов модели. Это хорошо. Элемент управления может быть «наблюдателем» объектов модели, а представление может быть обновлено для отражения наблюдаемых изменений.

2) Обновить объекты управления. Это не так хорошо, но ... Объекты Control могут затем внести соответствующие изменения в модель и / или представление.

Я не уверен, в чем проблема с MVC. Не могли бы вы предоставить более подробный пример дизайна с конкретными проблемами или проблемами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...