'

Базовые правила и принципы проектирования ПО

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

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


Слайд 3

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


Слайд 4

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


Слайд 5

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


Слайд 6

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


Слайд 7

Ближайшие занятия в Школах Расписание: Класс руководителя группы разработки. Основные курсы (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 8


Слайд 8

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


Слайд 9

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


Слайд 10

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


Слайд 11

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


Слайд 12

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


Слайд 13

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


Слайд 14

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


Слайд 15

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


Слайд 16

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


Слайд 17

Введение 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 18 Литературные источники семинара


Слайд 18

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


Слайд 19

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


Слайд 20

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


Слайд 21

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


Слайд 22

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


Слайд 23

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


Слайд 24

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


Слайд 25

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


Слайд 26

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


Слайд 27

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


Слайд 28

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


Слайд 29

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


Слайд 30

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


Слайд 31

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


Слайд 32

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


Слайд 33

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


Слайд 34

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


Слайд 35

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


Слайд 36

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


Слайд 37

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


Слайд 38

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


Слайд 39

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


Слайд 40

Design Principles 41 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


Слайд 41

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


Слайд 42

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


Слайд 43

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


Слайд 44

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


Слайд 45

Design Principles 46 OCP: Open/Closed


Слайд 46

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


Слайд 47

Design Principles 48 LSP: Liskov Substitution


Слайд 48

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


Слайд 49

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


Слайд 50

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


Слайд 51

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


Слайд 52

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


Слайд 53

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


Слайд 54

Design Principles 55 ISP: Interface Segregation


Слайд 55

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


Слайд 56

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


Слайд 57

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


Слайд 58

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


Слайд 59

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


Слайд 60

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


Слайд 61

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


Слайд 62

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


Слайд 63

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


Слайд 64

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


Слайд 65

Design Principles 66 SOC : Separation Of Concerns


Слайд 66

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


Слайд 67

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


Слайд 68

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


Слайд 69

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


Слайд 70

Ближайшие занятия в Школах Расписание: Класс руководителя группы разработки. Основные курсы (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 71


Слайд 71

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


×

HTML:





Ссылка: