УДК 004.053
МЕТОДИКА РАЗРАБОТКИ МОДУЛЬНЫХ ПРИЛОЖЕНИЙ НА ПОЛЬЗОВАТЕЛЬСКОМ УРОВНЕ БААБ И ПРОГРАММНАЯ РЕАЛИЗАЦИЯ В СЛУЖЕБНОЙ БИБЛИОТЕКЕ MODULES.JS
Ю.В. Трухин, аспирант (Тверской государственный технический университет, наб. Аф. Никитина, 22, г. Тверь, 170026, Россия, [email protected])
Описываются методология разработки модульных приложений на пользовательском уровне систем «Программное обеспечение как сервис» (SaaS) и реализация в служебной библиотеке modules.js. Обоснована необходимость модуляризации ПО на пользовательском уровне SaaS и рассматриваются нерешенные проблемы в существующих технологиях. В разделе, посвященном методологии разработки модульных приложений на пользовательском уровне SaaS, рассматривается набор действий по модуляризации ПО в рамках методологии. При описании программной реализации методологии рассматриваются набор основных подсистем служебной библиотеки modules.js и их применение в рамках методологии. Программная реализация позволяет создавать одностраничные приложения с динамической загрузкой и выгрузкой модулей, динамически перенаправлять запросы к масштабируемой серверной стороне и создавать специальные типы модулей для визуализации данных с использованием шаблонов данных. Подобный подход упрощает разработку сложных приложений SaaS и улучшает поддерживаемость программного кода. Ключевые слова: модульность, программное обеспечение как сервис, JavaScript, HTML, CSS.
METHODOLOGY OF MODULAR APPLICATIONS DEVELOPMENT ON THE CLIENT SIDE OF SAAS AND IMPLEMENTATION OF THE MODULES.JS FRAMEWORK Trukhin Yu. V., Postgraduate Student (Tver State Technical University, Quay Nikitin, Tver, 22, 170026, Russian Federation, [email protected]) Abstract. The paper describes the methodology of developing modular applications on the client side for systems «software as a service» (SAAS) and implementation of the modules.js framework. The paper presents the rationale for software
modularization on the SaaS client side and unsolved problems in the existing technologies. A set of actions for software modularization is considered in the section on methodology for developing modular applications on the client side of the SaaS. The section on the software implementation methodology considers a set of modules.js framework subsystems and their practical application in the methodology. Software implementation allows creating single page application with dynamic loading and unloading of modules, dynamical redirecting requests to a scalable server-side and creating specific types of modules for data visualization using data templates. This approach simplifies the development of complex SAAS applications and improves code supportability.
Keywords: modularity, software as a service, JavaScript, HTML, CSS.
С развитием вычислительной техники и средств передачи данных все большую актуальность приобретают программные системы (ПС), предоставляемые пользователю как услуга (Software as a Service, SaaS) (см. http://www.gartner.com/ it/page.jsp?id=1739214&M=6e0e6b7e-2439-4289-b697-863578323245). Основные преимущества SaaS по сравнению с традиционной установкой ПО [1]: повышение безопасности и надежности работы с данными, простота и скорость доставки ПС до пользователя, уменьшение стоимости владения и обслуживания (TCO); повышение масштабируемости. При этом ПО SaaS может быть использовано как в центре обработки данных (ЦОД) хостинг-провайдеров, так и в собственных ЦОД предприятия.
В программной архитектуре SaaS можно выделить уровни: пользовательский, серверный, доступа к данным, хранилища (http://www.progress. com/docs/whitepapers/public/SaaS/SaaS-Architectu-re.pdf). Пользовательский уровень состоит из веб-браузера и клиентского ПО, исполняющегося в веб-браузере. Для корректной работы клиентского ПО внутри различных браузеров необходимо следовать веб-стандартам консорциума W3C (http:// www.w3.org/Consortium/).
В связи с постоянным появлением новых задач, решаемых ПО, растет сложность SaaS как одного из типов ПО [2]. При проектировании сложной системы ПО необходимо разделять ее на меньшие части, каждую из которых можно уточнять независимо друг от друга и использовать повторно.
В настоящее время веб-стандарты не определяют метод разработки модульных приложений на пользовательском уровне [3]. Изначально веб-технологии в браузере предназначались для создания простых документов и авторы стандартов не предполагали их использование для создания сложных приложений. Существующие нестандартные методики и технологии, частично решающие проблему на клиентском уровне SaaS, имеют следующие недостатки:
- могут быть использованы для обеспечения модульности только одной технологии из веб-стека технологий (HTML, CSS, JavaScript), например только JavaScript (подход AMD (http://addyos-mani.com/writing-modular-js/), JavaScript Harmony);
- требуют предварительной автоматической обработки исходных текстов перед развертыванием (компиляцию), не позволяют создавать одно-
страничные приложения с контролем загрузки/выгрузки модулей в процессе исполнения ПО (БЭМ (http://ru.bem.info/));
- требуют обязательного использования шаблона проектирования, принятого в данной технологии (JavaScript MVC (http://javascriptmvc.com/)).
На практике автор статьи столкнулся с необходимостью разработки модульной технологии для пользовательского уровня SaaS при создании интеллектуальной системы хранения, обработки и анализа данных GEO4GEO [4].
В процессе работы над системой были выявлены следующие проблемы, полностью не решаемые существующими методиками на клиентской стороне SaaS:
- отсутствие поддержки отказоустойчивой масштабируемой серверной стороны в системах SaaS, a именно возможности динамического перенаправления запросов к необходимому ресурсу серверной стороны SaaS на клиентской стороне без изменения модулей;
- сложность создания одностраничных приложений с динамической загрузкой/выгрузкой модулей и контроля жизненного цикла модулей в процессе исполнения ПО;
- отсутствие поддержки модулей специализированных типов, например шаблонизаторов (вид модуля, который может принимать источник данных в качестве параметров и динамически обновлять визуализируемые в модуле данные);
- дублирование программного кода на каждой визуализируемой странице за счет полного создания разметки и программного кода на каждой странице, в том числе с повторяющимися элементами, и, как следствие, сложность поддержки и исправления ошибок; при обнаружении ошибки в элементе управления необходимо исправлять ее во всех местах использования и тестировать исправление на каждой странице. Это также приводит к нарушению принципа открытости/закрытости (программные сущности должны быть открыты для расширения, но закрыты для модификации) [5].
Рассмотренные проблемы порождают необходимость создания методики разработки модульных приложений на клиентской стороне SaaS и программной реализации. Следует заметить, что в контексте данной публикации SaaS-система - это не просто клиент-серверное приложение с клиентом-браузером, а система, которая должна масштабироваться на всех уровнях с целью обеспече-
ния и отказоустойчивости, и высокой доступности для пользователей.
В настоящей работе будут представлены методика разработки модульных приложений на пользовательском уровне SaaS и программная реализация в служебной библиотеке modules.js [6].
Методика разработки модульных приложений на пользовательском уровне SaaS
Данная методика предназначена для использования на пользовательском уровне систем SaaS, разработанных с использованием стандартизированных технологий W3C (HTML5, CSS 3, Ecma-script 5.1 и выше).
Основная задача методики - модуляризация программного кода при разработке пользовательского уровня SaaS.
Для решения задачи необходимо выполнить совокупность следующих действий.
1. Анализ предметной области и постановка пользовательских задач в рамках разрабатываемого ПО.
2. Выделение подзадач, которые необходимо решить на пользовательском уровне SaaS.
3. Определение набора модулей для решения подзадач. В качестве модуля должна рассматриваться совокупность файлов HTML (для разметки интерфейса модуля), CSS (для хранения стиля модуля), JavaScript (для хранения программного кода модуля). Принимать решение о необходимости выделения части ПО на клиентском уровне SaaS в модуль нужно исходя из правила: в модуль необходимо выделять ту и только ту функциональность, которая используется более одного раза. Применение этого правила позволит избежать создания модулей без необходимости. Операцию определения набора модулей нужно рекурсивно выполнять на каждом модуле, пока дальнейшее выделение модулей в модулях не достигнет предела. Таким образом, становятся возможными как модуляризация разрабатываемого приложения до мельчайших деталей, где вероятно дублирование программного кода, так и разработка, тестирование и повторное использование каждой детали независимо.
4. Программирование разработанных модулей и написание автоматических тестов для каждого из них. Этот этап считается выполненным, если приемочные тесты функциональности каждого модуля проходят в изолированной от приложения среде с загруженным модулем. При этом допускаются использование в тестах заглушек к серверной стороне SaaS и генерирование сообщений от других модулей, которые может обрабатывать данный модуль. Тестирование в изолированной среде позволяет добиться переносимости модулей между приложениями.
5. Разработка контейнеров для модулей и загрузчиков модулей в контейнеры (при необходимости загрузчики могут быть каскадными (загрузчик производит загрузку модуля, в процессе которой загружаемый модуль может загрузить требуемый набор модулей, каждый из которых тоже может загрузить требуемый набор модулей, и т.д.), должны управлять всем жизненным циклом модулей, в том числе с выгрузкой при необходимости модулей и самих контейнеров). В качестве контейнера в методике принимается разметка части страницы, подготовленная к загрузке модулей.
6. Тестирование разработанного приложения с помощью автоматических и ручных тестов (в том числе приемочных).
В результате применения методики будет получено модульное приложение на пользовательском уровне SaaS, а решаемые задачи декомпозированы на множество подзадач, что позволит различным разработчикам решать подзадачи и в будущем повторно использовать решения. При этом масштаб программной системы, с которой может использоваться методика, не имеет значения: методика применима как к небольшим статическим веб-сайтам без использования серверной стороны вообще, так и к сложным корпоративным программным системам, в которых пользовательский уровень выполняется на клиентской стороне в браузере.
Данная методика не зависит от конкретных служебных библиотек, но в качестве эталонной реализации используется служебная библиотека modules.js.
Программная реализация методики в служебной библиотеке modules.js
Служебная библиотека modules.js разработана для практического использования методики разработки модульных приложений на пользовательском уровне SaaS и является ПО с открытым исходным кодом. Служебная библиотека автоматизирует служебные операции, требуемые для выполнения действий 4 и 5 методики при решении основной задачи. Автоматизируются следующие служебные операции.
1. Управление загрузкой и выгрузкой компонентов приложения (функция Modules.Loader), в частности, возможность загрузки и выгрузки модулей целиком, разработанных в соответствии с требованиями служебной библиотеки (функции load, unload) [6], возможность загрузки и выгрузки компонентов модуля (функции loadHTML, unload-HTML, loadCSS, unloadCSS, loadJS, unloadJS), возможность загрузки специализированных типов модулей (в настоящее время реализована возможность загрузки шаблонов данных, функция load-Template). Все функции могут выполняться асин-
хронно. Для всех функций управления загрузкой и выгрузкой компонентов приложения есть возможность определения окончания загрузки и выгрузки, реализованная через обратный вызов и генерирование события по окончании загрузки и выгрузки. Загрузка компонентов приложения возможна только в рамках одного домена в целях предотвращения уязвимостей безопасности типа XSS [7].
2. Управление событиями модулей (функция Modules.Events). Данная часть содержит набор функций для регистрации и обработки событий, специфичных для работы с модулями, таких как события, возникающие после полной загрузки контейнера, загрузки модуля, шаблона или части модуля.
3. Управление коммуникацией с серверной стороной (функция Modules.Server). Данная часть содержит возможность создания приложений клиентского уровня SaaS, которые позволяют перенаправлять запросы модулей к серверной стороне SaaS так, чтобы от модуля не требовалось знание конкретного адреса сервера для организации запроса, а использовался относительный путь к КБ8Т-сервису. Данные о серверах конфигурации загружаются при старте клиентской стороны SaaS из конфигурационного файла json. Серверы конфигурации сообщают клиентской стороне SaaS список адресов серверов в рамках домена, готовых обработать запрос. Таким образом обеспечивается динамическое масштабирование серверной стороны без изменения программного кода модулей. Возможно также использование данной части служебной библиотеки без внедрения на серверной стороне серверов конфигурации, указав в файле конфигурации текущие адреса всех обслуживающих запросы модулей, серверов серверной стороны SaaS.
Созданная программная реализация методологии помогает разработчику SaaS решать задачу модуляризации ПО согласно методологии, описанной в данной статье, в случае разработки как простых сайтов, так и сложных масштабируемых программных систем. К недостаткам данной программной реализации можно отнести большие, чем у статических страниц на пользовательском уровне SaaS, временные затраты на программную сборку клиентского уровня в браузере. Программная реализация в служебной библиотеке modulesjs используется в интеллектуальной системе хранения, обработки и анализа геоданных GEO4GEO для построения пользовательского уровня SaaS из модулей [4].
В результате были созданы методика разработки модульных веб-приложений на пользовательском уровне SaaS и программная реализация в служебной библиотеке modulesjs. В рамках методики предложен набор действий для решения проблемы модуляризации пользовательского уровня SaaS. Разработанная служебная библиотека то-
dules.js автоматизирует служебные операции, требуемые для выполнения части действий методики, и позволяет разрабатывать модульные приложения на пользовательском уровне SaaS. Данная методика и программная реализация успешно использованы в интеллектуальной системе хранения, обработки и анализа данных GEO4GEO в производственном процессе подсчета запасов нефти и газа.
Литература
1. Konary E. Traudt Software as a Service Taxonomy and Research Guide // IDC Research Report, June 2005.
2. Максимчук Р., Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений. М.: Вильямс, 2010. С. 37-54.
3. Papapetrou P. Real modular web applications: Why there is no standard for developing them? [Java Developers Resource Center]. URL: http://www.javacodegeeks.com/2011/09/ real-modular-web-applications-why-there.html (дата обращения: 16.01.2013).
4. Трухин Ю.В. Исследование семантической высокоуровневой файловой системы в масштабируемых центрах обработки данных: сб. науч. ст. Брянск: Изд-во БГИТА, 2011.
5. Bertrand M. Object-oriented software construction. lst ed., Prentice Hall Publ., 1988.
6. Трухин Ю.В. Modules.js source repository [GitHub]. URL: https://github.com/trukhinyuri/modules.js (дата обращения: 16.01.2013).
7. Grossman J. The origins of Cross-Site Scripting (XSS). URL: http://jeremiahgrossman.blogspot.ru/2006/07/origins-of-cross-site-scripting-xss.html (дата обращения: 16.01.2013).
8. Sirkisoon F., Haggerty J. Spending in the Age of Compliance. AMR Research Report, Boston, 2006.
9. Dijkstra E.W. Programming Considered as a Human. EWD117, 1995. URL: https://www.cs.utexas.edu/~EWD/transcrip-tions/EWD01xx/EWD 117.html (дата обращения: 16.01.2013).
10. Zakas N.C. Maintainable JavaScript. 1st edition USA, O'Relly Media Inc., 2012, pp. 53-66.
References
1. Konary A., Traudt E. Software as a Service Taxonomy and Research Guide. IDC Research Report, June 2005.
2. Maksimchuk R., Buch G. Obyektno-orientirovanny analiz i proektirovanie s primerami prilozheniy [Object-oriented analysis and design with application examples]. Moscow, Williams Publ., 2010, pp. 37-54 (in Russ.).
3. Papapetrou P. Real modular web applications: Why there is no standard for developing them? Java Developers Resource Center Available at: http://www.javacodegeeks.com/2011/09/real-modular-web-applications-why-there.html (accessed 16 January 2013).
4. Trukhin Yu.V. The research of the semantic high-level file systems in scalable datacenters. Articles of Bryansk State Academy of Engineering and Technology, 2011.
5. Bertrand M. Object-oriented software construction. lst ed., Prentice Hall Publ., 1988.
6. Trukhin Yu.V. Modules.js source repository. GitHub. Available at: https://github.com/trukhinyuri/modules.js (accessed 16 January 2013).
7. Grossman J. The origins of Cross-Site Scripting (XSS). Available at: http://jeremiahgrossman.blogspot.ru/2006/07/origins-of-cross-site-scripting-xss.html (accessed 16 January 2013).
8. Sirkisoon F., Haggerty J. Spending in the Age of Compliance. AMR Research report, Boston, 2006.
9. Dijkstra E.W. Programming Considered as a Human. EWD117, 1995. Available at: https://www.cs.utexas.edu/~EWD/ transcriptions/EWD01xx/EWD117.html (accessed 16 January 2013).
10. Zakas N.C. Maintainable JavaScript. 1st edition USA, O'Relly Media Inc. Publ., 2012, pp. 53-66.