Шаблоны проектирования: основы велосипедостроения

Post on 20-Nov-2014

1.482 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Открытый семинар для студентов в компании CUSTIS (6 июня 2013). Лектор: Иван Мальцев, ведущий разработчик Java, сертифицированный разработчик Oracle (OCPJP). Аннотация: Шаблон проектирования — воспроизводимая архитектурная конструкция, представляющая собой решение проблемы проектирования в условиях определенного часто возникающего контекста. Из семинара вы узнаете о выборе и особенностях применения шаблонов проектирования, а также о конкретных способах реализации отдельных паттернов (и антипаттернов). Видеозапись семинара: https://vimeo.com/68121505.

TRANSCRIPT

Шаблоны проектирования:

основы велосипедостроения

Иван Мальцев

Ведущий разработчик Java

6 июня 2013 года

Who is who?

В CUSTIS – ведущий Java-разработчик

3 года преподаю в МИФИ

курс «Технология программирования»

Кодинг 10+ лет, на Java – 5+

Языки: 90% Java (и все, что около);

в юношестве: С\С++, PHP\JS, Delphi

Пишу диссер в области ИИ

@ivan_maltsev

imaltsev87

2/50

Планчик

Предисловие:

что нам стоит велосипед построить?

Принципы ООП

Шаблонное мышление

Применение шаблонов

3/50

Привет

Юре Солдаткину

;))

Ограничения

Рассматриваем разработку прикладного ПО

Языки общего назначения (C#, Java, C++)

Много UML

Кода тоже достаточно

4/50

Вместо предисловия

5/50

Я его слепила из того, что было…

6/50

Facepalm

7/50

Есть контакт?

8/50

Принципы ООП (S.O.L.I.D.)

9/50

Что такое S.O.L.I.D.?

S – Single Responsibility Principle (SRP)

(принцип единой ответственности)

O – Open/Closed Principle (OCP)

(принцип открытоcти/закрытости)

L – Liskov Substitution Principle (LSP)

(принцип замещения Лисков)

I – Interface Segregation Principle (ISP)

(принцип разделения интерфейса)

D – Dependency Inversion Principle (DIP)

(принцип инверсии зависимостей)

10/50

Зачем?

Помогают построить архитектуру приложения,

которое с течением времени будет проще

(дешевле) поддерживать и развивать

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

помогают ≠

гарантируют

11/50

Принцип единой ответственности

Single Responsibility Principle (SRP):

Не должно быть больше одной причины

для изменения класса

Почему?

Иначе получим хрупкий дизайн (пишем одно –

ломаем другое)

12/50

Принцип открытости/закрытости

Open Close Principle (OCP):

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

функции и т. п.) должны быть открыты

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

Почему?

Чтобы легко реагировать на изменения

бизнес-логики

13/50

Принцип замещения Лисков

Liskov's Substitution Principle (LSP):

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

базовыми типами (упр.)

Почему?

Потому что клиентский код начинает

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

базового, и возможно появление кода, явно

использующего этот факт

14/50

Принцип разделения интерфейса

Interface Segregation Principle (ISP):

Клиенты не должны зависеть от методов,

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

Почему?

Универсальный интерфейс приводит

к появлению множества «заглушек»

и, соответственно, ко множеству лишнего

кода, который неудобно поддерживать

15/50

Принцип инверсии зависимостей

Dependency Inversion Principle (DIP):

Модули верхних уровней не должны зависеть

от модулей нижних уровней. Оба типа модулей

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

не должны зависеть от деталей. Детали должны

зависеть от абстракций

Почему?

Иначе возникает паутина зависимостей,

превращающая реализацию очередного

изменения требований в настоящий кошмар

16/50

Из серии «КЭП советует»:

YAGNI (You Ain't Gonna Need It,

«Вам это не понадобится»):

Отказ добавления функциональности,

в которой нет непосредственной надобности

Зачем делать то, что может никогда

не понадобиться?

Почему?

17/50

Брюс Тогназзини:

Пролистав книгу о принципах магии

и не взглянув на обложку, сложно не решить,

что это книга о разработке программного

обеспечения.

18/50

«Шаблонное мышление»

19/50

Шаблоны проектирования

Design Pattern

Шаблон (паттерн) представляет собой формализованное

описание часто встречающейся задачи проектирования,

удачное решение данной задачи, а также рекомендации

по применению этого решения в различных ситуациях

Абстракция объектов, классов и их взаимодействия

Классический шаблон проектирования обязательно

имеет:

Название (несколько)

Проблема: мотивация, контекст, условия применения

Решение: UML-подобная диаграмма, (псевдо)код

Последствия: выигрыш и компромиссы

20/50

Почему?

Название прижилось в 70-х годах после

выхода в свет книги по архитектуре

(Кристофер Александер)

В 1987 г. Кент Бек и Вард Каннигем применили

эти идеи в разработке графических оболочек

на языке SmallTalk

В 1988 г. Эрих Гамма написал докторскую

о приложении идей шаблонов к разработке ПО

В 1991 г. Джеймс Коплин опубликовал книгу

Advanced C++ Idioms

21/50

Зачем?

Повышает устойчивость системы

к изменению требований

Понять чужой код гораздо быстрее

Меньше времени, которое тратится

на обсуждение и принятие решения

Одинаковое понимание дизайна

Понимание работы сторонних

инструментов и библиотек

22/50

«Банда четырех» (Gang of Four)

Эрих Гамма

Ричард Хелм

Ральф Джонсон

Джон Влиссидс

«Приемы объектно-ориентированного

проектирования. Паттерны проектирования»

23/50

Классификация GoF-шаблонов

Порождающие шаблоны (Creational) абстрагируют

процесс создания объектов и позволяют сделать

систему независимой от способа создания,

композиции и представления объектов

Структурные шаблоны (Structural) определяют

различные сложные структуры, которые изменяют

интерфейс уже существующих объектов или его

реализацию

Поведенческие шаблоны (Behavioral) определяют

взаимодействие между объектами, увеличивая

таким образом его гибкость

24/50

Все GoF шаблоны

23 шт.

25/50

Шаблоны тут, шаблоны там

Шаблоны многопоточного программирования

MVC (Model-View-Controller)

Шаблоны корпоративных приложений

(интеграционные)

Аналитические шаблоны

IoC (Inversion of Control)

GRASP-шаблоны

распределения обязанностей

Антишаблоны

Привет

Сергею Кошелю

;))

26/50

Pit Stop

27/50

Применение шаблонов

Design

28/50

Производящие шаблоны

29/50

Игровой мир

Singleton (одиночка)

Гарантирует, что класс имеет только один

экземпляр в приложении и предоставляет

глобальную точку доступа к этому экземпляру

30/50

Варианты реализации Singleton Thread-safe (см. Double check locking)

Lazy vs Non-lazy

Enumeration – проще всего

Не стоит злоупотреблять частым

применением – может привести

к множеству глобальных зависимостей

31/50

Элементы игровой карты

Factory Method (Фабричный метод)

Определяет интерфейс для создания

объектов

Делегирует создание объектов своим

наследникам

Пример: создание элементов

карты игрового мира

32/50

Фабричный метод изнутри

Два вида файлов текстур: зимние и летние

Как они выглядят, нам не важно, но мы знаем,

что мы получим тот вид, который хотим

Фабрика загружает текстуру из файла

в память

Создает элемент карты, содержащий

текстуру

Возвращает готовый элемент карты

классу-клиенту

33/50

Фабричный метод снаружи

34/50

Вопрос

Что будет, если объединить несколько

фабричных методов в одном интерфейсе?

Ответ – абстрактная фабрика

Предоставляет интерфейс для создания

семейств взаимосвязанных объектов,

не специфицируя их конкретных классов

35/50

Абстрактная фабрика

36/50

Builder (Строитель) Фабричный метод для сложных объектов

Создает объект не весь сразу, а по частям

Пример: строитель всей игровой карты

Делегирует вызовы соответствующим

абстрактным фабрикам

Составом объекта управляет

класс-клиент

37/50

Структурные шаблоны

38/50

Adapter (Адаптер)

Система поддерживает требуемые данные

и поведение, но имеет неподходящий

интерфейс

Предусматривает создание класса-

оболочки с требуемым интерфейсом

39/50

Пример адаптера Интеграция с социальной сетью

40/50

А если хотим все сразу?

Задача: обеспечить унифицированный интерфейс

с набором разных компонент другой подсистемы

Решение: интерфейс, который абстрагирует работу

с несколькими адаптерами

Пример: интеграция с множеством социальных сетей

41/50

Вконташа разочаровала Переделали API доступа и стали возвращать

пользователя в другом методе

На помощь нам приходит шаблон Decorator

42/50

Поведенческие шаблоны

43/50

Котики-наблюдатели

Observer (Наблюдатель)

Также известен как «издатель-подписчик»

(Publisher-Subscriber)

Задача: сделать в игре счетчики ресурсов,

то есть золото, дерево и т. д.

44/50

Реализация наблюдателя

Рабочий

Счетчик

золота

45/50

Strategy (Стратегия)

Необходимо изменять поведение юнитов

во время игры (динамически)

Похож на фабрику, но не создает объектов,

а реализует их поведение

Альтернатива множеству условных переходов

(«переключателей»)

46/50

А как реализовать управление? Нужно, чтобы юниты перемещались

по нажатию мышки

Обработчик мышки и юниты независимы

Command (Команда) Обработчик

Юнит

47/50

А как изменять состояние? State (состояние)

Изменяем уровень прокачки юнита

Необходимо гарантировать

последовательность переходов

48/50

Литература

49/50

Спасибо!

Вопросы?

Спасибо!

Вопросы?

Иван Мальцев

maltsev@custis.ru

50/50

top related