Как разработать модульное приложение?

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

Вот некоторый контекст, чтобы понять, откуда я родом и чего я пытаюсь достичь...


Мой проект будет небольшим приложением, которое будет использовать веб-сервисы и отображать результаты различными способами, в том числе:

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

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

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

У меня большой опыт разработки с помощью drupal, который имеет мощный модульный подход, но также не использует объектно-ориентированный дизайн. , поэтому я подозреваю, что для python дизайн drupal может быть не оптимальным решением.

Если это имеет какое-то значение, ядро ​​будет изначально разработано для GNU/Linux.

Заранее спасибо за ваше время!


person mac    schedule 08.12.2009    source источник


Ответы (5)


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

Я бы начал разработку с разделения проблем. Основные архитектурные слои:

  • Проблемная область (также известная как Engine, Back-end): классы предметной области, которые выполняют всю фактическую работу, имеют знания предметной области, реализующие поведение предметной области.
  • Постоянство: управление хранилищем для классов предметной области, уровень базы данных/файловой системы
  • Пользовательский интерфейс: графический интерфейс, который взаимодействует с классами предметной области.
  • Системные интерфейсы: общение с другими системами, например. сети, веб-сервисы

Классы предметной области выполняют работу, но ничего не знают о пользовательском интерфейсе. Уровень постоянства знает о классах предметной области достаточно для сохранения/загрузки по мере необходимости. Уровень системного интерфейса абстрагирует внешние системы, что позволяет вам подключать симулятор во время тестирования. В идеале пользовательский интерфейс должен использовать MVC для максимальной гибкости.

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

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

person gavinb    schedule 08.12.2009
comment
Потребовалось 1+ лет, чтобы решить, что это лучший ответ. Но вот! Отмечено как принятое сегодня! ;) - person mac; 13.07.2011
comment
Спасибо, лучше поздно, чем никогда! - person gavinb; 16.07.2011

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

И чтобы доказать, что API хорош, вы должны написать второй и третий плагин, потому что тогда вы обнаружите, что сделали много предположений при написании первого. Обычно все немного проясняется после выполнения 2-го и 3-го шагов.

Теперь вам нужно написать еще один плагин, потому что последние написанные вами плагины похожи на первый по типу, входным данным и представлению (может быть, еще один погодный веб-сервис). Выберите что-то совершенно другое, с совершенно другими данными, и вы увидите, что ваш API все еще слишком адаптирован. (В противном случае вы хорошо поработали!)

person MicSim    schedule 08.12.2009
comment
Спасибо за это (+1). На самом деле ваш ответ очень похож на один из пунктов, приведенных в презентации Google, на которую MYYN ссылается в своем ответе! :) - person mac; 08.12.2009

Ну, наверное, первое, с чего нужно начать, это сесть и выяснить, что может понадобиться плагину для выполнения его задачи.

Вы хотели бы рассмотреть два основных аспекта в вашем дизайне.

  • Как ваш фреймворк будет передавать запросы/получать ответы от плагина?
  • Какие вспомогательные классы или модули было бы полезно предоставить?

И, вероятно, также, поскольку это звучит как учебный проект.

  • Что вы хотите написать сами, а что просто взять из существующей библиотеки?

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

person Adam Luchjenbroers    schedule 08.12.2009
comment
Спасибо за ваш ответ (+1). Некоторые дополнительные моменты: (1) Как ваша структура будет передавать запросы/получать ответы от подключаемого модуля, вероятно, является основной темой моего вопроса. Я привык к системе, для которой ядро ​​вызывает хуки во всех зарегистрированных модулях, но я делаю это процедурно, и мне было интересно узнать, как это сделать в ООП. Есть намеки на это? (2) Это учебный проект [значение: я делаю это для удовольствия, для собственного обучения]. Основное направление для меня — модульная конструкция. Я рад использовать библиотеки для таких частей, как графические данные, всплывающие окна уведомлений и т. д. - person mac; 08.12.2009
comment
(3) Моя идея состоит в том, чтобы ядро ​​уже поставлялось с некоторыми базовыми модулями, предоставляющими примеры услуг. Так что я воспользуюсь вашим советом по использованию API самостоятельно! :) - person mac; 08.12.2009
comment
Re 1,2: Одним из решений было бы создание класса PlugIn, который будет использоваться в качестве базового класса для всех плагинов. Он должен предоставлять реализации по умолчанию для всех ваших «хуков» (или бросать NotImplemented для обязательных хуков), которые затем могут быть переопределены плагином. - person Adam Luchjenbroers; 09.12.2009

  • тщательно разработайте API для своего приложения (Как разработать хороший API и почему это важно)
  • сделать все, что можно использовать независимо, модулем, затем сгруппировать и построить большие части из простых частей (KISS)
  • не повторяйся (СУХОЙ)
  • часто писать/публиковать краткую документацию для себя и других (мантра с открытым исходным кодом)...
person miku    schedule 08.12.2009
comment
Спасибо за ответ (+1). Парень в видео немного многословен [он начинает с того, что тема не подходит для кратких презентаций... но я не согласен с этим!], но дает конкретные советы, которых я постараюсь придерживаться! :) - person mac; 08.12.2009

Посмотрите на шаблон слушатель-подписчик. Рано или поздно ваше приложение станет настолько сложным, что вам потребуется реализовать обратные вызовы. Когда вы достигнете этого предела, используйте listener-subscriber (есть реализация в wxPython).

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

person wisty    schedule 08.12.2009
comment
Спасибо за это (+1). Я искал в GoF паттерн Observer (который, как я заметил, теперь также известен как Publish-Subscribe). Тогда я изучу тему «слушатель-подписчик». Выглядит многообещающе! - person mac; 08.12.2009