Вопросы, возникающие при использовании MVC, и их решение при помощи VIPER.
1. Проблемы, решаемые VIPER-ом. История появления.
2. Структура VIPER-модуля
3. Сервисы
4. Data flow
5. Навигация
6. Вложенные модули
7. Data flow между модулями
8. Кодогенерация. Vipergen
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Ontico
- Что такое "чистая" архитектура приложений. Чем грозит "грязная" архитектура, чем от нее отличается "чистая" архитектура, и какой от нее профит.
- История появления VIPER.
- Идея VIPER. Как изменяется структура приложения при применении этого подхода.
- Опыт использования VIPER в Rambler&Co. Что мы изменили и добавили.
- Работа с VIPER на примере user story из реального приложения.
- Выводы: чем помогает VIPER и когда его использовать не стоит.
Rambler.iOS #5: Переходы и передача данных между VIPER модулямиRAMBLER&Co
Rambler.iOS #5: Переходы и передача данных между VIPER модулями (Зарембо Андрей).
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Вопросы, возникающие при использовании MVC, и их решение при помощи VIPER.
1. Проблемы, решаемые VIPER-ом. История появления.
2. Структура VIPER-модуля
3. Сервисы
4. Data flow
5. Навигация
6. Вложенные модули
7. Data flow между модулями
8. Кодогенерация. Vipergen
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Ontico
- Что такое "чистая" архитектура приложений. Чем грозит "грязная" архитектура, чем от нее отличается "чистая" архитектура, и какой от нее профит.
- История появления VIPER.
- Идея VIPER. Как изменяется структура приложения при применении этого подхода.
- Опыт использования VIPER в Rambler&Co. Что мы изменили и добавили.
- Работа с VIPER на примере user story из реального приложения.
- Выводы: чем помогает VIPER и когда его использовать не стоит.
Rambler.iOS #5: Переходы и передача данных между VIPER модулямиRAMBLER&Co
Rambler.iOS #5: Переходы и передача данных между VIPER модулями (Зарембо Андрей).
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Краткий обзор фрэймворка AngularJS: что это такое и зачем все эти сложности. И сложности ли это вообще.
Презентация подготовлена по материалам прошедшего 19 ноября витебского фронтенд-митапа: http://devowl.org/
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiSoftengi
Разработка Web-приложений на Angular JS — доклад Бориса Левицкого, архитектора ПО в команде портфеля проектов Enviance компании Softengi.
Видео с докладом от автора можно посмотреть по ссылке: http://youtu.be/oTXxrmIxo8Y
Презентация ответит на вопросы:
- что такое Angular?
- для чего он используется и что с ним можно делать?
- как работает Data-Binding?
- кастомные фильтры
- структура Angular приложения
Архитектурные семинары Softengi - еженедельные встречи, на которые приглашаются ведущие разработчики/архитекторы Softengi и других компаний нашего консорциума Intecracy Group.
Все проведенные семинары мы записывали, и теперь хотим поделиться опытом и знаниями с такими же профессионалами.
Подписывайся на канал Softengi https://www.youtube.com/user/softengi и узнай первым о новых семинарах.
http://www.softengi.com
Краткий обзор фрэймворка AngularJS: что это такое и зачем все эти сложности. И сложности ли это вообще.
Презентация подготовлена по материалам прошедшего 19 ноября витебского фронтенд-митапа: http://devowl.org/
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiSoftengi
Разработка Web-приложений на Angular JS — доклад Бориса Левицкого, архитектора ПО в команде портфеля проектов Enviance компании Softengi.
Видео с докладом от автора можно посмотреть по ссылке: http://youtu.be/oTXxrmIxo8Y
Презентация ответит на вопросы:
- что такое Angular?
- для чего он используется и что с ним можно делать?
- как работает Data-Binding?
- кастомные фильтры
- структура Angular приложения
Архитектурные семинары Softengi - еженедельные встречи, на которые приглашаются ведущие разработчики/архитекторы Softengi и других компаний нашего консорциума Intecracy Group.
Все проведенные семинары мы записывали, и теперь хотим поделиться опытом и знаниями с такими же профессионалами.
Подписывайся на канал Softengi https://www.youtube.com/user/softengi и узнай первым о новых семинарах.
http://www.softengi.com
В данном докладе мы рассмотрим пять основных принципов дизайна классов в объектно-ориентированном проектировании, которые известны, как принципы SOLID. А также как обеспечить достаточный уровень гибкости, связанности, управляемости, стабильности и понятности кода.
Выполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C#. Plugin для Visual Studio 2010-2015. Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta DevStudio и т.д. Быстрый старт (мониторинг компиляции). Прямая интеграция анализатора в системы автоматизации сборки и утилита BlameNotifier (рассылка писем). Режим автоматического анализа изменённых файлов. Почему нужны анализаторы кода?
Account-Based Content Marketing: Building an effective content strategy to su...Adam Monago
Building an effective #ContentStrategy to support your account-based #marketing efforts. Presented at the @Demandbase Impact Tour stop in San Jose on January 28, 2016. #ABMIMPACT #B2B #ABM
Healthcare Compliance: A Short Guide For BusinesspeopleScott Maurice
It can be difficult to navigate operational compliance when it comes to protecting healthcare data. Scott Maurice takes a closer look at steps businesses can take to ensure that the information they are responsible for is secure,
The document discusses trends in income growth, productivity, and structural reforms in OECD countries. It finds that most people have seen little income growth for a decade, productivity growth has slowed, and the pace of structural reform has been mixed. It recommends packages of reforms in skills, firms, and jobs to promote inclusive growth through priorities tailored for each country.
The symmetrical relationship between the Man Booker Prize for Fiction and the Man Booker International Prize will ensure that the ‘Man Booker’ can now honour fiction on a global basis.
GTUG Almaty. Dependency Injection в Android Madina Kamzina
Об использовании подхода внедрения зависимостей (Dependency Injection) в разработке Android-приложений. Зачем это нужно и какие преимущества дает. А так же о том, как построить на основе DI гибкую архитектуру приложения.
Ивент здесь: https://plus.google.com/u/0/events/c6bh3b26o29g4k2fom09636fn00
В докладе рассказывается об опыте применения «инверсия управления» (Inversion of Control) при разработке новой версии KES. Этот подход заключается в том, что более высокоуровневый код не зависит напрямую от конкретной реализации нижележащего слоя. Вместо этого он зависит от абстрактного протокола (интерфейса), конкретный же компонент подставляется конфигурационным кодом-клиентом. Эта практика позволяет понизить loose coupling программных модулей и применяется практически в любых крупных проектах.
При разработке новой версии KES было принято решение изменить подход к реализации инверсии управления. Было решено отказаться от централизованного обобщенного реестра доступных компонентов (шаблон (паттерн) Service Locator) в пользу явной передачи зависимостей конфигуратором (ручная инъекция зависимостей (manual Dependency Injection)). При это возникли проблемы с использованием готовых библиотек Dependency Injection Frameworks. Применение подобных библиотек стало стандартом в мире разработки Java/C# за последние 10-15 лет, но в мире C++ они пока не получили подобного распространения. В докладе делается обзор и сравнение актуальных DI-Framework’ов на C++, анализируется их применимость к практическим задачам ЛК. Анализируется, что могут привнести стандарты C++11/14 для упрощения решения таких задач.
Внедрение зависимостей в ASP.NET MVС и ASP.NET vNextGoSharp
По мере развития веб-проекта сложность бизнес-логики неизбежно растёт. Это замедляет темпы разработки, системы становятся непонятными и запутанными. Связной – не исключение. Одним из наших решений проблемы является Dependency Injection. В докладе вы узнаете о том, как DI понижает сложность бизнес-логики, почему мы в Связном считаем DI DI в ASP.NET MVC эффективным решением и что нового для DI появилось в ASP.NET vNext.
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...GetDev.NET
Материалы со встречи: http://getdev.net/Event/xaf-reuse
Задумывались ли вы когда-нибудь, что с переходом от SQL к DataSet, а затем и к ORM типа Entity Framework развитие технологий для доступа и управления данными приостановилось? Что еще нового можно придумать к уже привычному оперированию записями таблиц БД как объектами CRL и при этом поднять удобство разработчика на следующий уровень? На этот и другие вопросы попробует дать ответ доклад о технологии Domain Components (часть DevExpress eXpressApp Framework), которая облегчает создание повторно используемых бизнес моделей за счет легкого комбинирования путем использования интерфейсов вместо классов (это позволяет вам эмулировать "множественное наследование" в C# и VB.NET), а также свободы от особенностей конкретной ORM.
Часто при разработке ios приложения разработчик попадает в ситуацию когда ViewController начинает аккумулировать в себе больше количество бизнес логики. Из-за накапливающегося связанного кода ViewController становится очень трудно поддерживать. Не так давно в мире ios разработки появилось решение - архитектура VIPER. VIPER это способ разбить massive view controllеры, на набор элементов (View, Interactor, Presenter, Entity, Router) с едиными ответственностями, которые так или иначе удовлетворяют принципам SOLID. Такие модули легко тестирвоать, расширять и переиспользовать.
Основы "мобильной" разработки на примере платформы iOs (iPhone)Pavel Tsukanov
Легкая обзорная лекция по платформе iOS. Рассмотрим специфику разработки под мобильные платформы, средства разработки, язык Objective-C, концепции применяемые при разработке под iOS. Расскажу шаги которые нужно сделать для создания вашего первого мобильного приложения.
Избавляемся от старья и переходим на SwiftUI / Руслан Кавецкий (Agora)EgorPetrov9
В какой-то момент мы с командой заскучали и переписали половину приложения на SwiftUI. Расскажу как мы начинали, с какими проблемами столкнулись, к каким решениям пришли и что в итоге из всего этого вышло.
Будет полезно тем, кто очень хочет перейти на SwiftUI, но ещё немного боится.
Similar to Rambler.iOS #3: Dependency Injection в iOS (20)
В своем докладе Денис Батвинкин кратко рассказал об истории LLVM и его внутренней архитектуре.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Rambler.iOS #9: Анализируй это! (Сергей Крапивенский).
Доклад посвящён наиболее популярным статическим анализаторам кода для iOS: как ими пользоваться, какие проблемы они решают, как внедрить их в привычный цикл разработки, как писать для них свои правила. Также рассмотрен опыт интеграции статического анализа и CI.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?RAMBLER&Co
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift? (Самвел Меджлумян)
Любой iOS-команде в повседневной практике требуется тот или иной вспомогательный инструментарий, оптимизирующий рутинные процессы. В рамках доклада рассмотрен Swift как инструмент для реализации этих задач, проведено сравнение имеющихся фреймворков между собой, а наиболее подходящий для указанных задач рассмотрен в сравнении с популярными серверными платформами.
Также затронуты вопросы микросервисной архитектуры, проблемы и best practices в бэкенд-разработке.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Rambler.iOS #9: Life with out of memory (Денис Батвинкин).
Out of memory error – ошибка, о которой не стоит забывать. В докладе Денис разбирает, что такое out of memory error и почему стоит уделить этой проблеме больше внимания. Отдельное внимание уделено причинам OOM и инструментам, которые помогут ее отследить. Также на примере iOS-приложения "Livejournal" рассмотрена практика борьба с этой ошибкой.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Бениамин Саркисян рассказал про устройство и принципы работы статического анализатора кода OCLint, а также показал, как можно написать свои собственные правила для него.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Екатерина Тришина рассмотрела плюсы и минусы различных видов диаграмм на примере кейса проектирования сложного блока функционала в проекте Афиша.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Артур Протько рассказал о различных технологиях семейства App Thinning: bitcode, slicing, on-demand resources. Помимо теории приводятся практические примеры и статистика, полученная в проекте Рамблер/почта.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
This document provides an overview of Dip, a dependency injection framework for Swift. It discusses key Dip concepts like dependency containers, component registration, and resolution. Key points include:
1. Modules are represented as dependency containers that manage their own components.
2. All components are registered in their containers with their dependencies.
3. The dependency graph is resolved by obtaining fully-initialized components from their containers.
Михаил Головко рассказал о принципах устройства и основных возможностях YapDatabase.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Последние полтора года на каждой из наших встреч мы рассказываем о том, почему продуманная и чистая архитектура мобильных приложений — это нужно и важно. За попытками спроектировать серебряную пулю мы очень часто забываем — или просто не уделяем достаточно внимания менее заметной части нашего кода — тестам.
Егор Толстой расскажет о том, почему не стоит обделять вниманием unit-тесты, как подходить к их проектированию и осуществлять постепенный рефакторинг. Выступление, как обычно, подкреплено зарядом личной боли и опыта от поддержки базы в 3.000 unit-тестов на одном проекте и 1.000 на другом.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Многие разработчики любят спорить о празных подходах к реализации верхнего слоя мобильного приложения — MVC, MVVM, VIPER. При этом зачастую уделяется недостаточно времени продумыванию логики работы с данными. Как следствие, усложняется понимание и последующее расширение данного слоя.
Стас Цыганов расскажет про подход, который давно используется в server-side разработке, но позже был адаптирован к реалиям мобильных приложений. Service Oriented Architecture задает строгий каркас в части обработки данных, фиксируя ответственность компонентов. Такой подход оказывается крайне полезным как в части поддержки и рефакторинга, так и при последующем расширении приложения.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRAMBLER&Co
This document discusses using JavaScriptCore to extend the functionality of apps. It provides an example of using JavaScriptCore to evaluate JavaScript code and access the results. It also outlines how JavaScriptCore maps JavaScript types to Objective-C and Swift types. The document describes how JavaScriptCore creates a virtual machine and handles single-threaded execution. It then shows how to export Swift classes to JavaScript using a protocol. Finally, it lists some ways apps like Paw could leverage JavaScriptCore, such as for code generators, importers, and dynamic values.
Rambler.iOS #8: Как не стать жертвой бэкендеровRAMBLER&Co
Клиент-серверное взаимодействие лежит в основе большинства мобильных приложений. Язык общения между клиентом и сервером всегда закреплён определённым контрактом. Однако валидация этого контракта незаслуженно остаётся в стороне. Отсюда и большинство проблем на клиенте — некорректное отображение, неконсистентность данных и падения.
Как избежать этих проблем и повысить уровень crash-free ваших приложений, добавив предварительную валидацию, расскажет Ирина Дягилева.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
RDSDataSource: iOS Reverse Engineering for inexperiencedRAMBLER&Co
Валерий Попов рассказывает о том, как организован процесс реверс-инжиниринга iOS приложений.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
RDSDataSource: Автогенерация документации для SDKRAMBLER&Co
Помимо различных приложений в нашей команде разрабатывается несколько SDK, и вопрос с генерацией документации становится всё более актуальным. Михаил рассказал какие системы для создание документации существуют, чем они хороши и какую из них мы выбрали для своих нужд. Кроме этого освещаются вопросы исползования такой документации и ее автоматического деплоя через Jenkins и fastlane.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
2. Dependency Injection в iOS
Об авторе
• Twitter: @igrekde
• GitHub: github.com/igrekde
• Блог: etolstoy.ru/blog
3. Dependency Injection в iOS
Содержание
• Принцип инверсии зависимостей
• Паттерны Dependency Injection
• DI в проектах Rambler&Co
• Typhoon Framework
5. Dependency Injection в iOS
SOLID
• S – The Single Responsibility Principle
• O – The Open-Closed Principle
• L – The Liskov Substitution Principle
• I – Interface Segregation Principle
• D – The Dependency Inversion Principle
6. Dependency Injection в iOS
–Роберт Мартин, “Принципы, паттерны и методики гибкой разработки”
Модули верхнего уровня не должны зависеть от модулей
нижнего уровня. И те и другие должны зависеть от
абстракций.
Абстракции не должны зависеть от деталей. Детали должны
зависеть от абстракций.
19. Dependency Injection в iOS
Service Locator
@interface MessageViewController
- (instancetype)initWithMessageService:(id <MessageService>)messageService
attachmentService:(id <AttachmentService>)attachmentService
renderer:(id <MessageRenderer>)renderer;
@end
Было:
20. Dependency Injection в iOS
Service Locator
@interface MessageViewController
- (instancetype)initWithServiceLocator:(id <ServiceLocator>)locator;
@end
Стало:
21. Dependency Injection в iOS
Service Locator
Плюсы:
• Быстро реализуется
• Централизованное управление зависимостями
22. Dependency Injection в iOS
Service Locator
Минусы:
• Приводит к неявным зависимостям
• Видимость хорошего дизайна
• Усложняет тестирование
23. Dependency Injection в iOS
DI container
• Не используется в коде напрямую
• Зависимости всех классов – явные
• Никто не заботится о создании зависимостей
25. Dependency Injection в iOS
Афиша Рестораны
@interface ARModalTableViewController : UIViewController <ARTableViewModelDelegate>
- (instancetype)initWithTableViewModel:(id<ARTableViewModel>)tableViewModel;
@end
Initializer Injection для UIViewController:
26. Dependency Injection в iOS
Афиша Рестораны
@protocol ARStoredListManager <NSObject>
- (void)setStorage:(id<ARLocalStorage>)storage;
@end
Установка зависимости через Setter:
27. Dependency Injection в iOS
Рамблер.Новости
@interface RDNDrawerRouterImplementation ()
……
destinationController.storyboardFactory = sourceController.storyboardFactory;
destinationController.router = [RDNFeedRouterImplementation new];
#warning Заменить fake-адаптер на боевой
destinationController.feedServiceAdapter = [RDNFakeServiceAdapterAssembly
fakeFeedDataServiceAdapterWithTopicIdentifier:topicIdentifier];
……
@end
Почти DI-контейнер:
28. Dependency Injection в iOS
Рамблер.WE
@interface RCIAuthorizationPresenter : NSObject <RCIAuthorizationViewOutput,
RCIAuthorizationInteractorOutput, RCIAuthorizationRouterOutput>
@property (strong, nonatomic) id <RCIAuthorizationViewInput> view;
@property (strong, nonatomic) id <RCIAuthorizationInteractorInput> interactor;
@property (strong, nonatomic) id <RCIAuthorizationRouter> router;
@end
Property Injection в модуле VIPER:
29. Dependency Injection в iOS
Рамблер.Почта
@interface RCMFolderSynchronizationOperation : RCMAsyncOperation<RCMRestartableOperation>
- (instancetype)initWithClient:(id <RCMRPCClient>)client
validator:(id <RCMValidator>)validator
mapper:(id <RCMMapper>)mapper;
@end
Создание операции с Initializer Injection:
33. Dependency Injection в iOS
Typhoon Framework
1.209
124
24 open/260 closed
0 open/60 closed
questions: 246
Последнее обновление: 09.05.15
34. Dependency Injection в iOS
Typhoon Framework
• Полностью нативен
• Поддерживает модульность
• Полная интеграция со Storyboard
• Initializer, Property и Method Injection
• Поддерживает circular dependencies
• Всего 3000 строчек кода
35. Dependency Injection в iOS
Интеграция с проектом
@interface RIAssembly : TyphoonAssembly
- (RIAppDelegate *)appDelegate;
@end
Создаем свою Assembly:
36. Dependency Injection в iOS
Интеграция с проектом
@implementation RIAssembly
- (RIAppDelegate *)appDelegate {
return [TyphoonDefinition withClass:[RIAppDelegate class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(startUpConfigurator) with:[self startUpConfigurator]];
}
}
- (id <RIStartUpConfigurator>)startUpConfigurator {
return [TyphoonDefinition withClass:[RIStartUpConfiguratorBase class]];
}
@end
46. Dependency Injection в iOS
Жизненный цикл
1. main.m
2. Создание UIApplication
3. Создание UIAppDelegate
4. Вызов [UIApplication setDelegate] -> Встраивается Typhoon
5. Вызов [UIAppDelegate applicationDidFinishLaunching]
47. Dependency Injection в iOS
TyphoonAssembly
Активация:
1. Автоматическая при наличии ключа в Info.plist
2. Ручная с использованием [TyphoonAssembly activate].
48. Dependency Injection в iOS
TyphoonAssembly
Активация:
1. Автоматическая при наличии ключа в Info.plist
2. Ручная с использованием [TyphoonAssembly activate].
65. Dependency Injection в iOS
Autowire
Плюсы:
• Быстро реализуется
• Меньше кода в фабриках
Минусы:
• Сильная привязка к Typhoon
• Архитектура приложения не читается в фабриках
73. Dependency Injection в iOS
Мифы
• Высокий порог вхождения
• Очень сложный дебаггинг
• Если Typhoon перестанут поддерживать, из проекта его не
выпилить
• Но… там же свиззлинг!
• Зачем мне Typhoon, когда я могу написать свой велосипед?
74. Dependency Injection в iOS
Рекомендации
• Разбивайте свои фабрики не только вертикально, но и
горизонтально
• Разбивайте фабрики по модулям заранее
• Покрывайте фабрики тестами
79. Dependency Injection в iOS
Objection
Плюсы:
• Легко и просто бьется на модули
• Легковесная
• Простая для освоения
80. Dependency Injection в iOS
Objection
Минусы:
• Все зависимости назначаются практически вручную
• Слишком сильная интеграция с кодом приложения
• Всего два вида объектов: прототип и синглтон
81. Dependency Injection в iOS
BloodMagic
216
30
2 open/6 closed
0 open/12 closed
By AlexDenisov
https://github.com/railsware/BloodMagic
Последнее обновление: 12.05.15
83. Dependency Injection в iOS
BloodMagic
Плюсы:
• Еще более легковесная библиотека
Минусы:
• Не позволяет создавать и управлять графами объектов
• Нет никаких плюшек DI-фреймворков