SlideShare a Scribd company logo
Базовые правила и принципы проектирования ПО Евгений Кривошеев [email_address]
О вашем инструкторе Имя : Евгений Кривошеев Статусы : SCJP, SCWCD, SCBCD, BEA WLS CA, IBM WAS CA Контакты : [email_address]
Цели семинара Семинар призван систематизировать базовые правила и принципы проектирования ПО Представленные базовые принципы необходимы для понимания более сфокусированных техник и приемов - рефакторинга и шаблонов проектирования
Цели семинара Данный семинар – вводный,  ~  3 мин на принцип или правило В дальнейшем будет разработан полноценный курс
Необходимая подготовка Иметь опыт разработки на одном из ООП-языков программирования Понимать ключевые концепции ООП Слушатели должны:
Время начала и конца занятий Перерывы Организация обучения
Конференции (www.soft-labs.ru):  26 сентября, Киев: TEST Labs 2009, программа сформирована, регистрация участников 17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков 15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков Конференции УЦ  Luxoft
Расписание: Класс руководителя группы разработки. Основные курсы (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  Ближайшие занятия в Школах
План семинара
Введение Наследование Полиморфизм Ключевые понятия  ООП-проектирования (общеизвестные)
Введение Responsibility ( ответственность ) Intention ( намерение ) Coupling ( связность ) Cohesion  ( сцепленность, сфокусированность ) Granularity  ( гранулярность, детальность ) Ключевые понятия  ООП-проектирования (менее известные)
Введение Ответственность  – решаемая классом задача из предметной области Функциональная задача Инкапсуляция данных Чаще этот термин применяется для  классов Responsibility
Введение Намерение  – решаемая разработчиком задача Чаще этот термин применяется для  методов Intention
Введение Связность  – метрика, характеризующая степень зависимости классов друг от друга Loosely coupled vs. Tightly coupled Классы могут быть связаны ( coupled ) различными образами: Зависимые По управлению По данным Coupling
Введение Сцепленность (Сфокусированность)  – метрика, характеризующая узость  ответственности  класса Low cohesion vs. High cohesion Классы могут иметь различную сфокусированность ( cohesion ): По функциональности По данным Cohesion
Введение Гранулированность (Детальность)  – метрика, характеризующая способ реализации намерений Fine-grained vs. Coarse-grained Чаще этот термин применяется для  интерфейсов,  где намерение выражается методом Granularity
Введение Наследование Делегирование Инструменты  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, 1999 Литературные источники семинара
План семинара
Design Rules Литературные источники
Design Rules Design Rules http://www.laputan.org/drc/drc.html
Design Rules В дальнейшем обсуждении мы рассмотрим не дословный перевод правил проектирования, а расширенные современные трактовки Важно помнить, что эти правила хоть и распространенные, но контекстные, т.е. их применимость следует обосновывать Design Rules
Design Rules Используйте непротиворечивые имена методов  [ и свойств ] Непротиворечивость здесь – это одинаковые имена для одинаковых намерений В книге  [MF]  есть аналогичный  smell/refactoring DR1. Use Consistent Names DR1. Recursion introduction
Design Rules Избегайте смешивания  бизнес-логики и логики выбора/ветвления В книге  [MF]  есть аналогичный  smell/refactoring DR 2 . Eliminate Case Analysis
Design Rules Уменьшайте число аргументов/параметров В книге  [MF]  есть аналогичный  smell/refactoring DR 3 . Reduce The Number Of Arguments
Design Rules Уменьшайте объем методов В книге  [MF]  есть аналогичный  smell/refactoring DR 4 . Reduce The Size Of Methods
Иерархию наследования стоит проектировать глубокой и узкой Design Rules DR 5 . Class Hierarchies Should Be Deep And Narrow далее
Design Rules DR 5 . Class Hierarchies Should Be Deep And Narrow vs
Design Rules На вершине иерархии наследования стоит размещать абстракцию DR 6 . The Top Of The Class Hierarchy Should Be Abstract vs
Design Rules Стоит минимизировать прямой доступ к переменным классов и экземпляров Encapsulation aka Hiding В книге  [MF]  есть аналогичный  smell/refactoring DR 7 . Minimize Access to Variables
Design Rules Наследники должны быть специализациями базовых классов Специализация – отношение  « IS-A » ,  «является» В книге  [MF]  есть аналогичный  smell/refactoring  ( Refused Bequest ) DR 8 . Subclasses Should Be Specializations
Design Rules Разбивайте большие классы В книге  [MF]  есть аналогичный  smell/refactoring DR 9 . Split Large Classes
Design Rules В случае серьезной разницы в реализации метода двумя «братьями» стоит задуматься о целесообразности описания этого метода в их «отце»  Потенциально можно вынести этот метод в иной класс (делегировать) DR 10 . Factor Implementation Differences Into Subcomponents
Design Rules Разделяйте несвязанные методы Связь: по управлению по данным В книге  [MF]  есть аналогичный  smell/refactoring DR 1 1. Separate Methods That Do Not Communicate
Design Rules Делегируйте Inheritance-based framework vs component-based framework –  где ниже связность? DR 12 . Send Messages To Components Instead Of To Self
Design Rules Передавайте параметры явно Варианты неявной передачи: глобальные переменные состояние внешние источники данных Вызов метода, результат которого зависит только от входных параметров -  идемпотентный DR 1 3. Reduce Implicit Parameter Passing
План семинара
Буду рад ответить на Ваши вопросы Вопросы
План семинара
Design Principles Литературные источники
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
Design Principles Минимизируйте повторение кода для снижения затрат на поддержку aka  Single Point of Truth  or  Single Point of Maintenance В книге  [MF]  есть аналогичный  smell/refactoring DRY: Don’t Repeat Yourself
Design Principles Код должен явно и однозначно отражать намерение В книге  [MF]  есть аналогичный  smell/refactoring SCP: Speaking Code
Design Principles Программные сущности (классы, модули, функции) должны быть открыты для расширения и закрыты для изменения «Открыты для расширения» - возможно расширять и изменять поведение приложения при изменении требований «Закрыты для изменения» - расширение поведения не приводит к изменению исходного или бинарного кода OCP: Open / Closed далее
Design Principles Принцип  OCP  используется в двух контекстах его реализации: Dr. Bertrand   Meyer's Open/Closed Principle «Написанная реализация класса модифицируется только для исправления ошибок, новые ответственности или изменение существующих потребует создание нового класса, возможно, наследника. Этот новый класс не обязан реализовать тот же интерфейс.» Polymorphic Open/Closed Principle Более современная версия. «Множество реализаций классов можно использовать полиморфно, через один и тот же интерфейс.» Здесь зафиксирована интерфейсная часть, а реализация вариативна. См. так же « Protected Variation » OCP: Open / Closed далее
Design Principles OCP: Open / Closed
Design Principles Существует два базовых определения: Barbara Liskov «В коде приложения класс всегда можно заменить его наследником» Bertrand Meyer  ( "Design-by-Contract" formulation ) «Наследники должны соблюдать контракт предка» LSP: Liskov Substitution далее
Design Principles LSP: Liskov Substitution
Design Principles Высокоуровневые модули не должны зависеть от низкоуровневых. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракции.  DIP: Dependency Inversion далее
Design Principles С помощью абстракций детали системы изолируются друг от друга Легко менять детали реализации без модификации высокоуровневой логики Шаблоны, с помощью которых реализуется принцип  DIP: Plug-in, [A] Factory [M], Service Locator,  Inversion of Control, Dependency Injection DIP: Dependency Inversion далее
Design Principles DIP: Dependency Inversion далее vs
Design Principles DIP: Dependency Inversion далее
Design Principles Inversion Of Control Принцип  инверсии управления потоком выполнения  по сравнению с процедурным программированием Основа всех  каркасов  ( frameworks ) aka  Hollywood Principle Dependency Injection Шаблон проектирования Не мы сами получаем необходимые объекты, а внешняя среда нам их передает DIP -> IoC   ->   Dependency Injection
Design Principles Не стоит заставлять клиентов зависеть от ненужных им интерфейсов Вместо одного многофункционального интерфейса лучше выделить несколько узкоспециальных ISP: Interface Segregation далее
Design Principles 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  и ряд следующих принципов – макропринципы организации разработки и пакетирования кода REP: Reuse/Release Equivalence
Design Principles Классы в пакете используются совместно. Если используется один класс из пакета, считается что используются все. Здесь  использование  – многократное использование при дальнейшей разработке CRP: Common Reuse
Design Principles Классы в пакете должны быть связаны одинаковой причиной их изменения. Изменение пакета (одного из классов) касается всех классов в нем. CCP: Common Closure
Design Principles Не должно быть взаимной зависимости между пакетами, только односторонняя. ADP: Acyclic Dependencies vs
Design Principles Зависимости между пакетами должны быть в сторону более стабильного. Пакет должен зависеть только от более стабильного пакета, чем он сам. Стабильность  модуля, класса или пакета – степень сложности его изменений Стабильные классы – независимые классы (незачем менять) или сильнозависимые (множество причин не менять) SDP: Stable Dependencies
Design Principles Самые стабильные пакеты должны быть самыми абстрактными. Нестабильные пакеты должны быть конкретными. Степень абстракции пакета должна зависеть от его стабильности. SAP: Stable Abstractions
Design Principles REP : Reuse/Release  Equivalence CRP : Common Reuse CCP : Common Closure ADP : Acyclic Dependencies SDP : Stable Dependencies SAP : Stable Abstractions
Design Principles TDA –  стиль ООП, при котором объектА сигнализирует объектуБ выполнить его ответственность, вместо того, чтобы что-либо спрашивать у него и выполнять ответственность самому TDA: Tell, Don’t Ask далее
Design Principles Объекты берут на себя сфокусированные ответственности и делегируют остальные ответственности другим объектам ООП  vs  Процедурный стиль См. так же « Low Of Demeter » TDA: Tell, Don’t Ask
Design Principles Разделяйте ответственности по сфокусированным классам aka Single Responsibility Principle «Класс должен иметь только одну причину изменения» SOC: Separation Of Concerns далее
Design Principles SOC : Separation Of Concerns
План семинара Выводы
Буду рад ответить на Ваши вопросы Вопросы Ссылка на оценочную форму семинара: http://www.luxoft-training.ru/events/vote
УЦ Luxoft предлагает  более 200  курсов и тренингов по различным направлениям промышленной разработки ПО Наши инструкторы – практики, готовые передать свою экспертизу Учебный   Центр  Luxoft http://luxoft-training.ru
Конференции (www.soft-labs.ru):  26 сентября, Киев: TEST Labs 2009, программа сформирована, регистрация участников 17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков 15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков Конференции УЦ  Luxoft
Расписание: Класс руководителя группы разработки. Основные курсы (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  Ближайшие занятия в Школах
Базовые правила и принципы проектирования ПО Евгений Кривошеев [email_address]

More Related Content

PPTX
GRASP – паттерны Объектно-Ориентированного Проектирования
PDF
Requirement modelling in software creation process
PDF
Сила парадигмы: обзор парадигм программирования
PDF
SOLID & GRASP
PPT
Шаблоны разработки ПО. Рефакторинг
PPTX
Yuri Trukhin - Software developement best practices
PDF
Programming Concepts
PPTX
Как писать красивый код или основы SOLID
GRASP – паттерны Объектно-Ориентированного Проектирования
Requirement modelling in software creation process
Сила парадигмы: обзор парадигм программирования
SOLID & GRASP
Шаблоны разработки ПО. Рефакторинг
Yuri Trukhin - Software developement best practices
Programming Concepts
Как писать красивый код или основы SOLID

What's hot (10)

PPTX
Принципы объектно-ориентированного дизайна
PPT
Шаблоны разработки ПО. Часть 1. Введние
PPT
Базовые принципы и понятия технологии разработки объектно-ориентированных инф...
PDF
C++ осень 2012 лекция 7
DOC
Конспект лекций по курсу "Шаблоны разработки ПО"
PPTX
шаблоны проектирования (42)
PPT
Шаблоны разработки ПО. Шаблоны GRASP
PDF
Модифицируемость программных систем
PDF
UML2. Eleven Trivial Tips for BPMN Modellers [1.01, RUS]
PPTX
Спецкурс 2014, занятие 3. Абстракции, именование, документирование
Принципы объектно-ориентированного дизайна
Шаблоны разработки ПО. Часть 1. Введние
Базовые принципы и понятия технологии разработки объектно-ориентированных инф...
C++ осень 2012 лекция 7
Конспект лекций по курсу "Шаблоны разработки ПО"
шаблоны проектирования (42)
Шаблоны разработки ПО. Шаблоны GRASP
Модифицируемость программных систем
UML2. Eleven Trivial Tips for BPMN Modellers [1.01, RUS]
Спецкурс 2014, занятие 3. Абстракции, именование, документирование
Ad

Similar to Design Rules And Principles (20)

PPT
Design Principles
KEY
Объектно ориентированный дизайн
PPTX
SOLID
PPTX
PPTX
Практические аспекты разработки ПО #3
ODP
Refactoring
PPTX
разработка бизнес приложений (7)
PDF
Общие темы. Тема 02.
PPTX
SOLID Principles in the real world
PPTX
SOLID – принципы объектно-ориентированного дизайна
PDF
Принципы проектирование ООП приложений - Скалкин Никита (Evrone) Блог прогр...
PPTX
07 Архитектура информационных систем. Принципы GRASP
PDF
Проектирование больших ИС в Agile (статья)
PDF
Принципы программирования [NoBugs WTF PRO уровень].pdf
PDF
Agile architecture
PPTX
Tdd php
PDF
ук 03.001.02 2011
PPTX
"The SOLID software design principles" by Andrey Sklyarevsky from OK.RU at Ar...
Design Principles
Объектно ориентированный дизайн
SOLID
Практические аспекты разработки ПО #3
Refactoring
разработка бизнес приложений (7)
Общие темы. Тема 02.
SOLID Principles in the real world
SOLID – принципы объектно-ориентированного дизайна
Принципы проектирование ООП приложений - Скалкин Никита (Evrone) Блог прогр...
07 Архитектура информационных систем. Принципы GRASP
Проектирование больших ИС в Agile (статья)
Принципы программирования [NoBugs WTF PRO уровень].pdf
Agile architecture
Tdd php
ук 03.001.02 2011
"The SOLID software design principles" by Andrey Sklyarevsky from OK.RU at Ar...
Ad

More from Evgeniy Krivosheev (11)

PDF
Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...
PDF
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.
PDF
Осознанность рефакторинга: Модель принятия инженерных решений
PDF
[Skill trek] type idioms at domain analysis
PDF
Design&Process Models
PPTX
[SkillTrek] Бизнес-кейсы
PPTX
[SkillTrek] Презентация
PPTX
Вебинар "Введение в процесс разработки ПО"
PDF
Tdd Workbook
PDF
Введение в веб каркас Struts2
PPT
Tdd Workshop Disscussions
Points Of View как ключ к общению QAs и инженеров – видим качество за диаграм...
Архитектура как функция от ?. Что мы не учитываем и убиваем проекты.
Осознанность рефакторинга: Модель принятия инженерных решений
[Skill trek] type idioms at domain analysis
Design&Process Models
[SkillTrek] Бизнес-кейсы
[SkillTrek] Презентация
Вебинар "Введение в процесс разработки ПО"
Tdd Workbook
Введение в веб каркас Struts2
Tdd Workshop Disscussions

Design Rules And Principles

  • 1. Базовые правила и принципы проектирования ПО Евгений Кривошеев [email_address]
  • 2. О вашем инструкторе Имя : Евгений Кривошеев Статусы : SCJP, SCWCD, SCBCD, BEA WLS CA, IBM WAS CA Контакты : [email_address]
  • 3. Цели семинара Семинар призван систематизировать базовые правила и принципы проектирования ПО Представленные базовые принципы необходимы для понимания более сфокусированных техник и приемов - рефакторинга и шаблонов проектирования
  • 4. Цели семинара Данный семинар – вводный, ~ 3 мин на принцип или правило В дальнейшем будет разработан полноценный курс
  • 5. Необходимая подготовка Иметь опыт разработки на одном из ООП-языков программирования Понимать ключевые концепции ООП Слушатели должны:
  • 6. Время начала и конца занятий Перерывы Организация обучения
  • 7. Конференции (www.soft-labs.ru): 26 сентября, Киев: TEST Labs 2009, программа сформирована, регистрация участников 17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков 15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков Конференции УЦ Luxoft
  • 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 Ближайшие занятия в Школах
  • 10. Введение Наследование Полиморфизм Ключевые понятия ООП-проектирования (общеизвестные)
  • 11. Введение Responsibility ( ответственность ) Intention ( намерение ) Coupling ( связность ) Cohesion ( сцепленность, сфокусированность ) Granularity ( гранулярность, детальность ) Ключевые понятия ООП-проектирования (менее известные)
  • 12. Введение Ответственность – решаемая классом задача из предметной области Функциональная задача Инкапсуляция данных Чаще этот термин применяется для классов Responsibility
  • 13. Введение Намерение – решаемая разработчиком задача Чаще этот термин применяется для методов Intention
  • 14. Введение Связность – метрика, характеризующая степень зависимости классов друг от друга Loosely coupled vs. Tightly coupled Классы могут быть связаны ( coupled ) различными образами: Зависимые По управлению По данным Coupling
  • 15. Введение Сцепленность (Сфокусированность) – метрика, характеризующая узость ответственности класса Low cohesion vs. High cohesion Классы могут иметь различную сфокусированность ( cohesion ): По функциональности По данным Cohesion
  • 16. Введение Гранулированность (Детальность) – метрика, характеризующая способ реализации намерений Fine-grained vs. Coarse-grained Чаще этот термин применяется для интерфейсов, где намерение выражается методом Granularity
  • 17. Введение Наследование Делегирование Инструменты code reuse в ООП
  • 18. Введение 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 Литературные источники семинара
  • 21. Design Rules Design Rules http://www.laputan.org/drc/drc.html
  • 22. Design Rules В дальнейшем обсуждении мы рассмотрим не дословный перевод правил проектирования, а расширенные современные трактовки Важно помнить, что эти правила хоть и распространенные, но контекстные, т.е. их применимость следует обосновывать Design Rules
  • 23. Design Rules Используйте непротиворечивые имена методов [ и свойств ] Непротиворечивость здесь – это одинаковые имена для одинаковых намерений В книге [MF] есть аналогичный smell/refactoring DR1. Use Consistent Names DR1. Recursion introduction
  • 24. Design Rules Избегайте смешивания бизнес-логики и логики выбора/ветвления В книге [MF] есть аналогичный smell/refactoring DR 2 . Eliminate Case Analysis
  • 25. Design Rules Уменьшайте число аргументов/параметров В книге [MF] есть аналогичный smell/refactoring DR 3 . Reduce The Number Of Arguments
  • 26. Design Rules Уменьшайте объем методов В книге [MF] есть аналогичный smell/refactoring DR 4 . Reduce The Size Of Methods
  • 27. Иерархию наследования стоит проектировать глубокой и узкой Design Rules DR 5 . Class Hierarchies Should Be Deep And Narrow далее
  • 28. Design Rules DR 5 . Class Hierarchies Should Be Deep And Narrow vs
  • 29. Design Rules На вершине иерархии наследования стоит размещать абстракцию DR 6 . The Top Of The Class Hierarchy Should Be Abstract vs
  • 30. Design Rules Стоит минимизировать прямой доступ к переменным классов и экземпляров Encapsulation aka Hiding В книге [MF] есть аналогичный smell/refactoring DR 7 . Minimize Access to Variables
  • 31. Design Rules Наследники должны быть специализациями базовых классов Специализация – отношение « IS-A » , «является» В книге [MF] есть аналогичный smell/refactoring ( Refused Bequest ) DR 8 . Subclasses Should Be Specializations
  • 32. Design Rules Разбивайте большие классы В книге [MF] есть аналогичный smell/refactoring DR 9 . Split Large Classes
  • 33. Design Rules В случае серьезной разницы в реализации метода двумя «братьями» стоит задуматься о целесообразности описания этого метода в их «отце» Потенциально можно вынести этот метод в иной класс (делегировать) DR 10 . Factor Implementation Differences Into Subcomponents
  • 34. Design Rules Разделяйте несвязанные методы Связь: по управлению по данным В книге [MF] есть аналогичный smell/refactoring DR 1 1. Separate Methods That Do Not Communicate
  • 35. Design Rules Делегируйте Inheritance-based framework vs component-based framework – где ниже связность? DR 12 . Send Messages To Components Instead Of To Self
  • 36. Design Rules Передавайте параметры явно Варианты неявной передачи: глобальные переменные состояние внешние источники данных Вызов метода, результат которого зависит только от входных параметров - идемпотентный DR 1 3. Reduce Implicit Parameter Passing
  • 38. Буду рад ответить на Ваши вопросы Вопросы
  • 41. 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 Single Point of Truth or Single Point of Maintenance В книге [MF] есть аналогичный smell/refactoring DRY: Don’t Repeat Yourself
  • 43. Design Principles Код должен явно и однозначно отражать намерение В книге [MF] есть аналогичный smell/refactoring SCP: Speaking Code
  • 44. Design Principles Программные сущности (классы, модули, функции) должны быть открыты для расширения и закрыты для изменения «Открыты для расширения» - возможно расширять и изменять поведение приложения при изменении требований «Закрыты для изменения» - расширение поведения не приводит к изменению исходного или бинарного кода OCP: Open / Closed далее
  • 45. 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
  • 47. Design Principles Существует два базовых определения: Barbara Liskov «В коде приложения класс всегда можно заменить его наследником» Bertrand Meyer ( "Design-by-Contract" formulation ) «Наследники должны соблюдать контракт предка» LSP: Liskov Substitution далее
  • 48. Design Principles LSP: Liskov Substitution
  • 49. Design Principles Высокоуровневые модули не должны зависеть от низкоуровневых. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракции. DIP: Dependency Inversion далее
  • 50. 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
  • 52. Design Principles DIP: Dependency Inversion далее
  • 53. Design Principles Inversion Of Control Принцип инверсии управления потоком выполнения по сравнению с процедурным программированием Основа всех каркасов ( frameworks ) aka Hollywood Principle Dependency Injection Шаблон проектирования Не мы сами получаем необходимые объекты, а внешняя среда нам их передает DIP -> IoC -> Dependency Injection
  • 54. Design Principles Не стоит заставлять клиентов зависеть от ненужных им интерфейсов Вместо одного многофункционального интерфейса лучше выделить несколько узкоспециальных ISP: Interface Segregation далее
  • 55. Design Principles ISP: Interface Segregation
  • 56. 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 Классы в пакете используются совместно. Если используется один класс из пакета, считается что используются все. Здесь использование – многократное использование при дальнейшей разработке CRP: Common Reuse
  • 58. Design Principles Классы в пакете должны быть связаны одинаковой причиной их изменения. Изменение пакета (одного из классов) касается всех классов в нем. CCP: Common Closure
  • 59. Design Principles Не должно быть взаимной зависимости между пакетами, только односторонняя. ADP: Acyclic Dependencies vs
  • 60. Design Principles Зависимости между пакетами должны быть в сторону более стабильного. Пакет должен зависеть только от более стабильного пакета, чем он сам. Стабильность модуля, класса или пакета – степень сложности его изменений Стабильные классы – независимые классы (незачем менять) или сильнозависимые (множество причин не менять) SDP: Stable Dependencies
  • 61. Design Principles Самые стабильные пакеты должны быть самыми абстрактными. Нестабильные пакеты должны быть конкретными. Степень абстракции пакета должна зависеть от его стабильности. SAP: Stable Abstractions
  • 62. 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 – стиль ООП, при котором объектА сигнализирует объектуБ выполнить его ответственность, вместо того, чтобы что-либо спрашивать у него и выполнять ответственность самому TDA: Tell, Don’t Ask далее
  • 64. Design Principles Объекты берут на себя сфокусированные ответственности и делегируют остальные ответственности другим объектам ООП vs Процедурный стиль См. так же « Low Of Demeter » TDA: Tell, Don’t Ask
  • 65. Design Principles Разделяйте ответственности по сфокусированным классам aka Single Responsibility Principle «Класс должен иметь только одну причину изменения» SOC: Separation Of Concerns далее
  • 66. Design Principles SOC : Separation Of Concerns
  • 68. Буду рад ответить на Ваши вопросы Вопросы Ссылка на оценочную форму семинара: http://www.luxoft-training.ru/events/vote
  • 69. УЦ Luxoft предлагает более 200 курсов и тренингов по различным направлениям промышленной разработки ПО Наши инструкторы – практики, готовые передать свою экспертизу Учебный Центр Luxoft http://luxoft-training.ru
  • 70. Конференции (www.soft-labs.ru): 26 сентября, Киев: TEST Labs 2009, программа сформирована, регистрация участников 17 ноября, Москва: Req Labs 2009, открыта регистрация докладчиков 15 декабря, Москва: Arch Labs 2009, открыта регистрация докладчиков Конференции УЦ Luxoft
  • 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 Ближайшие занятия в Школах
  • 72. Базовые правила и принципы проектирования ПО Евгений Кривошеев [email_address]