Я расскажу, как внести функциональные изменения в плохо спроектированный код в разумные сроки и при этом ничего не сломать — о возможных проблемах, ошибках в процессе и о том, как с ними справляться.
В частности, покажу, как в этом помогают тесты и почему они важны как система раннего обнаружения ошибок. Расскажу о зависимостях, их классификации и о том, какое влияние разные типы зависимостей оказывают на наше понимание работы программы и возможности её протестировать.
Большую часть этого доклада я посвятил простым практическим приёмам рефакторинга и модификации кода — для упрощения понимания системы и более лёгкого внесения функциональных изменений.
The 2nd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 2nd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 5-th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
Разработка WPF приложений в стиле ViewModel FirstDenis Tsvettsih
Презентация к докладу «Разработка WPF приложений в стиле ViewModel First» с одиннадцатой конференции dotnetconf (Челябинск, 31 октября 2015)
http://dotnetconf.ru/materialy/viewmodelfirst
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Я.Субботник в Челябинске в рамках конференции UWDC
О докладе:
О чем нужно подумать во время проектирования архитектуры. Какую архитектуру нужно заложить, чтобы приложение могло безболезненно развиваться.
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Михаил Давыдов "Масштабируемые JavaScript-приложения"
О докладе:
Проектирование масштабируемых JavaScript-приложений уровня Яндекс.Почты.
Чем отличается сайт от JavaScript приложения? Какие проблемы могут возникнуть при разработке многокомпонентных приложений? Какую архитектуру нужно заложить, чтобы приложение могло легко развиваться?
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
Как-то так происходит, что “на 10 девчонок по статистике 9 ребят”, а точнее на группу из 5-7 разработчиков – 1 тестировщик. Или его нет совсем. Так что очень часто приходится и код писать, и тестировать, а дата релиза все ближе и ближе.
В тех случаях, когда мы пишем веб-приложение, помочь в нашей нелегкой судьбе может бодрящий микс из Selenium и TestNG... Как это сделали мы, какие потом получили выводы и результаты — все это я и хочу рассказать и показать
The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 5-th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
Разработка WPF приложений в стиле ViewModel FirstDenis Tsvettsih
Презентация к докладу «Разработка WPF приложений в стиле ViewModel First» с одиннадцатой конференции dotnetconf (Челябинск, 31 октября 2015)
http://dotnetconf.ru/materialy/viewmodelfirst
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Я.Субботник в Челябинске в рамках конференции UWDC
О докладе:
О чем нужно подумать во время проектирования архитектуры. Какую архитектуру нужно заложить, чтобы приложение могло безболезненно развиваться.
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Михаил Давыдов "Масштабируемые JavaScript-приложения"
О докладе:
Проектирование масштабируемых JavaScript-приложений уровня Яндекс.Почты.
Чем отличается сайт от JavaScript приложения? Какие проблемы могут возникнуть при разработке многокомпонентных приложений? Какую архитектуру нужно заложить, чтобы приложение могло легко развиваться?
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
Как-то так происходит, что “на 10 девчонок по статистике 9 ребят”, а точнее на группу из 5-7 разработчиков – 1 тестировщик. Или его нет совсем. Так что очень часто приходится и код писать, и тестировать, а дата релиза все ближе и ближе.
В тех случаях, когда мы пишем веб-приложение, помочь в нашей нелегкой судьбе может бодрящий микс из Selenium и TestNG... Как это сделали мы, какие потом получили выводы и результаты — все это я и хочу рассказать и показать
Symfony Moscow Meetup Symfoniacs #8
«Контейнер сервисов — Что? Где? Когда?»
В докладе будут рассмотрены типичные примеры и антипаттерны того, что обычно помещают в контейнеры, зачем это делают и каким образом.
Мир мобильных телефонов очень сильно изменил нашу жизнь. В наше время невозможно представить современного человека, без этого чудо устройства. На рынке появляется все больше устройств и приложений. И чтобы удобнее пользоваться этими приложениями пользователи выбирают “умные” телефоны, или как их еще принято называть смартфоны. В своем докладе я хочу поделиться своим опытом автоматизации приложений под Android и iOS. Я расскажу о том, какие инструменты автоматизации я использовал. Поговорим о недостатках этих инструментов и какие из них стоит использовать у себя на проекте.
Расскажу про развитие идеи реактивного программирования. Пройдем путь от MVVM к VIPER при использовании рективщины, обсудим плюсы и минусы последнего в сравнении с императивной реализацией.
Александр Зимин – Анимация как средство самовыраженияCocoaHeads
Расскажу о том, как создавать сложные анимации в iOS приложениях.
- CoreAnimation и его особенности
- Анимационные переходы между экранами
- Работа с анимациями, экспортированными из Adobe After Effects
Николай Ашанин – Team Lead. Структурирование мыслейCocoaHeads
Расскажу, как вырасти из разработчика в тимлида и не сойти с ума. Технические и психологические рекомендации, ошибки, негатив и дельные советы для разработчиков. Будет интересно разработчикам, которые задумываются о росте.
Самвел Меджлумян — S3: API на Swift за пять минутCocoaHeads
Мы поговорим о том, что может Swift за рамками iOS-разработки и что он из себя представляет в качестве Server Side решения. Изучим готовые продукты для реализации сервера на Swift и сравним их между собой. Будет также короткое демо, как за пять минут поднять API на Swift.
Александр Зимин (Alexander Zimin) — Магия SwiftCocoaHeads
Александр говорил о нестандартных особенностях языка для реальных проектов. О том, зачем усложнять себе жизнь и какие преимущества это может дать.
- Protocol-Oriented Programming и его дилеммы
- Когда и зачем использовать обобщения и вложенные типы
- Настоящее и будущее Swift
Катерина Трофименко — Разработка фич: от флагов до a/b-тестовCocoaHeads
Катя рассказала, что такое feature flags, как они помогают нам в Badoo разрабатывать большие фичи итерационно, силами нескольких разработчиков, и не переживать из-за кода, уходящего в релизы. Рассказала о том, как система таргетированной раскладки фич переросла в систему a/b-тестирования и как все это выглядит со стороны iOS-клиента
Андрей Володин — Как подружиться с роботомCocoaHeads
This document provides instructions for building a "hello world" application and the Fiber2D framework for Android using Swift. It outlines setting up the necessary prerequisites like the Android NDK. It then describes compiling a simple "hello world" executable to test the setup. The bulk of the document focuses on compiling the Fiber2D 3D graphics framework, which involves creating a build script to configure the Swift compiler, link dependencies, and build a dynamic library that can be used in an Android application.
Александр Зимин (Alexander Zimin) — UIViewController, откройся!CocoaHeads
The document discusses iOS app development topics including UIKit, transitions, animations, view controllers, and protocols. It provides information about modal presentation styles in UIModalPresentationStyle, transition coordinators using the UIViewControllerTransitioningDelegate protocol, and animating view controller changes using the UIViewControllerContextTransitioning protocol. The document outlines responsibilities for animating transitions between views.
Сергей Пронин, Никита Кошолкин — Как мы разрабатываем App in the Air: процесс...CocoaHeads
An app called App in the Air grew from 0 to 1,000,000 users. The document outlines lessons learned from the experience including that launch is just the beginning, retention matters more than initial buzz or downloads, and gatekeepers, team composition, industry, feedback loops, thinking big, and vision are important factors for long term growth. It provides data on the app's user growth and retention over time from launch to 1 million users.
Макс Грибов — Использование SpriteKit в неигровых приложенияхCocoaHeads
This document discusses using SpriteKit, Apple's 2D game framework, for non-game applications. It introduces SpriteKit components like SKView, SKScene and SKNode that can be used to build interactive visual experiences. It also covers SpriteKit actions for animation, physics integration, and organizing visual hierarchies with nodes.
10. 1. Уменьшают время проверки соответствия требованиям
⌘+U вместо цикла проверки командой QA
2. Фиксируют функциональность
Нет в тестах = не реализовано
Модульные тесты
10
13. Явная зависимость — зависимость, определенная в
публичном интерфейсе класса.
Неявная зависимость определяется и используется
только в реализации.
Явная и неявная зависимость
13
14. Внешняя зависимость — зависимость, которая
передается в модуль вызывающим кодом.
Внутренние зависимости создаются или извлекаются
самим модулем.
Внешняя и внутренняя зависимость
14
15. Гибкая зависимость — зависимость, позволяющая
изменить реализацию без изменения кода модуля.
Жесткие зависимости требуют модификации кода
модуля для изменения поведения.
Гибкая и жесткая зависимость
15
17. protocol NetworkRequestFactory {
func request() -> NetworkRequest
}
class NetworkRequestFactoryImpl : NetworkRequestFactory {
// ...
}
class NetworkManager {
public var requestFactory: NetworkRequestFactory =
NetworkRequestFactoryImpl()
}
Явная внутренняя гибкая зависимость
17
18. protocol ServiceLocator {
func resolve<T>() -> T
}
protocol NetworkRequestFactory {
func request() -> NetworkRequest
}
class NetworkManager {
private let _networkRequestFactory: NetworkRequestFactory
public init(withServices serviceLocator: ServiceLocator) {
_networkRequestFactory = serviceLocator.resolve()
}
}
Неявная внешняя гибкая зависимость
Другие варианты: передача в качестве зависимости Any/id 18
19. protocol NetworkRequestFactory {
func request() -> NetworkRequest
}
class NetworkRequestFactoryImpl : NetworkRequestFactory {
// ...
}
class NetworkManager {
public let requestFactory: NetworkRequestFactory =
NetworkRequestFactoryImpl()
}
Явная внутренняя жесткая зависимость
Другие варианты: наследование 19
20. class NetworkRequestFactory {
public static var sharedFactory = NetworkRequestFactory()
func request() -> NetworkRequest {
// ...
}
}
class NetworkManager {
private let _requestFactory: NetworkRequestFactory
public init() {
_requestFactory = NetworkRequestFactory.sharedFactory
}
}
Неявная внутренняя жесткая зависимость
Другие варианты: вызовы функций 20
21. 1. Модуль тестируется со всеми жесткими зависимостями
2. Гибкие зависимости заменяются на mock-объекты
3. Проверяется выполнение заявленных контрактов модуля
Тестирование
21
45. Процесс — цепочка преобразований с одним входом и одним
выходом.
Вход и выход процесса — часть внутреннего состояния объекта.
Выделение процессов
45
46. Процесс
46
class ViewController : UIViewController {
private var _account: Account
private var _articles: [ Articles ]
private var _drafts: [ Drafts ]
}
// Процесс работает только с articles и account
class UpdateArticlesProcess {
public func updateArticles(for account: Account) -> [ Articles ] {
}
}
47. 1. Выделяется процесс в виде внутренней зависимости
2. Процесс покрывается тестами
3. Процесс выносится во внешнюю зависимость
4. Меняются тесты у основного объекта
Итерационное выделение процессов
47
48. 1. Принцип бойскаута
2. Не переделывать все сразу
3. Искать понятные абстракции
Best practices
48
50. 1. Тесты помогают вносить изменения
2. Нетестируемый код можно преобразовать в трестируемый
3. С небольшими объектам работать проще, чем с громоздкими
Заключение
50