Upload
lviv-startup-club
View
280
Download
3
Embed Size (px)
Citation preview
Хто так будує?Антипаттерни iOS розробки
Сергій Мумряк iOS Engineer @ Cogniance
Суб’єктивність оцінки якості системи
• цілі, які переслідує розробка системи
• досвід розробників
• ризики
Об’єкт-бог
Об’єкт-бог
+ Швидка імплементація
+ Низький поріг входження в розуміння архітектури
Об’єкт-бог
- Складність масштабування
- Відсутність кастомізації
- Високий поріг входження для підтримки
Об’єкт-бог в композиції іншого об’єкта-бога
Об’єкт-бог в композиції іншого об’єкта-бога
+ Низький поріг входження в розуміння архітектури
Об’єкт-бог в композиції іншого об’єкта-бога
- pow("Складність масштабування", 2)
- Відсутність кастомізації
- Високий поріг входження для підтримки
- Час для рефакторинга близький до нескінченності
Єдиний дата лоадер/провайдер
(частковий випадок об’єкта-бога)
Єдиний дата лоадер/провайдер
+ доступ і завантаження всіх данних з будь-якого місця
Єдиний провайдер данних
- доступ до всіх данних з будь-якого місця
- спагетті-код (зазвичай)
Дата лоадер як сабкласс реквест менеджера
Дата лоадер як сабкласс реквест менеджера
+ ?
Дата лоадер як сабкласс реквест менеджера
- знецінювання оригінального призначення об"єкта
- збитковість коду
- неможливість очевидного розділення задач по типам (REST запити, завантаження документів, відсилання данних, завантаження великої кількості данних і т.д.)
Нотіфікейшн від nil
Нотіфікейшн від nil
+ швидкий хак
+ простота (дуже-дуже простота) в будуванні архітектури
Нотіфікейшн від nil
- хак
- зменшення відповідальності
- зниження контролю над системою з боку розробника
- неочевидність
Робота з raw-даними від бекенда
Робота з raw-даними від бекенда
+ написав і забув
+ працює з базовими контейнерами (зазвичай)
Робота з raw-даними від бекенда
- складність оновлення
- неочевидність
- довгий і болісний перехід на нормальну модель
- читабельність коду відсутня (майже)
Парсер як частина модельного классу
Парсер як частина модельного классу
+ простота імплементації
+ прозора десеріалізація (тільки root-об’єкти)
Парсер як частина модельного классу
- майже відсутня абстрактність
- складність серіалізації ієрархії об"єктів
- неможливість десеріалізувати ієрархію об"єктів
Декільна Root в’юконтроллерів
Декільна Root в’юконтроллерів
+ ???
Декільна Root в’юконтроллерів
- необхідний хак для їхнього переключення
- заміна рутового об"єкта в рантаймі недопустима
- ніякої докумендації про поведінку аппи при зміні рут в’юкотроллера
- забудьте про анімації
Використання boolean замість сабклассінга (або будь-якого іншого рішення)
Використання boolean замість сабклассінга (або будь-якого іншого
рішення)
+ швидкий хак хотфікс
+ прозорий код (на час першого введення)
Використання boolean замість сабклассінга (або будь-якого іншого
рішення)
- головне джерело спагетті-кода
- pow("Складність", numberOfBooleans)
- довгий і не приємний рефакторинг
Як правильно?
Ніяк не правильно!
Як уникнути?• Divide and conquer
• знати паттерни програмування
• знати свій фреймворк
• писати код в стилі фреймворка
• критично мислити
• переймати знання і досвід через код (github, cocoapods, різні конференції і т.д.)
• НІКОЛИ не вважати stackoverflow джерелом знань
Що почитати/подивитись?
• Банда Чотирьох - Паттерни Проектування
• документація від Apple
• WWDC
• Василь Пастернак - Professional Software Development
QA
Design Patterns Explained Simply https://sourcemaking.com/design-patterns-book
Professional Software Development by Vasyl Pasternak https://speakerdeck.com/vasylp/professional-software-development
AFNetworking https://github.com/AFNetworking/AFNetworking
Alamofire https://github.com/Alamofire/Alamofire
Realm.io https://realm.io/docs/objc/latest/
Дякуюwww.cogniance.com