51
Шаблоны ООП. Рефакторинг Разработка бизнес приложений Лекция 7

разработка бизнес приложений (7)

Embed Size (px)

DESCRIPTION

Курс лекций для СТАНКИН. 2011 год.

Citation preview

Page 1: разработка бизнес приложений (7)

Шаблоны ООП. Рефакторинг

Разработка бизнес приложений Лекция 7

Page 2: разработка бизнес приложений (7)

Зачем нужны шаблоны

• Основная сложность разработки бизнес ПО - подобрать готовые решения и шаблоны, заставить все работать вместе и следить за сложностью (стоимостью) поддержки.

• Все уже придумано до нас

Page 3: разработка бизнес приложений (7)

Что такое шаблон ООП

• Шаблон это просто идея взаимодействия группы объектов (сущностей, классов). Реализация может быть очень разной

• Шаблоны – это общий язык общения разработчиков

Page 4: разработка бизнес приложений (7)

ШАБЛОНЫ ООП ПРОЕКТИРОВАНИЯ

Page 5: разработка бизнес приложений (7)

ПОРОЖДАЮЩИЕ ШАБЛОНЫ

Page 6: разработка бизнес приложений (7)

Abstract Factory. Фабрика

• Цель – скрыть тип создаваемого объекта• Так же известен как Factory / FactoryMethod• Используется везде

ProductFactoryA

Product<<Interface>>

ProductA

ProductB

creates

return new ProductA();

ProductFactory

createProduct()

<<Interface>>

ProductFactoryBcreates

return new ProductB();

Page 7: разработка бизнес приложений (7)

Singleton. Синглетон.

• Нужен что бы инкапсулировать жизненный цикл объекта

• Чаще всего используется (или приводит к) для эмуляции процедурного программирования

• Т.е. в 99% страшное зло

Singleton

Singleton instance

getInstance()

return instance;

НЕ ИСПОЛЬЗОВАТЬ

Page 8: разработка бизнес приложений (7)

Другие порождающие шаблоны

• Prototype– Для создания дорогих объектов

• Builder– Когда конструктор становится слишком

сложным (напр. много параметров) и не имеющим отношения к классу

– Для создания многих похожих объектов подряд (или клонирования)

Page 9: разработка бизнес приложений (7)

СТРУКТУРНЫЕ ШАБЛОНЫ

Page 10: разработка бизнес приложений (7)

Adapter

• Предоставляет единый (адаптированный) интерфейс для нескольких схожих подсистем

• Часто используется там, где есть различные протоколы интеграции со схожими системами

Consumer

performOperation()

Adapter

operation()

<<Interface>>

AdapterA

AdapteeA

AdapterB

AdapteeB

public void performOperation(){ ... adapter.operation();...}

Page 11: разработка бизнес приложений (7)

Proxy

• Реализует тот же интерфейс что и оригинальный объект для прозрачного добавления какого-нибудь функционала

• Ленивая загрузка, удаленный объект, тесты и т.п.

Service

operation()

<<Interface>>

ServiceImpl

operation()

Client

ServiceProxy

operation()

+target

Page 12: разработка бизнес приложений (7)

Facade

• Предоставляет четкий интерфейс множества подсистем, часто ограничивая сложность подсистем

• Классическое использование – интерфейс к доменной модели

SubsystemA

SubsystemB

SubsystemC

ExternalConsumer

Facade

operation1()operation2()operation3()operation4()operation5()

Page 13: разработка бизнес приложений (7)

Composite

• Дерево вложенных друг в друга однотипных объектов• Писать приходится не часто, но очень часто используется

в стандартных фреймворках (особенно UI). К примеру, XML парсер.

Node

operation()

Composite

add(Component component)remove(Component component)operation()

Component

operation()

<<Interface>>

0..n0..n

вызов метода operation() для каждого дочернего компонента

Page 14: разработка бизнес приложений (7)

ПОВЕДЕНЧЕСКИЕ ШАБЛОНЫ

Page 15: разработка бизнес приложений (7)

Template method

• Мощнейший комплимент наследованию• Используется повсеместно, для

ограничения нарушения инкапсуляции наследованием

AbstractClass

templateMethod()subOperation1()subOperation2()

ConcreteClass

subOperation1()subOperation2()

templateMethod(){ ... subOperation1(); ... subOperation2(); ...}

Page 16: разработка бизнес приложений (7)

Command

• Абстракция любой операции. Если объединить с composite, позволяет строить системы абстрактного выполнения команд группами.

• Уменьшение кол-ва удаленных вызовов, UNDO, транзакции, TCP/IP пакеты

Command

execute()

<<Interface>>

ConcreteCommandUsercreates

Executor

execute(command : Command)executes

+executor

Page 17: разработка бизнес приложений (7)

Strategy

• В чем отличие от команды?• Абстракция конкретного алгоритма, с параметрами

Page 18: разработка бизнес приложений (7)

State

• Моделирует объект у которого много разных состояний

• Упрощает выражение схемы взаимодействия состояний, ее изменение и расширение

Page 19: разработка бизнес приложений (7)

Chain of resp. (FilterChain)

• Модель цепочки обработчиков, позволяет легко добавлять / удалять обработчики

• Обработка HTTP запросов

Page 20: разработка бизнес приложений (7)

Другие

• Observer (Publisher / Subscriber)– События – один публикует события, другие ждут,

наблюдают и обрабатывают. В C# реализовано на уровне языка

• Iterator– Шаблон организации итератора по коллекции /

объекту. С C# и многих других языках реализовано по умолчанию (IEnumerable)

• Visitor – Позволяет «добавить» метод к целой иерархии (или

просто набору) классов. Сложно, но бывает нужно.

Page 21: разработка бизнес приложений (7)

РЕФАКТОРИНГ

Page 22: разработка бизнес приложений (7)

Рефакторинг это

• Преобразование существующего кода без изменения функциональности с целью:– Сделать его лучше и проще в поддержке– Сделать возможным добавление каких-то

новых функций– Иногда решить другие проблемы (напр.

производительности)

Page 23: разработка бизнес приложений (7)

Запахи кода

• Дублирование кода (Simian)• Длинные методы (Unix!)• Большой класс• Много параметров• Цикломатическая сложность• Switch• Группы данных• Пустые классы данных

Page 24: разработка бизнес приложений (7)

Запахи кода

• Много точек изменений по одному поводу• Очень высокая связность• Лишний или «на будущее» код• Глубокие цепочки вызовов в клиентах• Отказ от наследства• Комментарии

Page 25: разработка бизнес приложений (7)

«Научные» принципы

• Single Responsibility• Open for extension, closed for modification• Liskov substitution (объекты всегда

заменимы объектами-наследниками)• Interface segregation (больше специфичных

интерфейсов)• Depend upon abstractions

Page 26: разработка бизнес приложений (7)

«Научные» принципы

• Single point of change (единая точка изменений)

• Separation of concerns (SoC) (разделение понятий)

• Command-query separation (СQS) (разделение запросов и команд)

• Единый уровень абстракции

Page 27: разработка бизнес приложений (7)

Agile принципы

• YAGNI– You ain’t gonna need it

• KISS– Keep it stupid simple

• DRY– Don’t repeat yourself

Page 28: разработка бизнес приложений (7)

НЕКОТОРЫЕ РЕФАКТОРИНГИ

Page 29: разработка бизнес приложений (7)

Инкапсуляция поля

Page 30: разработка бизнес приложений (7)

Банальные

• Подвинуть метод• Подвинуть поле• Опустить поле / метод вниз / вверх по

иерархии• Замена магических чисел константами• Кодов ошибки эксепшенами и прочии и

касающиеся стиля

Page 31: разработка бизнес приложений (7)

Самый важный

Page 32: разработка бизнес приложений (7)

И дальше – объект параметр

Page 33: разработка бизнес приложений (7)

Потом инкапсуляция всего

• А также полей, методов и всего остального

Page 34: разработка бизнес приложений (7)

Метод -> объект

Page 35: разработка бизнес приложений (7)

Switch -> полиморфизм

Page 36: разработка бизнес приложений (7)

Тип объекта -> наследование

Page 37: разработка бизнес приложений (7)

Тип объекта -> state / strategy

Page 38: разработка бизнес приложений (7)

Выделить класс (и наоборот)

Page 39: разработка бизнес приложений (7)

Выделить наследника (и наоборот)

Page 40: разработка бизнес приложений (7)

Выделить базовый класс (и обратно)

Page 41: разработка бизнес приложений (7)

Выделить template метод

Page 42: разработка бизнес приложений (7)

Выделить интерфейс

Page 43: разработка бизнес приложений (7)

Наследование -> композиция

Page 44: разработка бизнес приложений (7)

Null объект

Page 45: разработка бизнес приложений (7)

UI –> Model / UI

Page 46: разработка бизнес приложений (7)

Рефакторинг – это круто

• При наличии тестов / спецификации• При наличии конкретной цели / юскейза• 99% рефакторингов – обратимы, нечего

терять• Рефакторинг поддерживает принципы

YAGNI / KISS • Полный список рефакторингов -> книга / сайт

(www.refactoring.com), но он бесконечный

Page 47: разработка бизнес приложений (7)

Ресурсы

• Приемы объектно-ориентированного проектирования. Паттерны проектирования

• Рефакторинг. Улучшение существующего кода

• Чистый код. Создание, анализ и рефакторинг

• Google “<Pattern name> pattern” + картинки)• Google “<аббревиатура>”

Page 48: разработка бизнес приложений (7)

Темы для докладов

• AOP• Kanban / Lean (Карпов)• SCRUM: Team / ScrumMaster – подробнее

про процесс (DS, Retro, SprintPlan, Demo…)• Portfolio management, BMG (Alex Ostervald),

Scrum of Scrum• NoSql БД• Реализация ООП в Javascript (прототипы)

Page 49: разработка бизнес приложений (7)

Объявлениея

• В следующий четверг лекции не будет– www.msteched.ru

• Давайте решать что делать со временем лекций

• И с лабами, времени остается все меньше

Page 50: разработка бизнес приложений (7)

Лабы

• Обработка открытых данных– http://minenergo.gov.ru/activity/statistic/,http://www.fms.gov.ru/about/ofstat/,

http://www.federalspace.ru/main.php?id=10, http://ivan.begtin.name/2011/10/02/gosuslugijson/

• Индивидуальное задание (для тех, у кого уже есть что показать)

• Нужно:– Или наличие БД– Или наличие веб интерфейса– Отчет по лабам

• Стажировка (Тестер / Разработчик)– Нужно знание: C#, MS MVC, MS SQL Server

Page 51: разработка бизнес приложений (7)

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

• Никита Филлипов (www.ScrumTrek.ru)– Курс SCPO Msk (31.08.11)

• Бочков Илья (Архитектура корпоративных приложений, МИФИ)

• MIT: electrical-engineering-and-computer-science– http

://ocw.mit.edu/courses/#electrical-engineering-and-computer-science