разработка бизнес приложений (7)
DESCRIPTION
Курс лекций для СТАНКИН. 2011 год.TRANSCRIPT
![Page 1: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/1.jpg)
Шаблоны ООП. Рефакторинг
Разработка бизнес приложений Лекция 7
![Page 2: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/2.jpg)
Зачем нужны шаблоны
• Основная сложность разработки бизнес ПО - подобрать готовые решения и шаблоны, заставить все работать вместе и следить за сложностью (стоимостью) поддержки.
• Все уже придумано до нас
![Page 3: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/3.jpg)
Что такое шаблон ООП
• Шаблон это просто идея взаимодействия группы объектов (сущностей, классов). Реализация может быть очень разной
• Шаблоны – это общий язык общения разработчиков
![Page 4: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/4.jpg)
ШАБЛОНЫ ООП ПРОЕКТИРОВАНИЯ
![Page 5: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/5.jpg)
ПОРОЖДАЮЩИЕ ШАБЛОНЫ
![Page 6: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/6.jpg)
Abstract Factory. Фабрика
• Цель – скрыть тип создаваемого объекта• Так же известен как Factory / FactoryMethod• Используется везде
ProductFactoryA
Product<<Interface>>
ProductA
ProductB
creates
return new ProductA();
ProductFactory
createProduct()
<<Interface>>
ProductFactoryBcreates
return new ProductB();
![Page 7: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/7.jpg)
Singleton. Синглетон.
• Нужен что бы инкапсулировать жизненный цикл объекта
• Чаще всего используется (или приводит к) для эмуляции процедурного программирования
• Т.е. в 99% страшное зло
Singleton
Singleton instance
getInstance()
return instance;
НЕ ИСПОЛЬЗОВАТЬ
![Page 8: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/8.jpg)
Другие порождающие шаблоны
• Prototype– Для создания дорогих объектов
• Builder– Когда конструктор становится слишком
сложным (напр. много параметров) и не имеющим отношения к классу
– Для создания многих похожих объектов подряд (или клонирования)
![Page 9: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/9.jpg)
СТРУКТУРНЫЕ ШАБЛОНЫ
![Page 10: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/10.jpg)
Adapter
• Предоставляет единый (адаптированный) интерфейс для нескольких схожих подсистем
• Часто используется там, где есть различные протоколы интеграции со схожими системами
Consumer
performOperation()
Adapter
operation()
<<Interface>>
AdapterA
AdapteeA
AdapterB
AdapteeB
public void performOperation(){ ... adapter.operation();...}
![Page 11: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/11.jpg)
Proxy
• Реализует тот же интерфейс что и оригинальный объект для прозрачного добавления какого-нибудь функционала
• Ленивая загрузка, удаленный объект, тесты и т.п.
Service
operation()
<<Interface>>
ServiceImpl
operation()
Client
ServiceProxy
operation()
+target
![Page 12: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/12.jpg)
Facade
• Предоставляет четкий интерфейс множества подсистем, часто ограничивая сложность подсистем
• Классическое использование – интерфейс к доменной модели
SubsystemA
SubsystemB
SubsystemC
ExternalConsumer
Facade
operation1()operation2()operation3()operation4()operation5()
![Page 13: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/13.jpg)
Composite
• Дерево вложенных друг в друга однотипных объектов• Писать приходится не часто, но очень часто используется
в стандартных фреймворках (особенно UI). К примеру, XML парсер.
Node
operation()
Composite
add(Component component)remove(Component component)operation()
Component
operation()
<<Interface>>
0..n0..n
вызов метода operation() для каждого дочернего компонента
![Page 14: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/14.jpg)
ПОВЕДЕНЧЕСКИЕ ШАБЛОНЫ
![Page 15: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/15.jpg)
Template method
• Мощнейший комплимент наследованию• Используется повсеместно, для
ограничения нарушения инкапсуляции наследованием
AbstractClass
templateMethod()subOperation1()subOperation2()
ConcreteClass
subOperation1()subOperation2()
templateMethod(){ ... subOperation1(); ... subOperation2(); ...}
![Page 16: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/16.jpg)
Command
• Абстракция любой операции. Если объединить с composite, позволяет строить системы абстрактного выполнения команд группами.
• Уменьшение кол-ва удаленных вызовов, UNDO, транзакции, TCP/IP пакеты
Command
execute()
<<Interface>>
ConcreteCommandUsercreates
Executor
execute(command : Command)executes
+executor
![Page 17: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/17.jpg)
Strategy
• В чем отличие от команды?• Абстракция конкретного алгоритма, с параметрами
![Page 18: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/18.jpg)
State
• Моделирует объект у которого много разных состояний
• Упрощает выражение схемы взаимодействия состояний, ее изменение и расширение
![Page 19: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/19.jpg)
Chain of resp. (FilterChain)
• Модель цепочки обработчиков, позволяет легко добавлять / удалять обработчики
• Обработка HTTP запросов
![Page 20: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/20.jpg)
Другие
• Observer (Publisher / Subscriber)– События – один публикует события, другие ждут,
наблюдают и обрабатывают. В C# реализовано на уровне языка
• Iterator– Шаблон организации итератора по коллекции /
объекту. С C# и многих других языках реализовано по умолчанию (IEnumerable)
• Visitor – Позволяет «добавить» метод к целой иерархии (или
просто набору) классов. Сложно, но бывает нужно.
![Page 21: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/21.jpg)
РЕФАКТОРИНГ
![Page 22: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/22.jpg)
Рефакторинг это
• Преобразование существующего кода без изменения функциональности с целью:– Сделать его лучше и проще в поддержке– Сделать возможным добавление каких-то
новых функций– Иногда решить другие проблемы (напр.
производительности)
![Page 23: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/23.jpg)
Запахи кода
• Дублирование кода (Simian)• Длинные методы (Unix!)• Большой класс• Много параметров• Цикломатическая сложность• Switch• Группы данных• Пустые классы данных
![Page 24: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/24.jpg)
Запахи кода
• Много точек изменений по одному поводу• Очень высокая связность• Лишний или «на будущее» код• Глубокие цепочки вызовов в клиентах• Отказ от наследства• Комментарии
![Page 25: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/25.jpg)
«Научные» принципы
• Single Responsibility• Open for extension, closed for modification• Liskov substitution (объекты всегда
заменимы объектами-наследниками)• Interface segregation (больше специфичных
интерфейсов)• Depend upon abstractions
![Page 26: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/26.jpg)
«Научные» принципы
• Single point of change (единая точка изменений)
• Separation of concerns (SoC) (разделение понятий)
• Command-query separation (СQS) (разделение запросов и команд)
• Единый уровень абстракции
![Page 27: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/27.jpg)
Agile принципы
• YAGNI– You ain’t gonna need it
• KISS– Keep it stupid simple
• DRY– Don’t repeat yourself
![Page 28: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/28.jpg)
НЕКОТОРЫЕ РЕФАКТОРИНГИ
![Page 29: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/29.jpg)
Инкапсуляция поля
![Page 30: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/30.jpg)
Банальные
• Подвинуть метод• Подвинуть поле• Опустить поле / метод вниз / вверх по
иерархии• Замена магических чисел константами• Кодов ошибки эксепшенами и прочии и
касающиеся стиля
![Page 31: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/31.jpg)
Самый важный
![Page 32: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/32.jpg)
И дальше – объект параметр
![Page 33: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/33.jpg)
Потом инкапсуляция всего
• А также полей, методов и всего остального
![Page 34: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/34.jpg)
Метод -> объект
![Page 35: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/35.jpg)
Switch -> полиморфизм
![Page 36: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/36.jpg)
Тип объекта -> наследование
![Page 37: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/37.jpg)
Тип объекта -> state / strategy
![Page 38: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/38.jpg)
Выделить класс (и наоборот)
![Page 39: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/39.jpg)
Выделить наследника (и наоборот)
![Page 40: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/40.jpg)
Выделить базовый класс (и обратно)
![Page 41: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/41.jpg)
Выделить template метод
![Page 42: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/42.jpg)
Выделить интерфейс
![Page 43: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/43.jpg)
Наследование -> композиция
![Page 44: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/44.jpg)
Null объект
![Page 45: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/45.jpg)
UI –> Model / UI
![Page 46: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/46.jpg)
Рефакторинг – это круто
• При наличии тестов / спецификации• При наличии конкретной цели / юскейза• 99% рефакторингов – обратимы, нечего
терять• Рефакторинг поддерживает принципы
YAGNI / KISS • Полный список рефакторингов -> книга / сайт
(www.refactoring.com), но он бесконечный
![Page 47: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/47.jpg)
Ресурсы
• Приемы объектно-ориентированного проектирования. Паттерны проектирования
• Рефакторинг. Улучшение существующего кода
• Чистый код. Создание, анализ и рефакторинг
• Google “<Pattern name> pattern” + картинки)• Google “<аббревиатура>”
![Page 48: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/48.jpg)
Темы для докладов
• AOP• Kanban / Lean (Карпов)• SCRUM: Team / ScrumMaster – подробнее
про процесс (DS, Retro, SprintPlan, Demo…)• Portfolio management, BMG (Alex Ostervald),
Scrum of Scrum• NoSql БД• Реализация ООП в Javascript (прототипы)
![Page 49: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/49.jpg)
Объявлениея
• В следующий четверг лекции не будет– www.msteched.ru
• Давайте решать что делать со временем лекций
• И с лабами, времени остается все меньше
![Page 50: разработка бизнес приложений (7)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/50.jpg)
Лабы
• Обработка открытых данных– 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)](https://reader033.vdocuments.pub/reader033/viewer/2022061214/54991203b479595c288b4604/html5/thumbnails/51.jpg)
Использованные материалы
• Никита Филлипов (www.ScrumTrek.ru)– Курс SCPO Msk (31.08.11)
• Бочков Илья (Архитектура корпоративных приложений, МИФИ)
• MIT: electrical-engineering-and-computer-science– http
://ocw.mit.edu/courses/#electrical-engineering-and-computer-science