39
SOLIDный код: с TDD это просто Сергей Калинец http://tdd4.net Skype: sergiikalinets @skalinets

Solid code via tdd

Embed Size (px)

DESCRIPTION

Мой доклад с XP Days Ukraine 2011

Citation preview

Page 1: Solid code via tdd

SOLIDный код: с TDD это просто

Сергей Калинец http://tdd4.netSkype: sergiikalinets

@skalinets

Page 2: Solid code via tdd

Обо мне

• Более 10 лет в промышленной разработке• Руковожу разработкой в киевском офисе

компании CompatibL• Тренер по инженерным практикам в

scrumguides.com• Ведущий клуба практической разработки в

stratoplan.ru

Page 3: Solid code via tdd

Disclaimer

Надиктовано КО

Page 4: Solid code via tdd

История одного проекта

Page 5: Solid code via tdd

TDD: добро

• Уверенность в коде до запуска• Нет лишнего кода• Быстрее принимаются решения

Page 6: Solid code via tdd

TDD: зло

• Замедление рефакторинга

• Сложные тесты• Каскадные

отказы тестов

Page 7: Solid code via tdd

Жизнь проекта

• Черное-белое-черное-белое, а потом -- …

Page 8: Solid code via tdd

Как победить зло?

Page 9: Solid code via tdd

Уровни качества

Page 10: Solid code via tdd

Плохой дизайн это…

Page 11: Solid code via tdd

Неоправданная сложность

В системе есть инфраструктура, которая или не используется, или используется

неправильно

Page 12: Solid code via tdd

Повторение

Дубликаты структур, которые должны иметь общую

абстракцию.

Page 13: Solid code via tdd

Мутность

Код сложно понимать

Page 14: Solid code via tdd

Жесткость

Систему сложно изменять.

Page 15: Solid code via tdd

Монолитность

Сложно выделить компоненты, которые можно использовать повторно

Page 16: Solid code via tdd

Вязкость

Делать что-то правильно сложнее, чем делать это неправильно.

Page 17: Solid code via tdd

ХрупкостьИзменения легко ломают систему и приводят к новым

изменениям.

Page 18: Solid code via tdd

Решение

• Single Responsibility

• Open/Closed

• Liskov Substitution

• Interface Segregation

• Dependency Inversion

Page 19: Solid code via tdd

Single Responsibility

У класса есть только одна ответственность, он умеет ее делать и делает ее хорошо

Page 21: Solid code via tdd

Single Responsibility: Test

• Данные– Что знает?– Какие связи

между объектами поддерживает?

• Поведение– Что решает?– Какие услуги

предоставляет?

Page 22: Solid code via tdd

Single Responsibility

Show me the code: MessageHandler

Page 23: Solid code via tdd

Open/Closed• Программные сущности (классы, модули,

методы и т.д.) должны быть открыты для расширения, но закрыты от изменений

Было

Стало

Page 24: Solid code via tdd

Open/Closed и TDD

• Нет каскадных отказов тестов

• Не нужно менять работающий код

• Про тесты я уже говорил?

Page 25: Solid code via tdd

Open/Closed

Show me the code: OrderCalculator

Page 26: Solid code via tdd

Liskov Substitution

Клиенты, использующие базовый класс, должны работать и с его наследниками, не зная этого.

Page 27: Solid code via tdd

Liskov Substitution

• Предусловия не могут быть ужесточены в наследнике

• Постусловия не могут быть ослаблены в наследнике

• Инварианты базового типа должны соблюдаться и в наследнике

• Исторические ограничения

Page 28: Solid code via tdd

Liskov Substitution и TDD

• Тесты могут проверять использование наследников вместо предков

• В случае нарушения юнит тесты усложняются

Page 29: Solid code via tdd

Liskov Substitution

Show me the code: ReadOnlyQueue

Page 30: Solid code via tdd

Interface Segregation

• Utility Modules should be included полностью

• Тесты на страже Extract interface/base class• Тестовые дублёры могут скрывать

нарушения

Page 31: Solid code via tdd

Interface Segregation

Клиентам не должны навязываться интерфейсы, которые им не нужны.

Page 32: Solid code via tdd

Interface Segregation и TDD

• Тестовые дублеры диктуют API

• Тесты усложняются, когда зацепление понижается

• Тесты обезбаливают разбиение интерфейсов

Page 33: Solid code via tdd

Dependency Inversion

• Высокоуровневые модули не должны зависеть от низкоуровневых. Оба должны зависеть от абстракций.

• Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Page 34: Solid code via tdd

Dependency Inversion и TDD

• Service Locator или Dependency Injection?

• Двойники в TDD создают абстракции

• Настройка тестов легче с Dependency Injection

Page 35: Solid code via tdd

Dependency Inversion

Show me the code

Page 36: Solid code via tdd

Начать никогда не поздно!

• Extract interface/superclass

• Use base type where possible

• Extract parameter

Page 37: Solid code via tdd

SOLID & YAGNI & KISS

Yo Aren’t Gonna Need It

Keep It Simple Stupid

Page 38: Solid code via tdd

Выводы

• SOLID упрощает TDD

• TDD упрощает SOLID

• Вместе они упрощают нашу жизнь

Page 39: Solid code via tdd

Спасибо!

Сергей Калинец http://tdd4.net Skype: sergiikalinets@skalinets