design principles

33
Гавриленко Евгений .NET Engineer @Lohika Mail: [email protected]

Upload: -

Post on 03-Dec-2014

2.807 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Design principles

Гавриленко Евгений.NET Engineer @Lohika

Mail: [email protected]

Page 2: Design principles

Слабая связанность и критерии хорошего дизайна

Page 3: Design principles

Цели проектирования

Page 4: Design principles

Перед проектом

Page 5: Design principles

За день до релиза

Page 6: Design principles

Что пошло не так?

Page 7: Design principles

К чему стремимся

• Гибкость• Надежность• Компонентность• Чистый и понятный код• Визуализация

Page 8: Design principles

S.O.L.I.D.

Page 9: Design principles

Single Responsibility Principle

• Класс должен иметь лишь одну возможную причину для изменений.

Page 10: Design principles

Demo

• SRP violation

Page 11: Design principles

Open/Close Principle

• Класс открыт для расширения– новое поведение может добавиться в будущем

• Закрыт для модификации– изменения в код класса не допускаются

Page 12: Design principles

Demo

• OCP violation

Page 13: Design principles

Как это сделать?

• Параметры– лямбда/делегаты

• Наследование– дочерние классы переопределяют поведение родительского

класса

• Композиция/Strategy– передаем абстракцию– используем этот класс в существующем для реализации

расширений

Page 14: Design principles

Liskov Substitution Principle

• Подтипы должны быть заменяемы базовыми типами

Page 15: Design principles

Liskov Substition Principle

• Is – a• Is – substitutable – for

• Дочерние классы не должны нарушать поведения родительских контрактов (пред-условия и пост-условия)

Page 16: Design principles

Liskov Substitution Principle

• LSP violation

Page 17: Design principles

Liskov Substitution Principle

• Создаем новый класс– два класса делят функциональность, но не заменяемы– можно создать 3 класс от которого пронаследовать эти

два класс– Убедится что классы наследники и родитель

заменяемы

Page 18: Design principles

Interface Segregation Pinciple

• Принцип разделения интерфейсов– Клиенты не должны зависить от методов

которые они не используют

Page 19: Design principles

Interface Segregation Principle

• Лишняя абстракция в наследовании• «Жирный» интерфейс

Page 20: Design principles

Interface Segregation Principle

Page 21: Design principles

Dependency Inversion Principle

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

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

Page 22: Design principles
Page 23: Design principles

Зависимости

• Внешние библиотеки• База данных• Статические методы• New keyword• Сетевые взаимодействия• System Clock• Random

Page 24: Design principles

Зависимости класса

• Конструктор класса должен указывать зависимости в которых он нуждается (явные зависимости)

• Остальные классы работают со скрытыми зависимостями

Page 25: Design principles

Demo

• DIP violation

Page 26: Design principles

Dependency Injection

• Техника когда вызывающий класс поставляет(to inject) зависимости вызываемому классу

• 3 основных способа:• Через конструктор• Через свойство• Через параметр

Page 27: Design principles

Constructor Injection

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

• Против– может быть много параметров в конструкторе (ds)– не всем методам нужны переданные параметры (ds)– иногда нужен конструктор без параметров

Page 28: Design principles

Property Injection

• За – зависимость можно передать в любой момент– очень гибко

• Против– Объект может быть в нестабильнос состоянии если какая-то

из зависимостей не передана– менее явно

Page 29: Design principles

Parameter Injection

• За– Не нужно менять весь класс– очень гибко

• Против– путает сигнатуру метода– много параметров (ds)

Page 30: Design principles

Demo

Page 31: Design principles

Где создавать объекты?• Конструктор по умолчанию без параметров (poor man’s ioc)• composition root• IoC container

Page 32: Design principles

IoC Container• Инициализируют граф объектов• Регистрируют типы объектов• Разрешают типы объектов• Можно использовать как код так и конфигурацию

Page 33: Design principles

Harlem Shake!