SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
Чистая архитектура
с VIPER
Сергей Крапивенский, ведущий iOS-разработчик
Rambler&Co
Грязная архитектура
2
Грязная архитектура
• Огромные классы с кучей ответственностей
• Сильная связанность компонентов
• Трудно дебажить
• Трудно вносить изменения
• Невозможно покрыть тестами
• Хочется все сжечь 🔥
3
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко вносить изменения
• Просто понять
4
MVC от Apple: ожидание
5
MVC от Apple: реальность
6
MVC от Apple
7
Как появился VIPER
8
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
9
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
10
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
11
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
12
08.2012 12.2013 06.2014 05.20152014-2015
Идея VIPER
• Приложение разбивается на блоки с однотипной структурой
• Принцип разбиения — по user story
• User story описывает поведение приложения
13
User story
Пример — лента фото в Instagram
Задача — отобразить последние фото
друзей
При необходимости можно перейти на
другие истории
14
User story
Список лайков к нашим фото — другая
история
Это простые примеры: 1 экран = 1 история
15
User story
На одном экране может быть несколько
разных историй
16
User story
На одном экране может быть несколько
разных историй
1. Лента фотографий
17
1. Лента фотографий
2. Таб-бар для переключения ленты
3. Панель с информацией о пользователе
User story
На одном экране может быть несколько
разных историй
1. Лента фотографий
2. Таб-бар для переключения ленты
18
1. Лента фотографий
2. Таб-бар для переключения ленты
3. Панель с информацией о пользователе
User story
На одном экране может быть несколько
разных историй
1. Лента фотографий
2. Таб-бар для переключения ленты
3. Панель с информацией о пользователе
19
Действия модуля
• Получает данные
• Преобразовывает данные для отображения
• Реагирует на действия пользователя
• Переходит на другие модули при необходимости
20
Канонический модуль VIPER
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
21
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
22
Канонический модуль VIPER
Отображает на экране полученные данные
Информирует модуль о действиях пользователя
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
23
Канонический модуль VIPER
Содержит всю логику работы с данными
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
24
Канонический модуль VIPER
Подготавливает данные для отображения View
Обрабатывает действия пользователя
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
25
Канонический модуль VIPER
Отвечает за навигацию модуля
Инициализирует модуль и инжектирует зависимости
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
26
Канонический модуль VIPER
Простые модельные объекты
Не содержат никакой логики
Что мы изменили?
• Разделили Wireframe
• Добавили слой сервисов
• Сделали View слоем
• Формализовали переходы между модулями
• Написали тулзу для кодогенерации
27
Разделили Wireframe
• Wireframe не удовлетворяет SRP
• Wireframe = Router + Assembly
• Router отвечает за навигацию
• Assembly отвечает за сборку модуля
• Dependency Injection с помощью Typhoon Framework
• https://github.com/appsquickly/Typhoon
28
Добавили слой сервисов
• “Вся бизнес логика” звучит страшно 😱
• Сервисы — слой ниже интерактора
• 1 сервис = 1 тип сущностей (новости, сообщения, etc)
• Сервисы можно переиспользовать в разных модулях
• Сервисы зависят от объектов нижнего уровня
29
Слой View
• Тяжелое наследие UIViewController
• Работа с коллекциями не должна быть во View
• Layout и анимации можно вынести из View
• Эти задачи относятся к отображению данных
• Так View превратился в слой
30
Переходы между модулями
• То, о чем никто не говорит 🙊
• У каждого модуля есть <ModuleInput> и <ModuleOutput>
• Эти протоколы реализует презентер
• Пример: переход из модуля А в модуль B
• Роутер модуля А передает данные в презентер модуля B
• Презентер модуля B возвращает результат в презентер модуля А
31
Кодогенерация
• С VIPER нужно создать кучу классов
• Каркас всех модулей однотипен
• Руками создавать долго и сложно
• Программисту лень писать руками? Нужен скрипт
• Generamba!
• https://github.com/rambler-ios/Generamba
32
Что у нас получилось
33
Что у нас получилось
34
Афиша.Рестораны
Категории
ресторанов
Рестораны в
категории
Экран
ресторана
35
Афиша.Рестораны
36
VIEW
Категории
ресторанов
STORYBOARD
segue
VIEW
Рестораны в
категории
instantiate
37
VIEW
Категории
ресторанов
STORYBOARD
segue
VIEW
Рестораны в
категории
instantiate
ASSEMBLY
build
38
VIEW
Категории
ресторанов
segue
VIEW
Рестораны в
категории
INTERACTOR
PRESENTER ROUTER
SERVICE
39
VIEW
Рестораны в
категории
INTERACTOR
PRESENTER ROUTER
SERVICE
VIEW
Экран
ресторана
INTERACTOR
PRESENTERROUTER
SERVICE
categoryId
restaurants
(Core Data)
restaurantId
restaurant
(Core Data)
restaurant
(PONSO)
restaurants
(PONSO)
40
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко подвергается изменениям
• Просто понять
41
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко подвергается изменениям
• Просто понять
42
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко подвергается изменениям
• Просто понять
43
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко подвергается изменениям
• Просто понять
44
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко подвергается изменениям
• Просто понять
45
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко подвергается изменениям
• Просто понять
46
Rambler 😍 VIPER
• Рамблер.Конференции — open-source приложение
• Generamba — кодогенератор
• VIPER McFlurry — набор полезных утилит
• The Book Of VIPER — все, что мы знаем о VIPER
• И еще некоторые плюшки
• https://github.com/rambler-ios
47
Спасибо!
serkrapiv
sergey.krapivenskiy
rambler-ios

Weitere ähnliche Inhalte

Was ist angesagt?

Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
Andrew Mayorov
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Yulia Tsisyk
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
7bits
 
Разработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring FrameworkРазработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring Framework
CUSTIS
 

Was ist angesagt? (20)

Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPERRambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
Rambler.iOS #5: Генерамба и прочие аспекты кодогенерации в VIPER
 
Rambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOSRambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOS
 
#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важны
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
 
Vue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейVue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людей
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.js
 
Разработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring FrameworkРазработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring Framework
 

Ähnlich wie Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)

Ähnlich wie Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co) (20)

Станислав Цыганов "SOA в iOS разработке"
Станислав Цыганов "SOA в iOS разработке"Станислав Цыганов "SOA в iOS разработке"
Станислав Цыганов "SOA в iOS разработке"
 
Rambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la RamblerRambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la Rambler
 
VIPER architecture
VIPER architectureVIPER architecture
VIPER architecture
 
Inversion of Control в .NET
Inversion of Control в .NETInversion of Control в .NET
Inversion of Control в .NET
 
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
 
Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтенд
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
 
Внедрение зависимостей в ASP.NET MVС и ASP.NET vNext
Внедрение зависимостей в ASP.NET MVС и ASP.NET vNextВнедрение зависимостей в ASP.NET MVС и ASP.NET vNext
Внедрение зависимостей в ASP.NET MVС и ASP.NET vNext
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
 
redux: the best for isomorphic apps
redux: the best for isomorphic appsredux: the best for isomorphic apps
redux: the best for isomorphic apps
 
Rad studio 10 seatlle обзор продукта
Rad studio 10 seatlle обзор продуктаRad studio 10 seatlle обзор продукта
Rad studio 10 seatlle обзор продукта
 
Toggle your app
Toggle your appToggle your app
Toggle your app
 
Опыт разработки мобильных приложений в Applifto
Опыт разработки мобильных приложений в AppliftoОпыт разработки мобильных приложений в Applifto
Опыт разработки мобильных приложений в Applifto
 
GTUG Almaty. Dependency Injection в Android
GTUG Almaty. Dependency Injection в Android GTUG Almaty. Dependency Injection в Android
GTUG Almaty. Dependency Injection в Android
 
Rambler.iOS #5: TDD и VIPER
Rambler.iOS #5: TDD и VIPERRambler.iOS #5: TDD и VIPER
Rambler.iOS #5: TDD и VIPER
 
Viper в ios проектах
Viper в ios проектахViper в ios проектах
Viper в ios проектах
 
Архитектуры ios приложений
Архитектуры ios приложенийАрхитектуры ios приложений
Архитектуры ios приложений
 
Новые возможности для бизнеса с решениями Ivideon
Новые возможности для бизнеса с решениями IvideonНовые возможности для бизнеса с решениями Ivideon
Новые возможности для бизнеса с решениями Ivideon
 
Развитие облачных решений для бизнеса в мире и в России
Развитие облачных решений для бизнеса в мире и в РоссииРазвитие облачных решений для бизнеса в мире и в России
Развитие облачных решений для бизнеса в мире и в России
 
Андрей Завадский "Бессерверная архитектура"
 Андрей Завадский "Бессерверная архитектура" Андрей Завадский "Бессерверная архитектура"
Андрей Завадский "Бессерверная архитектура"
 

Mehr von Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

Mehr von Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)