Перейти к содержимому

Лекция 2. Классы мобильных приложений, платформы и базовые архитектурные паттерны


Введение

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

Понимание этих тем критично перед началом работы с Expo и React Native: выбор подхода к разработке и архитектуры определяет стоимость, скорость и качество будущего продукта.


1. Мобильное приложение как отдельный класс ПО

Мобильное приложение — программный артефакт, работающий в условиях ограниченных ресурсов мобильной платформы и решающий прикладные задачи пользователя «в движении».

От настольных и серверных программ его отличает совокупность характеристик.

1.1. Ограниченные и динамические ресурсы

  • Батарея — главный лимитирующий фактор; вычисления, сеть и экран расходуют энергию.
  • Память и хранилище ограничены; ОС может выгрузить приложение из памяти.
  • CPU/GPU слабее настольных; важна энергоэффективность, а не пиковая мощность.

1.2. Доступ к сенсорам и аппаратуре

  • GPS, акселерометр, гироскоп, магнитометр, барометр.
  • Камера, микрофон, динамики, вибромотор.
  • Биометрия (отпечаток, Face ID), NFC, Bluetooth.
  • Эти возможности недоступны (или ограничены) обычным веб‑страницам и десктоп‑программам.

1.3. Особый жизненный цикл

  • Приложение постоянно переходит между состояниями: активно, неактивно, в фоне, выгружено.
  • ОС в любой момент может приостановить или завершить процесс ради экономии ресурсов.
  • Разработчик обязан корректно сохранять и восстанавливать состояние.

1.4. Контекстная адаптация и среда

  • Нестабильная сеть (Wi‑Fi/мобильная/офлайн), смена локации, прерывания (звонки, уведомления).
  • Персонализация под пользователя и условия использования.

1.5. Особая модель дистрибуции

  • Распространение через магазины (App Store, Google Play) с модерацией и правилами.
  • Обязательная подпись, версионирование, обновления, политика приватности.

Именно сочетание этих свойств выделяет мобильное приложение в самостоятельный класс программного обеспечения со своими инженерными требованиями.


2. Подходы к разработке

Существует четыре основных подхода. Выбор между ними — ключевое архитектурное решение проекта.

2.1. Нативные приложения

Код пишется на языках и с помощью SDK конкретной платформы.

  • iOS: Swift / Objective‑C, инструменты Xcode.
  • Android: Kotlin / Java, инструменты Android Studio.

Плюсы: максимальная производительность, полный доступ к API и сенсорам, лучший UX, быстрая поддержка новинок ОС. Минусы: две отдельные кодовые базы, дороже и дольше, нужны разные специалисты.

2.2. Кроссплатформенные приложения

Единый код компилируется/исполняется на нескольких платформах через общий слой.

  • React Native (JS/TS) — рендерит нативные компоненты.
  • Flutter (Dart) — собственный движок отрисовки.

Плюсы: одна кодовая база, экономия времени и денег, близкая к нативной производительность, доступ к большинству нативных API. Минусы: зависимость от фреймворка и его «мостов», иногда нужен нативный код для специфики, отставание в поддержке самых новых API.

2.3. Гибридные приложения

Веб‑приложение (HTML/CSS/JS), упакованное в нативный контейнер (WebView) с плагинами доступа к устройству.

  • Apache Cordova, Capacitor, Ionic.

Плюсы: переиспользование веб‑навыков и кода, очень быстрый старт, единая база для web/iOS/Android. Минусы: производительность и плавность ниже нативной, UX «не родной», доступ к железу через плагины ограничен.

2.4. PWA (Progressive Web Apps)

Веб‑приложение, которое благодаря Service Worker, манифесту и кэшу ведёт себя «как приложение»: работает офлайн, шлёт пуши, ставит иконку на домашний экран.

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

2.5. Сравнение подходов

КритерийНативныеКроссплатформенныеГибридныеPWA
Языки/стекSwift, KotlinJS/TS, DartHTML/CSS/JSHTML/CSS/JS
Кодовых баз2 (iOS+Android)111
ПроизводительностьМаксимальнаяБлизкая к нативнойСредняяСредняя/низкая
Доступ к железуПолныйШирокийЧерез плагиныОграниченный
Качество UXЭталонноеВысокоеСреднееЗависит от браузера
Скорость разработкиНизкаяВысокаяОчень высокаяОчень высокая
СтоимостьВысокаяСредняяНизкаяНизкая
ДистрибуцияМагазиныМагазиныМагазиныБраузер/ссылка

2.6. Когда что выбирать

  • Нативное — игры/графика с высокой нагрузкой, тесная работа с железом, премиальный UX, ресурсы на две команды.
  • Кроссплатформенное — типичный бизнес‑продукт под iOS и Android при ограниченном бюджете и сроках (наш курс — этот путь, Expo/React Native).
  • Гибридное — нужно быстро «обернуть» существующий веб‑продукт в приложение.
  • PWA — контентные сервисы, где важны охват и мгновенные обновления, а доступ к железу не критичен.

3. Классификация приложений

3.1. По назначению

  • Игры — от казуальных до AAA, часто с высокой нагрузкой на GPU.
  • Бизнес/корпоративные — CRM, ERP, банковские клиенты, документооборот.
  • Социальные сети и коммуникации — мессенджеры, соцсети, почта, видеозвонки.
  • Утилиты/инструментальные — калькуляторы, заметки, файловые менеджеры, фонарик.
  • Образовательные — курсы, словари, электронные учебники, тренажёры.
  • Развлекательные/медиа — стриминг видео и музыки, новости, подкасты.
  • Здоровье и фитнес — трекеры активности, шагомеры, медицинские дневники.

3.2. По зависимости от сети

  • Онлайн (клиент‑серверные) — без интернета не работают (видеостриминг, онлайн‑игры, мессенджеры в реальном времени).
  • Офлайн (автономные) — функционируют без сети (калькулятор, локальные заметки, оффлайн‑игры).
  • Гибридные — часть функций работает офлайн, синхронизация при появлении сети (заметки с облаком, карты с кэшем, почтовые клиенты).
Тип по сетиСетьПримерыОсобенности проектирования
ОнлайнОбязательнаСтриминг, онлайн‑игрыОбработка задержек и обрывов связи
ОфлайнНе нужнаКалькулятор, заметкиВсё хранится и считается локально
ГибридныйЖелательнаКарты, почта, заметки с облакомЛокальный кэш + синхронизация

Классификации не взаимоисключающие: одно приложение можно описывать одновременно по способу реализации, назначению и сетевой зависимости (например, «кроссплатформенный гибридный по сети мессенджер»).


4. Базовые презентационные паттерны

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

Общий элемент всех трёх паттернов — Model: данные и бизнес‑логика предметной области, не зависящие от способа отображения.

4.1. MVC (Model–View–Controller)

  • Model — данные и логика.
  • View — отображение, пользовательский интерфейс.
  • Controller — принимает ввод от View, обновляет Model, выбирает View.

Поток данных: пользователь → View → Controller → Model → (обновление) → View.

Особенность: классический паттерн, но на практике Controller часто разрастается и берёт слишком много (проблема «Massive View Controller» в iOS). View и Model могут быть связаны напрямую.

4.2. MVP (Model–View–Presenter)

  • Model — данные и логика.
  • View — пассивна, только отображает и передаёт события.
  • Presenter — вся логика представления; обращается к Model и обновляет View через интерфейс.

Поток данных: пользователь → View → Presenter → Model → Presenter → View.

Особенность: View и Presenter связаны через абстракцию (интерфейс), что упрощает модульное тестирование. View максимально «глупая».

4.3. MVVM (Model–View–ViewModel)

  • Model — данные и логика.
  • View — декларативный UI, подписан на ViewModel.
  • ViewModel — состояние и команды для View; не знает о конкретной View.

Поток данных: View ↔ ViewModel (двусторонняя привязка данных, data binding); ViewModel → Model.

Особенность: связь View и ViewModel через привязку данных — изменения состояния автоматически отражаются в UI. Естественен для декларативных фреймворков (SwiftUI, Jetpack Compose, а также React/React Native с управлением состоянием).

4.4. Сравнение паттернов

КритерийMVCMVPMVVM
Третий компонентControllerPresenterViewModel
Связь View ↔ логикаПрямаяЧерез интерфейсЧерез привязку данных
Роль ViewАктивнаяПассивнаяРеактивная
Знает ли логика о ViewДаДа (через интерфейс)Нет
ТестируемостьНизкая/средняяВысокаяВысокая
Привязка данныхНетНетДа
Типичная средаРанний iOS, вебAndroid (классический)SwiftUI, Compose, React

Помимо этих базовых паттернов существуют производные и более строгие подходы (MVVM‑C, VIPER, Clean Architecture), цель которых — ещё сильнее разделить ответственность и сделать домен независимым от платформы. Их мы затронем в следующих разделах курса.


Краткие итоги

  • Мобильное приложение — отдельный класс ПО из‑за ограниченных ресурсов, доступа к сенсорам, особого жизненного цикла и магазинной модели дистрибуции.
  • Четыре подхода к разработке: нативный (производительность и UX ценой двух баз), кроссплатформенный (баланс цены и качества), гибридный (быстрое «оборачивание» веба), PWA (охват и мгновенные обновления без магазина).
  • Приложения классифицируют по способу реализации, по назначению (игры, бизнес, соцсети, утилиты и др.) и по зависимости от сети (онлайн, офлайн, гибрид).
  • Презентационные паттерны MVC, MVP и MVVM по‑разному распределяют ответственность между Model, View и третьим компонентом; ключевое отличие — способ связи View с логикой и наличие привязки данных.
  • Для нашего курса выбран кроссплатформенный путь (Expo/React Native) с реактивным подходом к состоянию, близким к идее MVVM.

Вопросы для самопроверки

  1. В чём отличие нативных, кроссплатформенных, гибридных приложений и PWA? Когда какой подход выбрать?
  2. Как классифицируются мобильные приложения по назначению?
  3. Как классифицируются приложения по зависимости от сети и как это влияет на проектирование?
  4. Какие характеристики выделяют мобильное приложение в отдельный класс ПО?
  5. В чём суть и отличия паттернов MVC, MVP и MVVM? Как в каждом организован поток данных?