SOLID – принципы объектно-ориентированного дизайна

89
SOLID – принципы объектно- ориентированного дизайна

description

SOLID – принципы объектно-ориентированного дизайна

Transcript of SOLID – принципы объектно-ориентированного дизайна

Page 1: SOLID – принципы объектно-ориентированного дизайна

SOLID – принципы объектно-ориентированного дизайна

Page 2: SOLID – принципы объектно-ориентированного дизайна

О чем мы сегодня поговорим

Что такое «плохой» дизайн кода в чем он выражается какие несет проблемы

Принципы проектирования SOLID Назначение Примеры использования

Как обнаруживать и устранять плохой дизайн кода Запахи кода Системы статического анализа кода

Page 3: SOLID – принципы объектно-ориентированного дизайна

Что такое «плохой» дизайн кода?

Page 4: SOLID – принципы объектно-ориентированного дизайна

Что такое «плохой» дизайн кода?

Повторение Отсутствие возможности

повторного использования кода Монолитность Плохая читаемость кода Неоправданная сложность Вязкость Хрупкость

Page 5: SOLID – принципы объектно-ориентированного дизайна

Откуда берется «плохой» дизайн?

Page 6: SOLID – принципы объектно-ориентированного дизайна

Откуда берется «плохой» дизайн?

Внесение изменений в систему, которая проектировалась без учета возможности появления таковых

Изменения в системе могут потребоваться на любой стадии проекта: Аналитика Разработка Сопровождение

Page 7: SOLID – принципы объектно-ориентированного дизайна

Изменения в системе неизбежны

Отсутствие формализированных требований со стороны клиента

Уточнение требований на этапе разработки, после утверждения ТЗ

Реализация дополнительного функционала на этапе технического сопровождения системы

Page 8: SOLID – принципы объектно-ориентированного дизайна

Изменения в системе неизбежны

Мы должны помнить об этом

Строить процесс разработки итеративно, с поправкой на то, чтобы внесение последующих изменений стоило нам как можно меньше ресурсов

Page 9: SOLID – принципы объектно-ориентированного дизайна

Перечислим основные проблемы «плохого» дизайна

Page 10: SOLID – принципы объектно-ориентированного дизайна

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

общую абстракцию.

Повторение

Page 11: SOLID – принципы объектно-ориентированного дизайна

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

повторно

Отсутствие возможности повторного использования

Page 12: SOLID – принципы объектно-ориентированного дизайна

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

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

Page 13: SOLID – принципы объектно-ориентированного дизайна

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

Page 14: SOLID – принципы объектно-ориентированного дизайна

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

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

Page 15: SOLID – принципы объектно-ориентированного дизайна

Вязкость

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

Page 16: SOLID – принципы объектно-ориентированного дизайна

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

новым изменениям

Хрупкость

Page 17: SOLID – принципы объектно-ориентированного дизайна

Может получится как в комиксе – «Читая чужой код»

Page 18: SOLID – принципы объектно-ориентированного дизайна

Решение есть

Single Responsibility

Open/Closed

Liskov Substitution

Interface Segregation

Dependency Inversion

Page 19: SOLID – принципы объектно-ориентированного дизайна

Что это такое?

SOLID - это аббревиатура пяти основных принципов дизайна классов в объектно-ориентированном проектировании

Page 20: SOLID – принципы объектно-ориентированного дизайна

Когда появились?

Были сформулированы Робертом Мартином в далеком 1995 году

Page 21: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

Page 22: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

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

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

Page 23: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

Пример приложения «Прямоугольник»:

Требования:Расчет площади прямоугольникаВывод изображения прямоугольника на UI

Page 24: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

Page 25: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

Page 26: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

Пример приложения «Модем»:

Требования:Установка соединения по телефонному номеруЗавершение соединенияОтправка данныхПрием данных

Page 27: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

Page 28: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

Page 29: SOLID – принципы объектно-ориентированного дизайна

Single Responsibility

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

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

Page 30: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 31: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Программные сущности (классы, модули, методы и т.д.) должны

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

Page 32: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Как этого добиться?

Page 33: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Классы должны зависеть от абстракций

Новые фичи могут быть добавлены путем реализации абстракций

Page 34: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Использование паттернов Стратегия Шаблонный метод

Page 35: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Приложение «Почтовый клиент»

Требования:

Отправка почтыЗапись результатов работы в файл

Page 36: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 37: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 38: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Приложение «Почтовый клиент»

Новое требование:

Запись результатов работы на диск

Page 39: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 40: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 41: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Паттерн Стратегия

Page 42: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 43: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 44: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 45: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Паттерн Шаблонный метод

Page 46: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Задача:

Разработать класс, реализующий шифрование данных при помощи алгоритмов DES и RSA

Page 47: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 48: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 49: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Page 50: SOLID – принципы объектно-ориентированного дизайна

Open/Closed

Программные сущности (классы, модули, методы и т.д.) должны

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

Page 51: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

Page 52: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

Пусть q(x) является свойством, верным относительно

объектов x некоторого типа T.

Тогда q(y) также должно быть верным для объектов y типа S,

где S является подтипом типа T.

Page 53: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

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

Page 54: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

ЗадачаМы хотим реализовать свой список с интерфейсом IList<T>. Его особенностью будет то, что все записи в нем дублируются.

Данная реализация не представляет никакой опасности, если рассматривать ее изолированно.

Page 55: SOLID – принципы объектно-ориентированного дизайна

Liskov SubstitutionВзглянем на использование этого класса с точки зрения клиента.

Клиент, абстрагируясь от реализаций, пытается работать со всеми объектами типа IList одинаково:

Page 56: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

Поведение списка DoubleList отличается от типичных реализаций IList. Получается, что наш DoubleList не может быть заменен базовым типом. Это и есть нарушение принципа замещения Лисков.

Проблема заключается в том, что теперь клиенту необходимо знать о конкретном типе объекта, реализующем интерфейс IList. В качестве такого объекта могут передать и DoubleList, а для него придется выполнять дополнительную логику и проверки.

Page 57: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

РешениеПравильным решением будет использовать свой собственный интерфейс, например, IDoubleList.

Этот интерфейс будет объявлять для пользователей поведение, при котором добавляемые элементы удваиваются.

Page 58: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

Проектирование по контракту

Page 59: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

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

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

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

Page 60: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

Рассмотрим пред и постусловия для интерфейса IList. Для функции Add:•предусловие: item != null•постусловие: count = oldCount + 1

Для нашего DoubleList и его функции Add:•предусловие: item != null•постусловие: count = oldCount + 2

Page 61: SOLID – принципы объектно-ориентированного дизайна

Liskov Substitution

Page 62: SOLID – принципы объектно-ориентированного дизайна

Interface Segregation

Page 63: SOLID – принципы объектно-ориентированного дизайна

Interface Segregation

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

Page 64: SOLID – принципы объектно-ориентированного дизайна

Interface Segregation

Page 65: SOLID – принципы объектно-ориентированного дизайна

Interface Segregation

Page 66: SOLID – принципы объектно-ориентированного дизайна

Interface Segregation

Много небольших интерфейсов лучше чем один большой

Page 67: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Page 68: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Зависимости внутри системы строятся на основе абстракций.

Модули верхнего уровня не зависят от модулей нижнего уровня.

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

Page 69: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Приложение «Печатная машинка»

Приложение должно уметь: Читать текст с клавиатуры Выводить текст на печать на

принтер

Page 70: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Page 71: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Page 72: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Приложение «Печатная машинка»

Появилось новое требование Приложение должно уметь

сохранять текст на диск

Page 73: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Page 74: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Пример применения принципа DI

Page 75: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Page 76: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Page 77: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Отсутствие инверсии зависимостей не всегда плохо.

Пример, зависимость от класса String.

Page 78: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Зависимости внутри системы строятся на основе абстракций.

Модули верхнего уровня не зависят от модулей нижнего уровня.

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

Page 79: SOLID – принципы объектно-ориентированного дизайна

Dependency Inversion

Page 80: SOLID – принципы объектно-ориентированного дизайна

Поддержание кода в хорошей форме

Page 81: SOLID – принципы объектно-ориентированного дизайна

Поддержание кода в хорошей форме

Проводить ревью кода

Находить «запахи» кода

Использовать статические анализаторы кода

Page 82: SOLID – принципы объектно-ориентированного дизайна

Code smells

Page 83: SOLID – принципы объектно-ориентированного дизайна

Static program analysis

Page 84: SOLID – принципы объектно-ориентированного дизайна

Code Static analyze system

Page 85: SOLID – принципы объектно-ориентированного дизайна

Code Static analyze system

Page 86: SOLID – принципы объектно-ориентированного дизайна

YAGNI & KISS

You Aren’t Gonne Need It

Keep It Simple Stupid

Page 87: SOLID – принципы объектно-ориентированного дизайна

О чем мы сегодня поговорили

Что такое плохой дизайн и откуда он берется

Как использовать принципы SOLID для улучшения дизайна

Как поддерживать код в хорошем состоянии

Page 88: SOLID – принципы объектно-ориентированного дизайна

Использованные материалы

Материалы xpinjection.com - http://xpinjection.com/resources/ Блог Александра Бындю - http://blog.byndyu.ru/ Книга «Принципы, паттерны и методики гибкой разработки

на языке C#» - http://www.ozon.ru/context/detail/id/5800704/ Книга «Инфраструктура программных проектов. Соглашения,

идиомы и шаблоны для многократно используемых библиотек .NET» - http://www.ozon.ru/context/detail/id/5588868/

Page 89: SOLID – принципы объектно-ориентированного дизайна

Контакты

Трёшников Павел Ведущий разработчик СМС-ИТ

▪ www.sms-automation.ru

e-mail: [email protected] twitter: @treshnikov