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

LeechCraft: открытый модульный интернет-клиент

Георгий Рудой, Московский физико-технический институт;
Олег Линкин, Министерство Обороны Республики Беларусь

LVEE 2011

LeechCraft, the open source modular cross-platform internet client written in C++/Qt, is reviewed mostly from the technical perspective. Design decisions are described as far as solutions of the problems faced during development and arising from the modular nature of the application. Other aspects of open development are also briefly considered, such as building a community or future goals. The paper should be of high interest to those developing highly modular applications or general open source projects.

LeechCraft — это открытый модульный кросс-платформенный интернет-клиент. LeechCraft ориентирован на выполнение типичных пользовательских задач, связанных с интернетом, в том числе:

  • просмотр веб-страниц;
  • чтение лент новостей;
  • скачивание файлов;
  • обмен мгновенными сообщениями.

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

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

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

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

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

Однако, помимо упомянутых преимуществ, поставленная задача реализации конечной функциональности при помощи слабо зависящих друг от друга модулей создает ряд проблем, часть из которых связана со статичной природой выбранного языка реализации (C++) и отсутствием в нем полноценной поддержки RTTI и какого-либо Reflection. Например, при реализации вышеупомянутого модуля поддержки скриптовых плагинов необходима возможность во время выполнения приложения определять используемые другими модулями протоколы взаимодействия друг с другом, так как прямое добавление информации о соответствующих протоколах на этапе написания кода либо на этапе компиляции противоречит принципу слабого связывания. Возможности интроспекции, предоставляемые фреймворком Qt, позволяют успешно решить эту проблему при условии соблюдения простых правил при написании модулей.

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

presentation