SlideShare a Scribd company logo
1 of 89
 Что такое «плохой» дизайн кода
   в чем он выражается
   какие несет проблемы
 Принципы проектирования SOLID
     Назначение
     Примеры использования
   Как обнаруживать и устранять плохой дизайн
    кода
     Запахи кода
     Системы статического анализа кода
   Повторение
   Отсутствие возможности повторного
    использования кода
   Монолитность
   Плохая читаемость кода
   Неоправданная сложность
   Вязкость
   Хрупкость
   Внесение изменений в систему, которая
    проектировалась без учета возможности
    появления таковых

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

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

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

   Строить процесс разработки итеративно, с
    поправкой на то, чтобы внесение
    последующих изменений стоило нам как
    можно меньше ресурсов
Дубликаты
структур, которые должны
иметь общую абстракцию.
Сложно выделить компоненты, которые
    можно использовать повторно
Систему сложно изменять
В системе есть инфраструктура, которая или
не    используется,   или    используется
неправильно
Делать что-то правильно сложнее, чем
       делать это неправильно
Изменения легко ломают
 систему и приводят к
  новым изменениям
 Single Responsibility
 Open/Closed
 Liskov Substitution
 Interface Segregation
 Dependency Inversion
SOLID - это аббревиатура пяти основных
принципов дизайна классов в объектно-
ориентированном проектировании
Были сформулированы Робертом Мартином
в далеком 1995 году
У класса есть только одна
ответственность, он умеет ее делать и делает
ее хорошо.

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

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

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

Не должно быть больше одной причины для
изменения класса.
Программные сущности
(классы, модули, методы и т.д.) должны
  быть открыты для расширения, но
        закрыты от изменений
Как этого добиться?
Классы   должны зависеть от абстракций

Новые фичи могут быть добавлены путем
реализации абстракций
Использование паттернов
 Стратегия
 Шаблонный метод
Приложение «Почтовый клиент»

Требования:

Отправка почты
Запись результатов работы в файл
Приложение «Почтовый клиент»

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

Запись   результатов работы на диск
Паттерн Стратегия
Паттерн Шаблонный метод
Задача:

Разработать класс, реализующий
шифрование данных при помощи
алгоритмов DES и RSA
Программные сущности
(классы, модули, методы и т.д.) должны
  быть открыты для расширения, но
        закрыты от изменений
Пусть q(x) является свойством, верным
относительно объектов x некоторого типа T.


Тогда q(y) также должно быть верным для
объектов y типа S, где S является подтипом
                  типа T.
Клиенты, использующие базовый
класс, должны работать и с его
наследниками, не зная этого
Задача
Мы хотим реализовать свой список с интерфейсом IList<T>. Его особенностью будет
то, что все записи в нем дублируются.




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

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



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




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

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

   Инварианты базового типа должны
    соблюдаться и в наследнике
Рассмотрим пред и постусловия для интерфейса IList.
Для функции Add:
•предусловие: item != null
•постусловие: count = oldCount + 1


Для нашего DoubleList и его функции Add:
•предусловие: item != null
•постусловие: count = oldCount + 2
Клиентам не должны навязываться
интерфейсы, которые им не нужны
Много небольших интерфейсов лучше
        чем один большой
   Зависимости внутри системы строятся на
    основе абстракций.

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

   Абстракции не должны зависеть от
    деталей. Детали должны зависеть от
    абстракций.
Приложение «Печатная машинка»

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

Появилось новое требование
 Приложение должно уметь сохранять
  текст на диск
Пример применения принципа DI
Отсутствие инверсии      зависимостей   не
 всегда плохо.

Пример, зависимость от класса String.
   Зависимости внутри системы строятся на
    основе абстракций.

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

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

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

Использовать статические анализаторы кода
You Aren’t Gonne Need It

Keep It Simple Stupid
   Что такое плохой дизайн и откуда он берется

   Как использовать принципы 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/
   Трѐшников Павел
     Ведущий разработчик СМС-ИТ
        ▪ www.sms-automation.ru

     e-mail: treshnikov@gmail.com
     twitter: @treshnikov

More Related Content

What's hot

Interface java
Interface java Interface java
Interface java atiafyrose
 
S.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsS.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsRicardo Wilkins
 
3 Tier Architecture
3  Tier Architecture3  Tier Architecture
3 Tier ArchitectureWebx
 
Uso de-patrones-de-arquitectura-capitulo-4
Uso de-patrones-de-arquitectura-capitulo-4Uso de-patrones-de-arquitectura-capitulo-4
Uso de-patrones-de-arquitectura-capitulo-4Ozzy Bull
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPSergey Nemchinsky
 
Let us understand design pattern
Let us understand design patternLet us understand design pattern
Let us understand design patternMindfire Solutions
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Sergey Nemchinsky
 
2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob 2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob GEORGE LEON
 
Шаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLШаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLSergey Nemchinsky
 
Design Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory PatternDesign Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory PatternMudasir Qazi
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеSergey Nemchinsky
 
Lambda Expressions in Java 8
Lambda Expressions in Java 8Lambda Expressions in Java 8
Lambda Expressions in Java 8icarter09
 
Lambda Expressions in Java
Lambda Expressions in JavaLambda Expressions in Java
Lambda Expressions in JavaErhan Bagdemir
 

What's hot (20)

Interface java
Interface java Interface java
Interface java
 
PlantUML introduction
PlantUML introductionPlantUML introduction
PlantUML introduction
 
S.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsS.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software Architects
 
3 Tier Architecture
3  Tier Architecture3  Tier Architecture
3 Tier Architecture
 
Uso de-patrones-de-arquitectura-capitulo-4
Uso de-patrones-de-arquitectura-capitulo-4Uso de-patrones-de-arquitectura-capitulo-4
Uso de-patrones-de-arquitectura-capitulo-4
 
PlantUML
PlantUMLPlantUML
PlantUML
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASP
 
Let us understand design pattern
Let us understand design patternLet us understand design pattern
Let us understand design pattern
 
Java 8 Lambda Expressions
Java 8 Lambda ExpressionsJava 8 Lambda Expressions
Java 8 Lambda Expressions
 
Clean Code
Clean CodeClean Code
Clean Code
 
Solid Principles
Solid PrinciplesSolid Principles
Solid Principles
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob 2012 the clean architecture by Uncle bob
2012 the clean architecture by Uncle bob
 
Шаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLШаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UML
 
Design Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory PatternDesign Patterns - Abstract Factory Pattern
Design Patterns - Abstract Factory Pattern
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
Sqlite
SqliteSqlite
Sqlite
 
Views, Triggers, Functions, Stored Procedures, Indexing and Joins
Views, Triggers, Functions, Stored Procedures,  Indexing and JoinsViews, Triggers, Functions, Stored Procedures,  Indexing and Joins
Views, Triggers, Functions, Stored Procedures, Indexing and Joins
 
Lambda Expressions in Java 8
Lambda Expressions in Java 8Lambda Expressions in Java 8
Lambda Expressions in Java 8
 
Lambda Expressions in Java
Lambda Expressions in JavaLambda Expressions in Java
Lambda Expressions in Java
 

Viewers also liked

ПАК Мониторинг - краткое описание системы
ПАК Мониторинг - краткое описание системыПАК Мониторинг - краткое описание системы
ПАК Мониторинг - краткое описание системыPavel Treshnikov
 
Разработка приложений работы с данными при помощи WPF
Разработка приложений работы с данными при помощи WPFРазработка приложений работы с данными при помощи WPF
Разработка приложений работы с данными при помощи WPFPavel Treshnikov
 
Использование Mock-объектов в TDD на платформе .NET
Использование Mock-объектов в TDD на платформе .NETИспользование Mock-объектов в TDD на платформе .NET
Использование Mock-объектов в TDD на платформе .NETPavel Treshnikov
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версийPavel Treshnikov
 
Расчет и документирование технологических процессов на базе WinCC OA
Расчет и документирование технологических процессов на базе WinCC OAРасчет и документирование технологических процессов на базе WinCC OA
Расчет и документирование технологических процессов на базе WinCC OAPavel Treshnikov
 
Архитектура масштабируемых приложений. Микросервисы, CQRS, ESB
Архитектура масштабируемых приложений. Микросервисы, CQRS, ESBАрхитектура масштабируемых приложений. Микросервисы, CQRS, ESB
Архитектура масштабируемых приложений. Микросервисы, CQRS, ESBPavel Treshnikov
 
Процессы, практики, инструменты разработки программного обеспечения
Процессы, практики, инструменты разработки программного обеспеченияПроцессы, практики, инструменты разработки программного обеспечения
Процессы, практики, инструменты разработки программного обеспеченияPavel Treshnikov
 
Siemens oil and gas 2016 WinCC OA
Siemens oil and gas 2016   WinCC OASiemens oil and gas 2016   WinCC OA
Siemens oil and gas 2016 WinCC OADMC, Inc.
 

Viewers also liked (11)

Working with .NET Threads
Working with .NET ThreadsWorking with .NET Threads
Working with .NET Threads
 
Коротко о Scrum
Коротко о ScrumКоротко о Scrum
Коротко о Scrum
 
ПАК Мониторинг - краткое описание системы
ПАК Мониторинг - краткое описание системыПАК Мониторинг - краткое описание системы
ПАК Мониторинг - краткое описание системы
 
Разработка приложений работы с данными при помощи WPF
Разработка приложений работы с данными при помощи WPFРазработка приложений работы с данными при помощи WPF
Разработка приложений работы с данными при помощи WPF
 
Использование Mock-объектов в TDD на платформе .NET
Использование Mock-объектов в TDD на платформе .NETИспользование Mock-объектов в TDD на платформе .NET
Использование Mock-объектов в TDD на платформе .NET
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
Расчет и документирование технологических процессов на базе WinCC OA
Расчет и документирование технологических процессов на базе WinCC OAРасчет и документирование технологических процессов на базе WinCC OA
Расчет и документирование технологических процессов на базе WinCC OA
 
WinCC OA
WinCC OAWinCC OA
WinCC OA
 
Архитектура масштабируемых приложений. Микросервисы, CQRS, ESB
Архитектура масштабируемых приложений. Микросервисы, CQRS, ESBАрхитектура масштабируемых приложений. Микросервисы, CQRS, ESB
Архитектура масштабируемых приложений. Микросервисы, CQRS, ESB
 
Процессы, практики, инструменты разработки программного обеспечения
Процессы, практики, инструменты разработки программного обеспеченияПроцессы, практики, инструменты разработки программного обеспечения
Процессы, практики, инструменты разработки программного обеспечения
 
Siemens oil and gas 2016 WinCC OA
Siemens oil and gas 2016   WinCC OASiemens oil and gas 2016   WinCC OA
Siemens oil and gas 2016 WinCC OA
 

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

Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.EatDog
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDPavel Tsukanov
 
JEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыJEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыdmalykhanov
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноBubon Makabra
 
Проектирование программных систем. Занятие 4
Проектирование программных систем. Занятие 4Проектирование программных систем. Занятие 4
Проектирование программных систем. Занятие 4Dima Dzuba
 
JavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaLohika_Odessa_TechTalks
 
Как выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиКак выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиSQALab
 
Как выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиКак выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиCUSTIS
 
Choose method for requirements Tsepkov Analyst Days-2017
Choose method for requirements Tsepkov Analyst Days-2017Choose method for requirements Tsepkov Analyst Days-2017
Choose method for requirements Tsepkov Analyst Days-2017Maxim Tsepkov
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в MagentoPavel Usachev
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных системDima Dzuba
 
Разработка веб-сервисов осень 2013 лекция 5
Разработка веб-сервисов осень 2013 лекция 5Разработка веб-сервисов осень 2013 лекция 5
Разработка веб-сервисов осень 2013 лекция 5Technopark
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerValeriya Atamanova
 
Консалтинг высоконагруженных web систем
Консалтинг высоконагруженных web системКонсалтинг высоконагруженных web систем
Консалтинг высоконагруженных web системMedia Gorod
 

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

Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
Use case in action
Use case in actionUse case in action
Use case in action
 
JEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыJEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советы
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важно
 
Проектирование программных систем. Занятие 4
Проектирование программных систем. Занятие 4Проектирование программных систем. Занятие 4
Проектирование программных систем. Занятие 4
 
JavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia Redunova
 
Как выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиКак выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиями
 
Как выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиКак выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиями
 
Choose method for requirements Tsepkov Analyst Days-2017
Choose method for requirements Tsepkov Analyst Days-2017Choose method for requirements Tsepkov Analyst Days-2017
Choose method for requirements Tsepkov Analyst Days-2017
 
Solid code via tdd
Solid code via tddSolid code via tdd
Solid code via tdd
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
 
лек11 7
лек11 7лек11 7
лек11 7
 
лек11 7
лек11 7лек11 7
лек11 7
 
Разработка веб-сервисов осень 2013 лекция 5
Разработка веб-сервисов осень 2013 лекция 5Разработка веб-сервисов осень 2013 лекция 5
Разработка веб-сервисов осень 2013 лекция 5
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен Dagger
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Консалтинг высоконагруженных web систем
Консалтинг высоконагруженных web системКонсалтинг высоконагруженных web систем
Консалтинг высоконагруженных web систем
 
DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!
 

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

  • 1.
  • 2.  Что такое «плохой» дизайн кода  в чем он выражается  какие несет проблемы  Принципы проектирования SOLID  Назначение  Примеры использования  Как обнаруживать и устранять плохой дизайн кода  Запахи кода  Системы статического анализа кода
  • 3.
  • 4. Повторение  Отсутствие возможности повторного использования кода  Монолитность  Плохая читаемость кода  Неоправданная сложность  Вязкость  Хрупкость
  • 5.
  • 6. Внесение изменений в систему, которая проектировалась без учета возможности появления таковых  Изменения в системе могут потребоваться на любой стадии проекта:  Аналитика  Разработка  Сопровождение
  • 7. Отсутствие формализированных требований со стороны клиента  Уточнение требований на этапе разработки, после утверждения ТЗ  Реализация дополнительного функционала на этапе технического сопровождения системы
  • 8. Мы должны помнить об этом  Строить процесс разработки итеративно, с поправкой на то, чтобы внесение последующих изменений стоило нам как можно меньше ресурсов
  • 9.
  • 11. Сложно выделить компоненты, которые можно использовать повторно
  • 13.
  • 14. В системе есть инфраструктура, которая или не используется, или используется неправильно
  • 15. Делать что-то правильно сложнее, чем делать это неправильно
  • 16. Изменения легко ломают систему и приводят к новым изменениям
  • 17.
  • 18.  Single Responsibility  Open/Closed  Liskov Substitution  Interface Segregation  Dependency Inversion
  • 19. SOLID - это аббревиатура пяти основных принципов дизайна классов в объектно- ориентированном проектировании
  • 20. Были сформулированы Робертом Мартином в далеком 1995 году
  • 21.
  • 22. У класса есть только одна ответственность, он умеет ее делать и делает ее хорошо. Не должно быть больше одной причины для изменения класса.
  • 23. Пример приложения «Прямоугольник»: Требования: Расчет площади прямоугольника Вывод изображения прямоугольника на UI
  • 24.
  • 25.
  • 26. Пример приложения «Модем»: Требования: Установка соединения по телефонному номеру Завершение соединения Отправка данных Прием данных
  • 27.
  • 28.
  • 29. У класса есть только одна ответственность, он умеет ее делать и делает ее хорошо. Не должно быть больше одной причины для изменения класса.
  • 30.
  • 31. Программные сущности (классы, модули, методы и т.д.) должны быть открыты для расширения, но закрыты от изменений
  • 33. Классы должны зависеть от абстракций Новые фичи могут быть добавлены путем реализации абстракций
  • 35. Приложение «Почтовый клиент» Требования: Отправка почты Запись результатов работы в файл
  • 36.
  • 37.
  • 38. Приложение «Почтовый клиент» Новое требование: Запись результатов работы на диск
  • 39.
  • 40.
  • 42.
  • 43.
  • 44.
  • 46. Задача: Разработать класс, реализующий шифрование данных при помощи алгоритмов DES и RSA
  • 47.
  • 48.
  • 49.
  • 50. Программные сущности (классы, модули, методы и т.д.) должны быть открыты для расширения, но закрыты от изменений
  • 51.
  • 52. Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.
  • 53. Клиенты, использующие базовый класс, должны работать и с его наследниками, не зная этого
  • 54. Задача Мы хотим реализовать свой список с интерфейсом IList<T>. Его особенностью будет то, что все записи в нем дублируются. Данная реализация не представляет никакой опасности, если рассматривать ее изолированно.
  • 55. Взглянем на использование этого класса с точки зрения клиента. Клиент, абстрагируясь от реализаций, пытается работать со всеми объектами типа IList одинаково:
  • 56. Поведение списка DoubleList отличается от типичных реализаций IList. Получается, что наш DoubleList не может быть заменен базовым типом. Это и есть нарушение принципа замещения Лисков. Проблема заключается в том, что теперь клиенту необходимо знать о конкретном типе объекта, реализующем интерфейс IList. В качестве такого объекта могут передать и DoubleList, а для него придется выполнять дополнительную логику и проверки.
  • 57. Решение Правильным решением будет использовать свой собственный интерфейс, например, IDoubleList. Этот интерфейс будет объявлять для пользователей поведение, при котором добавляемые элементы удваиваются.
  • 59. Предусловия не могут быть ужесточены в наследнике  Постусловия не могут быть ослаблены в наследнике  Инварианты базового типа должны соблюдаться и в наследнике
  • 60. Рассмотрим пред и постусловия для интерфейса IList. Для функции Add: •предусловие: item != null •постусловие: count = oldCount + 1 Для нашего DoubleList и его функции Add: •предусловие: item != null •постусловие: count = oldCount + 2
  • 61.
  • 62.
  • 63. Клиентам не должны навязываться интерфейсы, которые им не нужны
  • 64.
  • 65.
  • 66. Много небольших интерфейсов лучше чем один большой
  • 67.
  • 68. Зависимости внутри системы строятся на основе абстракций.  Модули верхнего уровня не зависят от модулей нижнего уровня.  Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
  • 69. Приложение «Печатная машинка» Приложение должно уметь:  Читать текст с клавиатуры  Выводить текст на печать на принтер
  • 70.
  • 71.
  • 72. Приложение «Печатная машинка» Появилось новое требование  Приложение должно уметь сохранять текст на диск
  • 73.
  • 75.
  • 76.
  • 77. Отсутствие инверсии зависимостей не всегда плохо. Пример, зависимость от класса String.
  • 78. Зависимости внутри системы строятся на основе абстракций.  Модули верхнего уровня не зависят от модулей нижнего уровня.  Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
  • 79.
  • 80.
  • 81. Проводить ревью кода Находить «запахи» кода Использовать статические анализаторы кода
  • 82.
  • 83.
  • 84.
  • 85.
  • 86. You Aren’t Gonne Need It Keep It Simple Stupid
  • 87. Что такое плохой дизайн и откуда он берется  Как использовать принципы SOLID для улучшения дизайна  Как поддерживать код в хорошем состоянии
  • 88.  Материалы 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/
  • 89. Трѐшников Павел  Ведущий разработчик СМС-ИТ ▪ www.sms-automation.ru  e-mail: treshnikov@gmail.com  twitter: @treshnikov

Editor's Notes

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