Базовые правила и принципы проектирования ПО Евгений Кривошеев EKrivosheev@luxoft.com.

Презентация:



Advertisements
Похожие презентации

Advertisements

1. Определить последовательность проезда перекрестка
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
Урок повторения по теме: «Сила». Задание 1 Задание 2.
Проектирование архитектуры ИСО 1. UML 2 Структура определения языка 4.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Развивающая викторина для детей "Самый-самый " Муниципальное общеобразовательное учреждение средняя общеобразовательная школа 7 ст. Беломечётской.
1 Знаток математики Тренажер Таблица умножения 3 класс Школа России Масько Любовь Георгиевна Муниципальное общеобразовательное учреждение средняя общеобразовательная.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 4500 к решению Совета депутатов города Новосибирска от
Рисуем параллелепипед Известно, что параллельная проекция тетраэдра, без учета пунктирных линий, однозначно определяется заданием проекций его вершин (рис.
Прототип задания В3 Площади фигур. Задание 1 Задание 2.
Разработал: Учитель химии, биологии высшей квалификационной категории Баженов Алексей Анатольевич.
П РОТОТИП ЗАДАНИЯ В3 В МАТЕРИАЛАХ ЕГЭ Площади фигур.
Курсы повышения квалификации (общие показатели в %)
Матемтааки ЕТ СТ 2 класс Шипилова Наталия Викторовна учитель начальных классов, ВКК Шипилова Наталия Викторовна учитель начальных классов, ВКК.
Масштаб 1 : 5000 Приложение 1 к решению Совета депутатов города Новосибирска от _____________ ______.
Школьная форма Презентация для родительского собрания.
Итоги учебного года МОУ « СОШ 54» Подготовила зам. директора по УВР Харитонова Т.В.
Транксрипт:

Базовые правила и принципы проектирования ПО Евгений Кривошеев

О вашем инструкторе Имя: Евгений Кривошеев Статусы: SCJP, SCWCD, SCBCD, BEA WLS CA, IBM WAS CA Контакты: 2

Цели семинара Семинар призван систематизировать базовые правила и принципы проектирования ПО Представленные базовые принципы необходимы для понимания более сфокусированных техник и приемов - рефакторинга и шаблонов проектирования 3

Цели семинара Данный семинар – вводный, ~ 3 мин на принцип или правило В дальнейшем будет разработан полноценный курс 4

Необходимая подготовка Иметь опыт разработки на одном из ООП-языков программирования Понимать ключевые концепции ООП 5 Слушатели должны:

Организация обучения Время начала и конца занятий Перерывы 6

Конференции УЦ Luxoft Конференции ( 26 сентября, Киев: TEST Labs 2009, программа сформирована, регистрация участников 17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков 15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков 7

Ближайшие занятия в Школах Расписание: Класс руководителя группы разработки. Основные курсы ( ) Класс менеджера проектов. Основы управления проектами ( ) Класс тест-дизайнера. Дополнительные курсы ( ) Класс java-разработчика. Разработка на базе платформы JavaSE. Экспертный уровень. ( ) 8

План семинара 9

Введение Наследование Полиморфизм 10 Ключевые понятия ООП-проектирования (общеизвестные)

Введение Responsibility (ответственность) Intention (намерение) Coupling (связность) Cohesion (сцепленность, сфокусированность) Granularity (гранулярность, детальность) 11 Ключевые понятия ООП-проектирования (менее известные)

Введение Ответственность – решаемая классом задача из предметной области Функциональная задача Инкапсуляция данных Чаще этот термин применяется для классов 12 Responsibility

Введение Намерение – решаемая разработчиком задача Чаще этот термин применяется для методов 13 Intention

Введение Связность – метрика, характеризующая степень зависимости классов друг от друга Loosely coupled vs. Tightly coupled Классы могут быть связаны (coupled) различными образами: Зависимые По управлению По данным 14 Coupling

Введение Сцепленность (Сфокусированность) – метрика, характеризующая узость ответственности класса Low cohesion vs. High cohesion Классы могут иметь различную сфокусированность (cohesion): По функциональности По данным 15 Cohesion

Введение Гранулированность (Детальность) – метрика, характеризующая способ реализации намерений Fine-grained vs. Coarse-grained Чаще этот термин применяется для интерфейсов, где намерение выражается методом 16 Granularity

Введение Наследование Делегирование 17 Инструменты code reuse в ООП

Введение Brian Foote and William F. Opdyke. Lifecycle and refactoring patterns that support evolution and reuse, 1995 (отдельно и в рамках книги Pattern Languages of Program Design vol. 1) Stefan Roock. Refactoring in Large Software, 2006 Martin Fowler. Refactoring: Improving the Design of Existing Code, Литературные источники семинара

План семинара 19

Design Rules 20 Литературные источники

Design Rules 21 Design Rules

Design Rules В дальнейшем обсуждении мы рассмотрим не дословный перевод правил проектирования, а расширенные современные трактовки Важно помнить, что эти правила хоть и распространенные, но контекстные, т.е. их применимость следует обосновывать 22 Design Rules

Используйте непротиворечивые имена методов [и свойств] Непротиворечивость здесь – это одинаковые имена для одинаковых намерений В книге [MF] есть аналогичный smell/refactoring 23 DR1. Use Consistent Names DR1. Recursion introduction

Design Rules Избегайте смешивания бизнес-логики и логики выбора/ветвления В книге [MF] есть аналогичный smell/refactoring 24 DR2. Eliminate Case Analysis

Design Rules Уменьшайте число аргументов/параметров В книге [MF] есть аналогичный smell/refactoring 25 DR3. Reduce The Number Of Arguments

Design Rules Уменьшайте объем методов В книге [MF] есть аналогичный smell/refactoring 26 DR4. Reduce The Size Of Methods

Иерархию наследования стоит проектировать глубокой и узкой Design Rules 27 DR5. Class Hierarchies Should Be Deep And Narrow далее

Design Rules 28 DR5. Class Hierarchies Should Be Deep And Narrow vs

Design Rules На вершине иерархии наследования стоит размещать абстракцию 29 DR6. The Top Of The Class Hierarchy Should Be Abstract vs

Design Rules Стоит минимизировать прямой доступ к переменным классов и экземпляров Encapsulation aka Hiding В книге [MF] есть аналогичный smell/refactoring 30 DR7. Minimize Access to Variables

Design Rules Наследники должны быть специализациями базовых классов Специализация – отношение «IS-A», «является» В книге [MF] есть аналогичный smell/refactoring (Refused Bequest) 31 DR8. Subclasses Should Be Specializations

Design Rules Разбивайте большие классы В книге [MF] есть аналогичный smell/refactoring 32 DR9. Split Large Classes

Design Rules В случае серьезной разницы в реализации метода двумя «братьями» стоит задуматься о целесообразности описания этого метода в их «отце» Потенциально можно вынести этот метод в иной класс (делегировать) 33 DR10. Factor Implementation Differences Into Subcomponents

Design Rules Разделяйте несвязанные методы Связь: по управлению по данным В книге [MF] есть аналогичный smell/refactoring 34 DR11. Separate Methods That Do Not Communicate

Design Rules Делегируйте Inheritance-based framework vs component-based framework – где ниже связность? 35 DR12. Send Messages To Components Instead Of To Self

Design Rules Передавайте параметры явно Варианты неявной передачи: глобальные переменные состояние внешние источники данных Вызов метода, результат которого зависит только от входных параметров - идемпотентный 36 DR13. Reduce Implicit Parameter Passing

План семинара 37

Вопросы Буду рад ответить на Ваши вопросы 38

План семинара 39

Design Principles 40 Литературные источники

Design Principles 41 Design Principles DRY : Dont Repeat Yourself SCP : Speaking Code OCP : Open/Closed LSP : Liskov Substitution DIP : Dependency Inversion ISP : Interface Segregation REP : Reuse/Release Equivalence CRP : Common Reuse CCP : Common Closure ADP : Acyclic Dependencies SDP : Stable Dependencies SAP : Stable Abstractions TDA : Tell, Dont Ask SOC : Separation Of Concerns Stefan Roock. Refactoring in Large Software. 2006

Design Principles Минимизируйте повторение кода для снижения затрат на поддержку aka Single Point of Truth or Single Point of Maintenance В книге [MF] есть аналогичный smell/refactoring 42 DRY: Dont Repeat Yourself

Design Principles Код должен явно и однозначно отражать намерение В книге [MF] есть аналогичный smell/refactoring 43 SCP: Speaking Code

Design Principles Программные сущности (классы, модули, функции) должны быть открыты для расширения и закрыты для изменения «Открыты для расширения» - возможно расширять и изменять поведение приложения при изменении требований «Закрыты для изменения» - расширение поведения не приводит к изменению исходного или бинарного кода 44 OCP: Open/Closed далее

Design Principles Принцип OCP используется в двух контекстах его реализации: Dr. Bertrand Meyer's Open/Closed Principle «Написанная реализация класса модифицируется только для исправления ошибок, новые ответственности или изменение существующих потребует создание нового класса, возможно, наследника. Этот новый класс не обязан реализовать тот же интерфейс.» Polymorphic Open/Closed Principle Более современная версия. «Множество реализаций классов можно использовать полиморфно, через один и тот же интерфейс.» Здесь зафиксирована интерфейсная часть, а реализация вариативна. См. так же «Protected Variation» 45 OCP: Open/Closed далее

Design Principles 46 OCP: Open/Closed

Design Principles Существует два базовых определения: Barbara Liskov «В коде приложения класс всегда можно заменить его наследником» Bertrand Meyer ("Design-by-Contract" formulation) «Наследники должны соблюдать контракт предка» 47 LSP: Liskov Substitution далее

Design Principles 48 LSP: Liskov Substitution

Design Principles Высокоуровневые модули не должны зависеть от низкоуровневых. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракции. 49 DIP: Dependency Inversion далее

Design Principles С помощью абстракций детали системы изолируются друг от друга Легко менять детали реализации без модификации высокоуровневой логики Шаблоны, с помощью которых реализуется принцип DIP: Plug-in, [A] Factory [M], Service Locator, Inversion of Control, Dependency Injection 50 DIP: Dependency Inversion далее

Design Principles 51 DIP: Dependency Inversion далее vs

Design Principles 52 DIP: Dependency Inversion далее

Design Principles Inversion Of Control Принцип инверсии управления потоком выполнения по сравнению с процедурным программированием Основа всех каркасов (frameworks) aka Hollywood Principle Dependency Injection Шаблон проектирования Не мы сами получаем необходимые объекты, а внешняя среда нам их передает 53 DIP IoC Dependency Injection

Design Principles Не стоит заставлять клиентов зависеть от ненужных им интерфейсов Вместо одного многофункционального интерфейса лучше выделить несколько узкоспециальных 54 ISP: Interface Segregation далее

Design Principles 55 ISP: Interface Segregation

Design Principles The granule of reuse is the granule of release. Only components that are released through a tracking system can be effectively reused. This granule is the package Многократно используемая единица кода должна пройти завершенный цикл разработки – система контроля версий, багтрекер, тесты. Эта единица – пакет. REP и ряд следующих принципов – макро принципы организации разработки и пакетирования кода 56 REP: Reuse/Release Equivalence

Design Principles Классы в пакете используются совместно. Если используется один класс из пакета, считается что используются все. Здесь использование – многократное использование при дальнейшей разработке 57 CRP: Common Reuse

Design Principles Классы в пакете должны быть связаны одинаковой причиной их изменения. Изменение пакета (одного из классов) касается всех классов в нем. 58 CCP: Common Closure

Design Principles Не должно быть взаимной зависимости между пакетами, только односторонняя. 59 ADP: Acyclic Dependencies vs

Design Principles Зависимости между пакетами должны быть в сторону более стабильного. Пакет должен зависеть только от более стабильного пакета, чем он сам. Стабильность модуля, класса или пакета – степень сложности его изменений Стабильные классы – независимые классы (незачем менять) или сильнозависимые (множество причин не менять) 60 SDP: Stable Dependencies

Design Principles Самые стабильные пакеты должны быть самыми абстрактными. Нестабильные пакеты должны быть конкретными. Степень абстракции пакета должна зависеть от его стабильности. 61 SAP: Stable Abstractions

Design Principles 62 REP : Reuse/Release Equivalence CRP : Common Reuse CCP : Common Closure ADP : Acyclic Dependencies SDP : Stable Dependencies SAP : Stable Abstractions

Design Principles TDA – стиль ООП, при котором объектА сигнализирует объектуБ выполнить его ответственность, вместо того, чтобы что-либо спрашивать у него и выполнять ответственность самому 63 TDA: Tell, Dont Ask далее

Design Principles Объекты берут на себя сфокусированные ответственности и делегируют остальные ответственности другим объектам ООП vs Процедурный стиль См. так же «Low Of Demeter» 64 TDA: Tell, Dont Ask

Design Principles Разделяйте ответственности по сфокусированным классам aka Single Responsibility Principle «Класс должен иметь только одну причину изменения» 65 SOC: Separation Of Concerns далее

Design Principles 66 SOC : Separation Of Concerns

План семинара 67 Выводы

Вопросы Буду рад ответить на Ваши вопросы 68 Ссылка на оценочную форму семинара:

Учебный Центр Luxoft УЦ Luxoft предлагает более 200 курсов и тренингов по различным направлениям промышленной разработки ПО Наши инструкторы – практики, готовые передать свою экспертизу 69

Конференции УЦ Luxoft Конференции ( 26 сентября, Киев: TEST Labs 2009, программа сформирована, регистрация участников 17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков 15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков 70

Ближайшие занятия в Школах Расписание: Класс руководителя группы разработки. Основные курсы ( ) Класс менеджера проектов. Основы управления проектами ( ) Класс тест-дизайнера. Дополнительные курсы ( ) Класс java-разработчика. Разработка на базе платформы JavaSE. Экспертный уровень. ( ) 71

Базовые правила и принципы проектирования ПО Евгений Кривошеев