Как мне согласованно организовать модули для настольного приложения PyGTK?

StackOverflow https://stackoverflow.com/questions/216093

Вопрос

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

  • application.py - содержит основной класс приложения (большинство функциональных подпрограмм)
  • gui.py - содержит слабо связанную реализацию GTK gui.Обрабатывает обратные вызовы сигналов и т.д.
  • command.py - поддерживает функции автоматизации командной строки, не зависящие от данных в классе приложения
  • state.py - содержит класс сохраняемости данных состояния

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

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

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

РЕДАКТИРОВАТЬ I

Хорошо, итак, замечание принято относительно всего, что касается MVC.У меня действительно есть грубое приближение MVC в моем коде, но, по общему признанию, я, вероятно, мог бы получить некоторый опыт, дополнительно разделив модель и контроллер.Тем не менее, я читаю документацию python-gtkmvc (кстати, это отличная находка, спасибо, что ссылаетесь на нее), и у меня сложилось впечатление, что это не столько решит мою проблему, сколько просто формализует ее.Мое приложение представляет собой один файл glade, как правило, одно окно.Поэтому, независимо от того, насколько жестко я определяю роли MVC модулей, у меня все равно будет один модуль контроллера, делающий почти все, что у меня есть сейчас.По общему признанию, я немного не разбираюсь в правильной реализации MVC, и я собираюсь продолжать исследования, но мне не кажется, что эта архитектура извлечет еще что-то из моего основного файла, она просто переименует этот файл в controller.py .

Должен ли я думать об отдельных парах Контроллер / Вид для отдельных разделов окна (панель инструментов, меню и т.д.)?Возможно, это то, чего мне здесь не хватает.Похоже , что это то , что С.Лотт ссылается на это в своем втором пункте.

Спасибо за ответы на данный момент.

Это было полезно?

Решение

В проекте Вейдер мы используем Python gtkmvc, что значительно упрощает применение шаблонов MVC при использовании pygtk и Glade, вы можете увидеть файловую организацию нашего проекта в SVN-репозиторий:

wader/
  cli/
  common/
  contrib/
  gtk/
    controllers/
    models/
    views/
  test/
  utils/

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

Вероятно, это не имеет ничего общего с PyGTK, а скорее является общей проблемой организации кода.Вероятно, вам будет полезно применить некоторые шаблоны проектирования MVC (модель-представление-контроллер).Видеть Шаблоны проектирования, например.

«содержит основной класс приложения (большинство функциональных процедур)»

В единственном числе - один класс?

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

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

  1. Прежде чем делать что-либо еще, выполните рефакторинг на компоненты, параллельные объектам реального мира.Непонятно, что находится в вашем «state.py» — правильная ли это модель объектов реального мира или просто сопоставление между постоянным хранилищем и какой-то неясной структурой данных в приложении.Скорее всего, вы перенесете обработку из своего приложения в свою модель (возможно, state.py, возможно, новый модуль, который является подходящей моделью).

    Разбейте модель на части.Он поможет организовать элементы управления и просмотра.Самая распространенная ошибка MVC — слишком много контроля и ничего в модели.

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

Извините, что отвечаю так поздно. киви мне кажется, гораздо лучшее решение, чем gtkmvc.Это моя первая зависимость для любого проекта pygtk.

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

myapp/
  application/
  gui/
  command/
  state/

Где каждый каталог имеет свой собственный __init__.py.В качестве примера вы можете просмотреть любое приложение Python или даже модули стандартной библиотеки.

Итак, не получив ответа относительно моей правки к исходному вопросу, я провел еще несколько исследований, и вывод, к которому я, кажется, прихожу, заключается в том, что ДА, я должен разбить интерфейс на несколько представлений, каждое со своим собственным контроллером.Python-gtkmvc предоставляет возможность для этого, предоставляя glade_top_widget_name параметр для конструктора представления.Все это, кажется, имеет большой смысл, хотя это потребует масштабного рефакторинга моей существующей кодовой базы, который я могу захотеть провести, а могу и не захотеть в ближайшей перспективе (я знаю, я знаю, я следует.) Более того, мне остается задаться вопросом, должен ли быть просто один объект Model (мое приложение довольно простое - не более двадцати пяти переменных состояний) или мне следует разбить его на несколько моделей и иметь дело с контроллерами, наблюдающими за несколькими моделями и объединяющими уведомления по цепочке между ними.(Опять же, я знаю, что я действительно следует сделайте последнее.) Если у кого-нибудь есть какие-либо дополнительные соображения, я все еще не чувствую, что получил ответ на первоначальный вопрос, хотя теперь у меня есть направление, в котором нужно двигаться.

(Более того, кажется, что у них должны быть другие архитектурные варианты под рукой, учитывая, что до сих пор я не видел ни одного приложения Python, закодированного в стиле MVC, но опять же, многие приложения Python, как правило, имеют точную проблему, которую я описал выше.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top