SlideShare uma empresa Scribd logo
1 de 39
SOLIDный код:
   с TDD это просто
Сергей Калинец http://tdd4.net
     Skype: sergiikalinets
         @skalinets
Обо мне
• Более 10 лет в промышленной разработке
• Руковожу разработкой в киевском офисе
  компании CompatibL
• Тренер по инженерным практикам в
  scrumguides.com
• Ведущий клуба практической разработки в
  stratoplan.ru
Disclaimer
Надиктовано КО
История одного
   проекта
TDD: добро



• Уверенность в коде до запуска
• Нет лишнего кода
• Быстрее принимаются решения
TDD: зло
• Замедление
  рефакторинга
• Сложные тесты
• Каскадные
  отказы тестов
Жизнь проекта
• Черное-белое-черное-белое, а потом -- …
Как победить зло?
Уровни качества
Плохой дизайн это…
Неоправданная
                      сложность




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




        Дубликаты структур, которые
           должны иметь общую
               абстракцию.
Мутность
Код сложно понимать
Жесткость
Систему сложно изменять.
Монолитность




 Сложно выделить компоненты, которые
     можно использовать повторно
Вязкость
Делать что-то правильно сложнее, чем
      делать это неправильно.
Хрупкость
Изменения легко
ломают систему и
приводят к новым
  изменениям.
Решение

• Single Responsibility
• Open/Closed
• Liskov Substitution
• Interface Segregation
• Dependency Inversion
Single Responsibility
У класса есть только одна ответственность,
он умеет ее делать и делает ее хорошо
Single Responsibility




from http://microsoftnlayerapp.codeplex.com/
Single Responsibility: Test
• Данные
  – Что знает?
  – Какие связи
    между объектами
    поддерживает?
• Поведение
  – Что решает?
  – Какие услуги
    предоставляет?
Single Responsibility


   Show me the code:
    MessageHandler
Open/Closed
• Программные сущности
  (классы, модули, методы и т.д.) должны
  быть открыты для расширения, но
  закрыты от изменений

                    Было

                 Стало
Open/Closed и TDD
• Нет каскадных отказов
  тестов
• Не нужно менять
  работающий код
• Про тесты я уже
  говорил?
Open/Closed


Show me the code:
 OrderCalculator
Liskov Substitution
Клиенты, использующие базовый класс,
должны работать и с его наследниками, не
зная этого.
Liskov Substitution
• Предусловия не могут быть ужесточены в
  наследнике
• Постусловия не могут быть ослаблены в
  наследнике
• Инварианты базового типа должны
  соблюдаться и в наследнике
• Исторические ограничения
Liskov Substitution и TDD
• Тесты могут проверять использование
  наследников вместо предков
• В случае нарушения юнит тесты
  усложняются
Liskov Substitution


  Show me the code:
   ReadOnlyQueue
Interface Segregation
• Utility Modules should be included
  полностью
• Тесты на страже Extract interface/base class
• Тестовые дублёры могут скрывать
  нарушения
Interface Segregation
Клиентам не должны навязываться
интерфейсы, которые им не нужны.
Interface Segregation и TDD
• Тестовые дублеры диктуют API

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

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

• Абстракции не должны зависеть от
  деталей. Детали должны зависеть от
  абстракций.
Dependency Inversion и TDD
• Service Locator или Dependency Injection?

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

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


   Show me the code
Начать никогда не поздно!
• Extract interface/superclass

• Use base type where possible

• Extract parameter
SOLID & YAGNI & KISS

Yo Aren’t Gonna Need It

Keep It Simple Stupid
Выводы
• SOLID упрощает TDD



• TDD упрощает SOLID



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

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

Mais conteúdo relacionado

Mais procurados

Severity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеSeverity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеDeutsche Post
 
Гибкое тестирование
Гибкое тестированиеГибкое тестирование
Гибкое тестированиеRina Uzhevko
 
Continuous Integration для тестировщиков
Continuous Integration для тестировщиковContinuous Integration для тестировщиков
Continuous Integration для тестировщиковUladzimir Kryvenka
 
Пользовательские требования в жизни тестировщика
Пользовательские требования в жизни тестировщикаПользовательские требования в жизни тестировщика
Пользовательские требования в жизни тестировщикаSQALab
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестированияRina Uzhevko
 
Автоматизация тестирования как сервис
Автоматизация тестирования как сервисАвтоматизация тестирования как сервис
Автоматизация тестирования как сервисautomated-testing.info
 
Держим дизайн системы под контролем, используя изолированное юнит-тестировани...
Держим дизайн системы под контролем, используя изолированное юнит-тестировани...Держим дизайн системы под контролем, используя изолированное юнит-тестировани...
Держим дизайн системы под контролем, используя изолированное юнит-тестировани...Ontico
 
Темная сторона метрик
Темная сторона метрикТемная сторона метрик
Темная сторона метрикRoman Ivliev
 
Вадим Зубович - Сдаем экзамен на сертификат ISTQB Foundation Level
Вадим Зубович - Сдаем экзамен на сертификат  ISTQB Foundation LevelВадим Зубович - Сдаем экзамен на сертификат  ISTQB Foundation Level
Вадим Зубович - Сдаем экзамен на сертификат ISTQB Foundation LevelCOMAQA.BY
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...SQALab
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QAFest
 
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестированииDeutsche Post
 
Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Vadim Kruchkov
 
юнит тестирование Fork
юнит тестирование Forkюнит тестирование Fork
юнит тестирование ForkSergey Oreshkov
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочинеAlexei Lupan
 
сергей андреев
сергей андреевсергей андреев
сергей андреевAlexei Lupan
 
Скандалы, расследования, тестирование
Скандалы, расследования, тестированиеСкандалы, расследования, тестирование
Скандалы, расследования, тестированиеSQALab
 

Mais procurados (20)

Severity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеSeverity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятное
 
Гибкое тестирование
Гибкое тестированиеГибкое тестирование
Гибкое тестирование
 
Continuous Integration для тестировщиков
Continuous Integration для тестировщиковContinuous Integration для тестировщиков
Continuous Integration для тестировщиков
 
Пользовательские требования в жизни тестировщика
Пользовательские требования в жизни тестировщикаПользовательские требования в жизни тестировщика
Пользовательские требования в жизни тестировщика
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестирования
 
Автоматизация тестирования как сервис
Автоматизация тестирования как сервисАвтоматизация тестирования как сервис
Автоматизация тестирования как сервис
 
Держим дизайн системы под контролем, используя изолированное юнит-тестировани...
Держим дизайн системы под контролем, используя изолированное юнит-тестировани...Держим дизайн системы под контролем, используя изолированное юнит-тестировани...
Держим дизайн системы под контролем, используя изолированное юнит-тестировани...
 
Темная сторона метрик
Темная сторона метрикТемная сторона метрик
Темная сторона метрик
 
Вадим Зубович - Сдаем экзамен на сертификат ISTQB Foundation Level
Вадим Зубович - Сдаем экзамен на сертификат  ISTQB Foundation LevelВадим Зубович - Сдаем экзамен на сертификат  ISTQB Foundation Level
Вадим Зубович - Сдаем экзамен на сертификат ISTQB Foundation Level
 
ISTQB
ISTQBISTQB
ISTQB
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
 
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
 
Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.
 
юнит тестирование Fork
юнит тестирование Forkюнит тестирование Fork
юнит тестирование Fork
 
Istqb. за и против
Istqb. за и противIstqb. за и против
Istqb. за и против
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
 
Keyword driven testing
Keyword driven testingKeyword driven testing
Keyword driven testing
 
сергей андреев
сергей андреевсергей андреев
сергей андреев
 
Скандалы, расследования, тестирование
Скандалы, расследования, тестированиеСкандалы, расследования, тестирование
Скандалы, расследования, тестирование
 

Semelhante a Solid code via tdd

SOLIDарность: Тестирование как разработка
SOLIDарность: Тестирование как разработкаSOLIDарность: Тестирование как разработка
SOLIDарность: Тестирование как разработкаSQALab
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsAnton Vidishchev
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in netAlex Tumanoff
 
XP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeXP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeDmytro Mindra
 
Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.EatDog
 
SOLID – принципы объектно-ориентированного дизайна
SOLID – принципы объектно-ориентированного дизайнаSOLID – принципы объектно-ориентированного дизайна
SOLID – принципы объектно-ориентированного дизайнаPavel Treshnikov
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerValeriya Atamanova
 
Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllMykyta Hopkalo
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииCEE-SEC(R)
 
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ Provectus
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияzheldak
 
Юнит тестирование, Александр Прукс, 30 Марта 2014
Юнит тестирование, Александр Прукс, 30 Марта 2014Юнит тестирование, Александр Прукс, 30 Марта 2014
Юнит тестирование, Александр Прукс, 30 Марта 2014ForkConf
 
разработка бизнес приложений (9)
разработка бизнес приложений (9)разработка бизнес приложений (9)
разработка бизнес приложений (9)Alexander Gornik
 
Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»Yandex
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 

Semelhante a Solid code via tdd (20)

SOLIDарность: Тестирование как разработка
SOLIDарность: Тестирование как разработкаSOLIDарность: Тестирование как разработка
SOLIDарность: Тестирование как разработка
 
Design principles
Design principles Design principles
Design principles
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET Applications
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in net
 
XP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeXP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy code
 
Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.
 
SOLID – принципы объектно-ориентированного дизайна
SOLID – принципы объектно-ориентированного дизайнаSOLID – принципы объектно-ориентированного дизайна
SOLID – принципы объектно-ориентированного дизайна
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен Dagger
 
Netpeak Talks #3: Масштабируемое приложение на PHP
Netpeak Talks #3: Масштабируемое приложение на PHPNetpeak Talks #3: Масштабируемое приложение на PHP
Netpeak Talks #3: Масштабируемое приложение на PHP
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controll
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документации
 
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы применения
 
Юнит тестирование, Александр Прукс, 30 Марта 2014
Юнит тестирование, Александр Прукс, 30 Марта 2014Юнит тестирование, Александр Прукс, 30 Марта 2014
Юнит тестирование, Александр Прукс, 30 Марта 2014
 
разработка бизнес приложений (9)
разработка бизнес приложений (9)разработка бизнес приложений (9)
разработка бизнес приложений (9)
 
Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Do you speak TDD
Do you speak TDDDo you speak TDD
Do you speak TDD
 
SOLID
SOLIDSOLID
SOLID
 

Mais de Serhiy Kalinets

Руйнуємо .NET Міфи
Руйнуємо .NET МіфиРуйнуємо .NET Міфи
Руйнуємо .NET МіфиSerhiy Kalinets
 
менеджеры против разработчиков
менеджеры против разработчиковменеджеры против разработчиков
менеджеры против разработчиковSerhiy Kalinets
 
путь Xp практика
путь Xp практикапуть Xp практика
путь Xp практикаSerhiy Kalinets
 
Уберинструментарий для тех, кому надоел MSBuild
Уберинструментарий для тех, кому надоел MSBuildУберинструментарий для тех, кому надоел MSBuild
Уберинструментарий для тех, кому надоел MSBuildSerhiy Kalinets
 
Путь XP практика
Путь XP практикаПуть XP практика
Путь XP практикаSerhiy Kalinets
 
Xp в brown field разработке
Xp в brown field разработкеXp в brown field разработке
Xp в brown field разработкеSerhiy Kalinets
 
Functional programming in C#
Functional programming in C#Functional programming in C#
Functional programming in C#Serhiy Kalinets
 
Fubu mvc -- нафига оно мне
Fubu mvc -- нафига оно мнеFubu mvc -- нафига оно мне
Fubu mvc -- нафига оно мнеSerhiy Kalinets
 
Даёшь асинхронность в массы, или как ускориться нашару
Даёшь асинхронность в массы, или как ускориться нашаруДаёшь асинхронность в массы, или как ускориться нашару
Даёшь асинхронность в массы, или как ускориться нашаруSerhiy Kalinets
 
Зачем нужны распределенные системы конторля версий
Зачем нужны распределенные системы конторля версийЗачем нужны распределенные системы конторля версий
Зачем нужны распределенные системы конторля версийSerhiy Kalinets
 
вкалывают роботы, счастлив человек (Team city)
вкалывают роботы,  счастлив человек (Team city)вкалывают роботы,  счастлив человек (Team city)
вкалывают роботы, счастлив человек (Team city)Serhiy Kalinets
 
Хотите драйва? Вам в TDD!
Хотите драйва? Вам в TDD!Хотите драйва? Вам в TDD!
Хотите драйва? Вам в TDD!Serhiy Kalinets
 
TDD: Arrange Act Assert на примере Rhino Mocks
TDD: Arrange Act Assert на примере Rhino MocksTDD: Arrange Act Assert на примере Rhino Mocks
TDD: Arrange Act Assert на примере Rhino MocksSerhiy Kalinets
 

Mais de Serhiy Kalinets (18)

CI adventures in .NET
CI adventures in .NETCI adventures in .NET
CI adventures in .NET
 
Руйнуємо .NET Міфи
Руйнуємо .NET МіфиРуйнуємо .NET Міфи
Руйнуємо .NET Міфи
 
менеджеры против разработчиков
менеджеры против разработчиковменеджеры против разработчиков
менеджеры против разработчиков
 
путь Xp практика
путь Xp практикапуть Xp практика
путь Xp практика
 
Уберинструментарий для тех, кому надоел MSBuild
Уберинструментарий для тех, кому надоел MSBuildУберинструментарий для тех, кому надоел MSBuild
Уберинструментарий для тех, кому надоел MSBuild
 
Xp fun
Xp funXp fun
Xp fun
 
Путь XP практика
Путь XP практикаПуть XP практика
Путь XP практика
 
Xp в brown field разработке
Xp в brown field разработкеXp в brown field разработке
Xp в brown field разработке
 
Functional programming in C#
Functional programming in C#Functional programming in C#
Functional programming in C#
 
Fubu mvc -- нафига оно мне
Fubu mvc -- нафига оно мнеFubu mvc -- нафига оно мне
Fubu mvc -- нафига оно мне
 
Ready for prod
Ready for prodReady for prod
Ready for prod
 
Даёшь асинхронность в массы, или как ускориться нашару
Даёшь асинхронность в массы, или как ускориться нашаруДаёшь асинхронность в массы, или как ускориться нашару
Даёшь асинхронность в массы, или как ускориться нашару
 
Clean code
Clean codeClean code
Clean code
 
Зачем нужны распределенные системы конторля версий
Зачем нужны распределенные системы конторля версийЗачем нужны распределенные системы конторля версий
Зачем нужны распределенные системы конторля версий
 
Мой Скрамбат
Мой СкрамбатМой Скрамбат
Мой Скрамбат
 
вкалывают роботы, счастлив человек (Team city)
вкалывают роботы,  счастлив человек (Team city)вкалывают роботы,  счастлив человек (Team city)
вкалывают роботы, счастлив человек (Team city)
 
Хотите драйва? Вам в TDD!
Хотите драйва? Вам в TDD!Хотите драйва? Вам в TDD!
Хотите драйва? Вам в TDD!
 
TDD: Arrange Act Assert на примере Rhino Mocks
TDD: Arrange Act Assert на примере Rhino MocksTDD: Arrange Act Assert на примере Rhino Mocks
TDD: Arrange Act Assert на примере Rhino Mocks
 

Solid code via tdd

Notas do Editor

  1. Надиктовано КОВелосипед не изобретенОднако на практике редко был замечен – собеседования, общение на встречах и конференциях, тренингах.Добавляется простота и предсказуемость. Это не значит, что сложного нельзя сделать, это значит, что сложные вещи делаются просто.
  2. Проект с нуля,TDD c нуля, учились на своем опыте
  3. Аналогия – нормализированные модели DB.Нарушение приводит к Хрупкому дизайнуКритика: несовместимость с реальным миром, крайности реализации
  4. Вам пофик, сколько лошадей, какой объем двигателя и тип подвески.Если после нажания на тормоз не тормозит -- ВНЕЗАПНО
  5. History: mutable point
  6. High Cohesion
  7. Что общего? Это аббревиатурыЧто разного? Solid это аббревиатура аббревиатур, а не – просто фразы