понедельник, 23 мая 2011 г.

Web-фреймворки и XMPP-боты

Тут как то в сидел, и думал для некоторых вещей написать бота на Python. И почему-то у меня всплыла мысль о том, почему нет фреймворков для написания ботов.
В процессе опроса juick'овчан, выяснилось, что такую попытку делали, и взяли за пример Flask, с его структурой. И почему то, мне эта идея очень понравилась.
А ведь правда, если рассмотреть поближе. Ведь зачастую, боты выполняют самые различные задачи, и зачастую могут иметь очень сложную структуру, которая еще больше усложняется тем, что сам по себе протокол XMPP довольно сложен, и так сходу написать структуру бота без поллитра - банально сложно.

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

Что может дать нам фреймворк? Фреймворк может скрыть event-систему внутри, от разработчика, предоставив интерфейс для работы с ней. Основной задачей разработчика бота является создание функций, которые будут обрабатывать те или иные команды, не отвлекаясь на внутреннюю реализацию. Разработчик должен писать код, который будет вызываться по некоторым событиям. Чем не реализация MVC для веб-фреймворка? Очень похоже на систему роутинга. Только вместо URL, мы имеем контекст события и команду. Те же Action выполняют код, а при помощи шаблонизатора можно удобно генерировать ответ на запросы.

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

Мысли немного скомканы, но надеюсь более менее понятны. =)