УДК 004 Гончаров А.Н., Клочай М.С.
Гончаров А.Н.
студент 2 курса магистратуры, направление подготовки «Информационные системы и технологии» Московский политехнический университет (г. Москва, Россия)
Клочай М.С.
студент 2 курса магистратуры, направление подготовки «Информационные системы и технологии» Московский политехнический университет (г. Москва, Россия)
ОБЗОР МОДУЛЬНОГО ПРОЕКТИРОВАНИЯ ПРИ РАЗРАБОТКЕ МОБИЛЬНЫХ ПРИЛОЖЕНИЙ: ОТ ПРИНЦИПОВ К РЕАЛИЗАЦИИ
Аннотация: в работе исследуется значимость использования модульного проектирования при разработке мобильных приложений, раскрываются преимущества и описываются существующие наработки в данной сфере. Также приводятся примеры успешной реализации и экономической целесообразности описанных принципов и подходов.
Ключевые слова: модульное проектирование, модуль, мобильное приложение.
Выбор рациональной архитектуры будущего мобильного приложения имеет решающе значение для его жизнеспособности и управляемости. Архитектура мобильного приложения представляет набор элементов и методов, которые определяют, какой должна быть внутренняя структура кода приложения и как она должна развиваться. Крайне важно хорошо ее спланировать, учитывая, что архитектурные решения будут иметь долгосрочные последствия. Часто компании сосредотачиваются исключительно на таких аспектах, как Ц1/ЦХ, то
есть на дизайне пользовательского интерфейса и удобстве использования, в то время как надежностью, ремонтопригодностью, масштабируемостью и низкой отказоустойчивостью часто пренебрегают. В результате созданное приложение, поначалу соответствующее ожиданиям как компании-проектировщика, так и конечных пользователей, в долгосрочной перспективе начинает представлять из себя сложный для поддержки и расширения функциональных возможностей продукт.
Традиционные способы построения приложений основаны на монолитной архитектуре с единым и неделимым централизованным блоком, лишенным модульности. Разработчики, желающие изменить приложение или работать над различными функциями, должны получить доступ к единой кодовой базе, изменяя весь стек одновременно. Незначительные изменения одного фрагмента кода ведут к изменениям во всей системе. Исправления и обновления кода в монолитной архитектуре требует повышенных затрат времени, средств и человеческих ресурсов.
Модульное программирование — это организация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются определённым правилам [1]. Модуль — это последовательность логически связанных фрагментов, оформленных как отдельная часть программы [2], причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой [4]. Во многих языках (но далеко не обязательно) оформляется в виде отдельного файла с исходным кодом или поименованной непрерывной её части. Использование модульного программирования позволяет упростить тестирование программы и обнаружение ошибок. Аппаратно-зависимые подзадачи могут быть строго отделены от других подзадач, что улучшает мобильность создаваемых программ.
В основе модульного программирования лежат три основных концепции:
1. Принцип утаивания информации Парнаса. Всякий компонент утаивает единственное проектное решение, т.е. Модуль служит для утаивания
информации. Подход к разработке программ заключается в том, что сначала формируется список проектных решений, которые особенно трудно принять или которые, скорее всего, будут меняться. Затем определяются отдельные модули, каждый из которых реализует одно из указанных решений.
2. Аксиома модульности Коуэна. Модуль — независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям:
— блочность организации, вызов программной единицы из блоков любой степени вложенности,
— синтаксическая обособленность, т.е. выделение модуля в тексте синтаксическими элементами,
— семантическая независимость, т.е. независимость от места, где программная единица вызвана,
— общность данных, т.е. наличие собственных данных, сохраняющихся при каждом обращении,
— полнота определения, т.е. самостоятельность программной единицы.
3. Сборочное программирование Цейтина. Модули — это программные кирпичи, из которых строится программа. Существуют три основные предпосылки к модульному программированию:
— стремление к выделению независимой единицы программного знания. в идеальном случае всякая идея (алгоритм) должна быть оформлена в виде модуля,
— потребность организационного расчленения крупных разработок,
— возможность параллельного исполнения модулей (в контексте параллельного программирования).
Таким образом, суть модульной архитектуры в дизайне и разработке мобильных приложений заключается в разделении приложений на несколько модулей (функциональных блоков), компонентов и подсистем с возможностью замены или добавления любого модуля в зависимости от требований рынка и
ожиданий клиентов без затрагивания остальной части системы. Это является основным преимуществом модульной архитектуры при проектировании и разработке мобильных приложений по сравнению с традиционной монолитной архитектурой.
В контексте использования Android Studio для разработки программных продуктов, можно выделить три основных типа модулей:
1. Модули приложений — это точка входа в приложение. Они могут содержать исходный код, ресурсы, assets и androidmanifestxml. Результатом работы модуля приложения является пакет приложений для Android (B) или пакет приложений для Android (APK).
2. Библиотечные модули имеют тот же контент, что и модули приложений. Они используются другими модулями Android в качестве зависимости. Выходные данные библиотечного модуля Android Archive (R) структурно идентичны модулям приложений, но они компилируются в файл Android Archive (R), который впоследствии может использоваться другими модулями в качестве зависимости. Библиотечный модуль позволяет инкапсулировать и повторно использовать одну и ту же логику и ресурсы во многих модулях приложения.
3. Библиотеки Kotlin и Java не содержат никаких ресурсов Android, ресурсов или файлов манифеста. Для полного понимания необходимо затронуть существующие разновидности модулей:
— "маленькие" (функциональные) модули, реализующие, как правило, одну какую-либо определенную функцию. Основным и простейшим модулем практически во всех языках программирования является процедура или функция.
— "средние" (информационные) модули, реализующие, как правило, несколько операций или функций над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля. Примеры "средних" модулей в языках программирования:
— задачи в языке программирования Ada,
— кластер в языке программирования CLU,
— классы в языках программирования C++ и Java.
— "большие" (логические) модули, объединяющие набор "средних" или "маленьких" модулей. Примеры "больших" модулей в языках программирования:
— модуль в языке программирования Modula-2,
— пакеты в языках программирования Ada и Java.
Каждый модуль, независимо от того, к какой разновидности он относится, обладает набором характеристик модуля, предложенным Майерсом. Набор состоит из следующих конструктивных характеристик:
— размер модуля,
— прочность (связность) модуля,
— сцепление модуля с другими модулями,
— рутинность (идемпотентность, независимость от предыдущих обращений) модуля.
1. Размер модуля.
В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций или функций для пакета). Это число берется на основе представлений психологов о среднем оперативном буфере памяти человека. Модуль (функция) не должен превышать 60 строк. В результате его можно поместить на одну страницу распечатки или легко просмотреть на экране монитора.
2. Прочность (связность) модуля.
Существует гипотеза о глобальных данных, утверждающая, что глобальные данные вредны и опасны. Локальность данных дает возможность легко читать и понимать модули, а также легко удалять их из программы.
Связность (прочность) модуля — мера независимости его частей. Чем выше связность модуля — тем лучше, тем больше связей по отношению к оставшейся части программы он упрятывает в себе. Модуль с функциональной связностью реализует одну какую-либо определенную функцию и не может быть разбит на 2 модуля с теми же типами связностей. Модуль с последовательной связностью может быть разбит на последовательные части, выполняющие
независимые функции, но совместно реализующие единственную функцию. Например, один и тот же модуль может быть использован сначала для оценки, а затем для обработки данных. Модуль с информационной связностью — это модуль, который выполняет несколько операций или функций над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля. Эта информационная связность применяется для реализации абстрактных типов данных.
3. Сцепление модуля с другими модулями.
Сцепление — мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим различные типы сцепления.
Независимые модули — это идеальный случай. Модули ничего не знают друг о друге. Организовать взаимодействие таких модулей можно, зная их интерфейс и соответствующим образом перенаправив выходные данные одного модуля на вход другого. Достичь такого сцепления сложно, да и не нужно, поскольку сцепление по данным (параметрическое сцепление) является достаточно хорошим.
Сцепление по данным (параметрическое) — это сцепление, когда данные передаются модулю, как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Этот вид сцепления реализуется в языках программирования при обращении к функциям (процедурам). Две разновидности этого сцепления определяются характером данным:
— сцепление по простым элементам данных.
— сцепление по структуре данных - оба модуля должны знать о внутренней структуре данных.
4. Рутинности (идемпотентность, независимость от предыдущих обращений) модуля.
Рутинность — это независимость модуля от предыдущих обращений к
нему (от предыстории). Будем называть модуль рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений).
Модуль должен быть рутинным в большинстве случаев, но есть и случаи, когда модуль должен сохранять историю. В выборе степени рутинности модуля пользуются тремя рекомендациями:
— в большинстве случаев делаем модуль рутинным, то есть независимым от предыдущих обращений.
— зависящие от предыстории модули следует использовать, если необходимо сцепление по данным.
— в спецификации зависящего от предыстории модуля должна быть четко сформулирована зависимость, чтобы пользователи имели возможность прогнозировать поведение такого модуля.
Таким образом, преимущества модульного метода обусловлены свойствами самих модулей, их характеристиками и связями между собой, создающими идеальные условия для гибкой модификации и доработки приложений. При этом остальная часть системы, не нуждающаяся в исправлении или обновлении, остается неизменной, не подвергаясь деформации. Модульная архитектура повышает долгосрочный успех приложений и их обслуживание за счет улучшения ремонтопригодности, масштабируемости, перспективности. Она адаптируется к меняющимся требованиям рынка программных продуктов и обеспечивает независимую разработку модулей, что повышает производительность разработчиков [3].
Недостатком модульного метода при проектировании и разработке мобильных приложений является затратность начальных вложений в написание технической документации и проведение сложных технических анализов, которые обеспечивают решения для долгосрочных потребностей бизнеса.
Уже более 10 лет различные команды практикуют модульную архитектуру, например, Youzan Mobile постоянно пробует различные решения на основе компонентов, которые были применены во многих приложениях,
таких как Youzan wechat Mall, Youzan Retail и Youzan Industry. Coursera ведёт адаптацию гибких модулей данных, чтобы разработчики могли добавлять различные модули, которые будут работать вместе без проблем.
СПИСОК ЛИТЕРАТУРЫ:
1. Киберпедия — Принципом модульного программирования — http s: // cyb erpedia.su/6x88a4. html;
2. Модульное программирование — Студопедия https://studopedia.ru/9_6296_modulnoe-programmirovani e. html;
3. Титовская Н.В., Титовский С.Н. Модульное программирование: учеб. пособие / Н.В.Титовская, С.Н.Титовский,Краснояр. гос. аграр. ун-т. -Красноярск, 2018. - 177 с;
4. Lekcii.org — Рекурсивные алгоритмы — https://lektsii.org/1-412.html
Goncharov A.N., Klochay M.S.
Goncharov A.N.
Moscow Polytechnic University (Moscow, Russia)
Klochay M.S.
Moscow Polytechnic University (Moscow, Russia)
OVERVIEW OF MODULAR DESIGN IN MOBILE APPLICATION DEVELOPMENT: FROM PRINCIPLES TO IMPLEMENTATIONS
Abstract: paper explores the significance of using modular design in the development of mobile applications, reveals the advantages and describes existing developments in this area. Examples of successful implementation and economic feasibility of the described principles and approaches are also given.
Keywords: modular design, module, mobile app.