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

Содержание

Слайд 2

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

О вашем инструкторе

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

CA
Контакты: EKrivosheev@luxoft.com
Слайд 3

Цели семинара Семинар призван систематизировать базовые правила и принципы проектирования ПО

Цели семинара

Семинар призван систематизировать базовые правила и принципы проектирования ПО
Представленные базовые

принципы необходимы для понимания более сфокусированных техник и приемов - рефакторинга и шаблонов проектирования
Слайд 4

Цели семинара Данный семинар – вводный, ~ 3 мин на принцип

Цели семинара

Данный семинар – вводный, ~ 3 мин на принцип или

правило
В дальнейшем будет разработан полноценный курс
Слайд 5

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

Необходимая подготовка

Иметь опыт разработки на одном из ООП-языков программирования
Понимать ключевые концепции

ООП

Слушатели должны:

Слайд 6

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

Организация обучения

Время начала и конца занятий
Перерывы

Слайд 7

Конференции УЦ Luxoft Конференции (www.soft-labs.ru): 26 сентября, Киев: TEST Labs 2009,

Конференции УЦ Luxoft

Конференции (www.soft-labs.ru):
26 сентября, Киев: TEST Labs 2009, программа

сформирована, регистрация участников
17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков
15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков
Слайд 8

Ближайшие занятия в Школах Расписание: Класс руководителя группы разработки. Основные курсы

Ближайшие занятия в Школах

Расписание:
Класс руководителя группы разработки. Основные курсы (24.08.2009-15.09.2009)
Класс менеджера

проектов. Основы управления проектами (24.08.2009-17.09.2009)
Класс тест-дизайнера. Дополнительные курсы (27.08.2009-11.09.2009)
Класс java-разработчика. Разработка на базе платформы JavaSE. Экспертный уровень. (31.08.2009-30.09.2009)
http://www.luxoft-training.ru/timetable
Слайд 9

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

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

Слайд 10

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

Введение

Наследование
Полиморфизм

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

Слайд 11

Введение Responsibility (ответственность) Intention (намерение) Coupling (связность) Cohesion (сцепленность, сфокусированность) Granularity

Введение

Responsibility (ответственность)
Intention (намерение)
Coupling (связность)
Cohesion (сцепленность, сфокусированность)
Granularity (гранулярность, детальность)

Ключевые понятия ООП-проектирования (менее

известные)
Слайд 12

Введение Ответственность – решаемая классом задача из предметной области Функциональная задача

Введение

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

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

Responsibility

Слайд 13

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

Введение

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

Intention

Слайд 14

Введение Связность – метрика, характеризующая степень зависимости классов друг от друга

Введение

Связность – метрика, характеризующая степень зависимости классов друг от друга
Loosely coupled

vs. Tightly coupled
Классы могут быть связаны (coupled) различными образами:
Зависимые
По управлению
По данным

Coupling

Слайд 15

Введение Сцепленность (Сфокусированность) – метрика, характеризующая узость ответственности класса Low cohesion

Введение

Сцепленность (Сфокусированность) – метрика, характеризующая узость ответственности класса
Low cohesion vs. High

cohesion
Классы могут иметь различную сфокусированность (cohesion):
По функциональности
По данным

Cohesion

Слайд 16

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

Введение

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

термин применяется для интерфейсов, где намерение выражается методом

Granularity

Слайд 17

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

Введение

Наследование
Делегирование

Инструменты code reuse в ООП

Слайд 18

Введение Brian Foote and William F. Opdyke. Lifecycle and refactoring patterns

Введение

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, 1999

Литературные источники семинара

Слайд 19

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

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

Слайд 20

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

Design Rules

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

Слайд 21

Design Rules Design Rules http://www.laputan.org/drc/drc.html

Design Rules

Design Rules

http://www.laputan.org/drc/drc.html

Слайд 22

Design Rules В дальнейшем обсуждении мы рассмотрим не дословный перевод правил

Design Rules

В дальнейшем обсуждении мы рассмотрим не дословный перевод правил проектирования,

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

Design Rules

Слайд 23

Design Rules Используйте непротиворечивые имена методов [и свойств] Непротиворечивость здесь –

Design Rules

Используйте непротиворечивые имена методов [и свойств]
Непротиворечивость здесь – это одинаковые

имена для одинаковых намерений
В книге [MF] есть аналогичный smell/refactoring

DR1. Use Consistent Names
DR1. Recursion introduction

Слайд 24

Design Rules Избегайте смешивания бизнес-логики и логики выбора/ветвления В книге [MF]

Design Rules

Избегайте смешивания бизнес-логики и логики выбора/ветвления
В книге [MF] есть аналогичный

smell/refactoring

DR2. Eliminate Case Analysis

Слайд 25

Design Rules Уменьшайте число аргументов/параметров В книге [MF] есть аналогичный smell/refactoring

Design Rules

Уменьшайте число аргументов/параметров
В книге [MF] есть аналогичный smell/refactoring

DR3. Reduce The

Number Of Arguments
Слайд 26

Design Rules Уменьшайте объем методов В книге [MF] есть аналогичный smell/refactoring

Design Rules

Уменьшайте объем методов
В книге [MF] есть аналогичный smell/refactoring

DR4. Reduce The

Size Of Methods
Слайд 27

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

Иерархию наследования стоит проектировать глубокой и узкой

Design Rules

DR5. Class Hierarchies Should

Be Deep And Narrow

далее

Слайд 28

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

Design Rules

DR5. Class Hierarchies Should Be Deep And Narrow

vs

Слайд 29

Design Rules На вершине иерархии наследования стоит размещать абстракцию DR6. The

Design Rules

На вершине иерархии наследования стоит размещать абстракцию

DR6. The Top Of

The Class Hierarchy Should Be Abstract

vs

Слайд 30

Design Rules Стоит минимизировать прямой доступ к переменным классов и экземпляров

Design Rules

Стоит минимизировать прямой доступ к переменным классов и экземпляров
Encapsulation aka

Hiding
В книге [MF] есть аналогичный smell/refactoring

DR7. Minimize Access to Variables

Слайд 31

Design Rules Наследники должны быть специализациями базовых классов Специализация – отношение

Design Rules

Наследники должны быть специализациями базовых классов
Специализация – отношение «IS-A», «является»
В

книге [MF] есть аналогичный smell/refactoring (Refused Bequest)

DR8. Subclasses Should Be Specializations

Слайд 32

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

Design Rules

Разбивайте большие классы
В книге [MF] есть аналогичный smell/refactoring

DR9. Split Large

Classes
Слайд 33

Design Rules В случае серьезной разницы в реализации метода двумя «братьями»

Design Rules

В случае серьезной разницы в реализации метода двумя «братьями» стоит

задуматься о целесообразности описания этого метода в их «отце»
Потенциально можно вынести этот метод в иной класс (делегировать)

DR10. Factor Implementation Differences Into Subcomponents

Слайд 34

Design Rules Разделяйте несвязанные методы Связь: по управлению по данным В

Design Rules

Разделяйте несвязанные методы
Связь:
по управлению
по данным
В книге [MF] есть аналогичный smell/refactoring

DR11.

Separate Methods That Do Not Communicate
Слайд 35

Design Rules Делегируйте Inheritance-based framework vs component-based framework – где ниже

Design Rules

Делегируйте
Inheritance-based framework vs component-based framework – где ниже связность?

DR12. Send

Messages To Components Instead Of To Self
Слайд 36

Design Rules Передавайте параметры явно Варианты неявной передачи: глобальные переменные состояние

Design Rules

Передавайте параметры явно
Варианты неявной передачи:
глобальные переменные
состояние
внешние источники данных
Вызов метода, результат

которого зависит только от входных параметров - идемпотентный

DR13. Reduce Implicit Parameter Passing

Слайд 37

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

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

Слайд 38

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

Вопросы

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

Слайд 39

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

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

Слайд 40

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

Design Principles

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

Слайд 41

Design Principles Design Principles DRY : Don’t Repeat Yourself SCP :

Design Principles

Design Principles

DRY : Don’t 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, Don’t Ask
SOC : Separation Of Concerns

Stefan Roock. Refactoring in Large Software. 2006

Слайд 42

Design Principles Минимизируйте повторение кода для снижения затрат на поддержку aka

Design Principles

Минимизируйте повторение кода для снижения затрат на поддержку
aka Single Point

of Truth or Single Point of Maintenance
В книге [MF] есть аналогичный smell/refactoring

DRY: Don’t Repeat Yourself

Слайд 43

Design Principles Код должен явно и однозначно отражать намерение В книге

Design Principles

Код должен явно и однозначно отражать намерение
В книге [MF] есть

аналогичный smell/refactoring

SCP: Speaking Code

Слайд 44

Design Principles Программные сущности (классы, модули, функции) должны быть открыты для

Design Principles

Программные сущности (классы, модули, функции) должны быть открыты для расширения

и закрыты для изменения
«Открыты для расширения» - возможно расширять и изменять поведение приложения при изменении требований
«Закрыты для изменения» - расширение поведения не приводит к изменению исходного или бинарного кода

OCP: Open/Closed

далее

Слайд 45

Design Principles Принцип OCP используется в двух контекстах его реализации: Dr.

Design Principles

Принцип OCP используется в двух контекстах его реализации:
Dr. Bertrand Meyer's

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

OCP: Open/Closed

далее

Слайд 46

Design Principles OCP: Open/Closed

Design Principles

OCP: Open/Closed

Слайд 47

Design Principles Существует два базовых определения: Barbara Liskov «В коде приложения

Design Principles

Существует два базовых определения:
Barbara Liskov «В коде приложения класс всегда можно

заменить его наследником»
Bertrand Meyer ("Design-by-Contract" formulation) «Наследники должны соблюдать контракт предка»

LSP: Liskov Substitution

далее

Слайд 48

Design Principles LSP: Liskov Substitution

Design Principles

LSP: Liskov Substitution

Слайд 49

Design Principles Высокоуровневые модули не должны зависеть от низкоуровневых. И те,

Design Principles

Высокоуровневые модули не должны зависеть от низкоуровневых. И те, и

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

DIP: Dependency Inversion

далее

Слайд 50

Design Principles С помощью абстракций детали системы изолируются друг от друга

Design Principles

С помощью абстракций детали системы изолируются друг от друга
Легко менять

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

DIP: Dependency Inversion

далее

Слайд 51

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

Design Principles

DIP: Dependency Inversion

далее

vs

Слайд 52

Design Principles DIP: Dependency Inversion далее

Design Principles

DIP: Dependency Inversion

далее

Слайд 53

Design Principles Inversion Of Control Принцип инверсии управления потоком выполнения по

Design Principles

Inversion Of Control
Принцип инверсии управления потоком выполнения по сравнению с

процедурным программированием
Основа всех каркасов (frameworks)
aka Hollywood Principle
Dependency Injection
Шаблон проектирования
Не мы сами получаем необходимые объекты, а внешняя среда нам их передает

DIP → IoC → Dependency Injection

Слайд 54

Design Principles Не стоит заставлять клиентов зависеть от ненужных им интерфейсов

Design Principles

Не стоит заставлять клиентов зависеть от ненужных им интерфейсов
Вместо одного

многофункционального интерфейса лучше выделить несколько узкоспециальных

ISP: Interface Segregation

далее

Слайд 55

Design Principles ISP: Interface Segregation

Design Principles

ISP: Interface Segregation

Слайд 56

Design Principles The granule of reuse is the granule of release.

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 и ряд следующих принципов – макропринципы организации разработки и пакетирования кода

REP: Reuse/Release Equivalence

Слайд 57

Design Principles Классы в пакете используются совместно. Если используется один класс

Design Principles

Классы в пакете используются совместно. Если используется один класс из

пакета, считается что используются все.
Здесь использование – многократное использование при дальнейшей разработке

CRP: Common Reuse

Слайд 58

Design Principles Классы в пакете должны быть связаны одинаковой причиной их

Design Principles

Классы в пакете должны быть связаны одинаковой причиной их изменения.

Изменение пакета (одного из классов) касается всех классов в нем.

CCP: Common Closure

Слайд 59

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

Design Principles

Не должно быть взаимной зависимости между пакетами, только односторонняя.

ADP: Acyclic

Dependencies

vs

Слайд 60

Design Principles Зависимости между пакетами должны быть в сторону более стабильного.

Design Principles

Зависимости между пакетами должны быть в сторону более стабильного. Пакет

должен зависеть только от более стабильного пакета, чем он сам.
Стабильность модуля, класса или пакета – степень сложности его изменений
Стабильные классы – независимые классы (незачем менять) или сильнозависимые (множество причин не менять)

SDP: Stable Dependencies

Слайд 61

Design Principles Самые стабильные пакеты должны быть самыми абстрактными. Нестабильные пакеты

Design Principles

Самые стабильные пакеты должны быть самыми абстрактными. Нестабильные пакеты должны

быть конкретными. Степень абстракции пакета должна зависеть от его стабильности.

SAP: Stable Abstractions

Слайд 62

Design Principles REP : Reuse/Release Equivalence CRP : Common Reuse CCP

Design Principles

REP : Reuse/Release
Equivalence
CRP : Common Reuse
CCP : Common Closure
ADP

: Acyclic Dependencies
SDP : Stable Dependencies
SAP : Stable Abstractions
Слайд 63

Design Principles TDA – стиль ООП, при котором объектА сигнализирует объектуБ

Design Principles

TDA – стиль ООП, при котором объектА сигнализирует объектуБ выполнить

его ответственность, вместо того, чтобы что-либо спрашивать у него и выполнять ответственность самому

TDA: Tell, Don’t Ask

далее

Слайд 64

Design Principles Объекты берут на себя сфокусированные ответственности и делегируют остальные

Design Principles

Объекты берут на себя сфокусированные ответственности и делегируют остальные ответственности

другим объектам
ООП vs Процедурный стиль
См. так же «Low Of Demeter»

TDA: Tell, Don’t Ask

Слайд 65

Design Principles Разделяйте ответственности по сфокусированным классам aka Single Responsibility Principle

Design Principles

Разделяйте ответственности по сфокусированным классам
aka Single Responsibility Principle «Класс должен иметь

только одну причину изменения»

SOC: Separation Of Concerns

далее

Слайд 66

Design Principles SOC : Separation Of Concerns

Design Principles

SOC : Separation Of Concerns

Слайд 67

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

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

Выводы

Слайд 68

Вопросы Буду рад ответить на Ваши вопросы Ссылка на оценочную форму семинара: http://www.luxoft-training.ru/events/vote

Вопросы

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

Ссылка на оценочную форму семинара:
http://www.luxoft-training.ru/events/vote

Слайд 69

Учебный Центр Luxoft УЦ Luxoft предлагает более 200 курсов и тренингов

Учебный Центр Luxoft

УЦ Luxoft предлагает более 200 курсов и тренингов по

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

http://luxoft-training.ru

Слайд 70

Конференции УЦ Luxoft Конференции (www.soft-labs.ru): 26 сентября, Киев: TEST Labs 2009,

Конференции УЦ Luxoft

Конференции (www.soft-labs.ru):
26 сентября, Киев: TEST Labs 2009, программа

сформирована, регистрация участников
17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков
15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков
Слайд 71

Ближайшие занятия в Школах Расписание: Класс руководителя группы разработки. Основные курсы

Ближайшие занятия в Школах

Расписание:
Класс руководителя группы разработки. Основные курсы (24.08.2009-15.09.2009)
Класс менеджера

проектов. Основы управления проектами (24.08.2009-17.09.2009)
Класс тест-дизайнера. Дополнительные курсы (27.08.2009-11.09.2009)
Класс java-разработчика. Разработка на базе платформы JavaSE. Экспертный уровень. (31.08.2009-30.09.2009)
http://www.luxoft-training.ru/timetable