solid code via tdd
DESCRIPTION
Мой доклад с XP Days Ukraine 2011TRANSCRIPT
![Page 1: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/1.jpg)
SOLIDный код: с TDD это просто
Сергей Калинец http://tdd4.netSkype: sergiikalinets
@skalinets
![Page 2: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/2.jpg)
Обо мне
• Более 10 лет в промышленной разработке• Руковожу разработкой в киевском офисе
компании CompatibL• Тренер по инженерным практикам в
scrumguides.com• Ведущий клуба практической разработки в
stratoplan.ru
![Page 3: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/3.jpg)
Disclaimer
Надиктовано КО
![Page 4: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/4.jpg)
История одного проекта
![Page 5: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/5.jpg)
TDD: добро
• Уверенность в коде до запуска• Нет лишнего кода• Быстрее принимаются решения
![Page 6: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/6.jpg)
TDD: зло
• Замедление рефакторинга
• Сложные тесты• Каскадные
отказы тестов
![Page 7: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/7.jpg)
Жизнь проекта
• Черное-белое-черное-белое, а потом -- …
![Page 8: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/8.jpg)
Как победить зло?
![Page 9: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/9.jpg)
Уровни качества
![Page 10: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/10.jpg)
Плохой дизайн это…
![Page 11: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/11.jpg)
Неоправданная сложность
В системе есть инфраструктура, которая или не используется, или используется
неправильно
![Page 12: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/12.jpg)
Повторение
Дубликаты структур, которые должны иметь общую
абстракцию.
![Page 13: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/13.jpg)
Мутность
Код сложно понимать
![Page 14: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/14.jpg)
Жесткость
Систему сложно изменять.
![Page 15: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/15.jpg)
Монолитность
Сложно выделить компоненты, которые можно использовать повторно
![Page 16: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/16.jpg)
Вязкость
Делать что-то правильно сложнее, чем делать это неправильно.
![Page 17: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/17.jpg)
ХрупкостьИзменения легко ломают систему и приводят к новым
изменениям.
![Page 18: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/18.jpg)
Решение
• Single Responsibility
• Open/Closed
• Liskov Substitution
• Interface Segregation
• Dependency Inversion
![Page 19: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/19.jpg)
Single Responsibility
У класса есть только одна ответственность, он умеет ее делать и делает ее хорошо
![Page 20: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/20.jpg)
Single Responsibility
from http://microsoftnlayerapp.codeplex.com/
![Page 21: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/21.jpg)
Single Responsibility: Test
• Данные– Что знает?– Какие связи
между объектами поддерживает?
• Поведение– Что решает?– Какие услуги
предоставляет?
![Page 22: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/22.jpg)
Single Responsibility
Show me the code: MessageHandler
![Page 23: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/23.jpg)
Open/Closed• Программные сущности (классы, модули,
методы и т.д.) должны быть открыты для расширения, но закрыты от изменений
Было
Стало
![Page 24: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/24.jpg)
Open/Closed и TDD
• Нет каскадных отказов тестов
• Не нужно менять работающий код
• Про тесты я уже говорил?
![Page 25: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/25.jpg)
Open/Closed
Show me the code: OrderCalculator
![Page 26: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/26.jpg)
Liskov Substitution
Клиенты, использующие базовый класс, должны работать и с его наследниками, не зная этого.
![Page 27: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/27.jpg)
Liskov Substitution
• Предусловия не могут быть ужесточены в наследнике
• Постусловия не могут быть ослаблены в наследнике
• Инварианты базового типа должны соблюдаться и в наследнике
• Исторические ограничения
![Page 28: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/28.jpg)
Liskov Substitution и TDD
• Тесты могут проверять использование наследников вместо предков
• В случае нарушения юнит тесты усложняются
![Page 29: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/29.jpg)
Liskov Substitution
Show me the code: ReadOnlyQueue
![Page 30: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/30.jpg)
Interface Segregation
• Utility Modules should be included полностью
• Тесты на страже Extract interface/base class• Тестовые дублёры могут скрывать
нарушения
![Page 31: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/31.jpg)
Interface Segregation
Клиентам не должны навязываться интерфейсы, которые им не нужны.
![Page 32: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/32.jpg)
Interface Segregation и TDD
• Тестовые дублеры диктуют API
• Тесты усложняются, когда зацепление понижается
• Тесты обезбаливают разбиение интерфейсов
![Page 33: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/33.jpg)
Dependency Inversion
• Высокоуровневые модули не должны зависеть от низкоуровневых. Оба должны зависеть от абстракций.
• Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
![Page 34: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/34.jpg)
Dependency Inversion и TDD
• Service Locator или Dependency Injection?
• Двойники в TDD создают абстракции
• Настройка тестов легче с Dependency Injection
![Page 35: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/35.jpg)
Dependency Inversion
Show me the code
![Page 36: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/36.jpg)
Начать никогда не поздно!
• Extract interface/superclass
• Use base type where possible
• Extract parameter
![Page 37: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/37.jpg)
SOLID & YAGNI & KISS
Yo Aren’t Gonna Need It
Keep It Simple Stupid
![Page 38: Solid code via tdd](https://reader035.vdocuments.mx/reader035/viewer/2022062706/55745f6dd8b42a146f8b4719/html5/thumbnails/38.jpg)
Выводы
• SOLID упрощает TDD
• TDD упрощает SOLID
• Вместе они упрощают нашу жизнь