SlideShare a Scribd company logo
1 of 23
Польгун М.
1
Связанность (coupling) определяет насколько
жестко один элемент (класс, модуль) связан с
другими элементами, либо каким
количеством данных о других элементах он
владеет.
Чем выше связанность, тем сложнее элемент
изменить, понять и повторно использовать.
Необходимо стремиться к низкой связанности
2
3
Связность или сцепление (cohesion) – мера
связанности и сфокусированности
обязанностей класса.
Считается, что элемент обладает высокой
степенью сцепления, если его обязанности
тесно связаны между собой и он не выполняет
непомерных объемов работ.
Нужно стараться достигать высокой степени
сцепления
4
5
6
SRP Принцип единственной
обязанности
OCP Принцип открытости/закрытости
LSP Принцип подстановки Лисков
ISP Принцип разделения интерфейсов
DIP Принцип инверсии зависимостей
7
У класса должна быть только одна причина
для изменения (одна обязанность)
Пример невыполнения SRP
8
9
 Программные сущности
(классы, модули, функции и т.п.) должны
быть открыты для расширения, но закрыты
для модификацииПример невыполнения OCP
10
11
Должна быть возможность вместо базового
типа подставить любой его подтип.
При нарушении LSP часто появляется
проверка типов во время выполнения (if или
switch по типам, is, as)
12
class Rectangle {
private Point topLeft;
private double width;
private double height;
public double Width {
get { return this.width; }
set { this.width = value; }
}
public double Height {
get { return this.height; }
set { this.height = value; }
}
}
class Square : Rectangle {
public new double Width {
set
{
base.Width = value;
base.Height = value;
}
}
public new double Height {
set {
base.Width = value;
base.Height = value;
}
}
}
13
void SetWidth(Rectangle r) {
r.Width = 32;
}
У Square будет побочный эффект, а у
Rectangle нет – нарушение LSP
14
В иерархию добавили метод расчета
площади – Area()
public void TestArea(Rectangle r) {
r.Width = 4;
r.Height = 5;
Debug.Assert(r.Area() == 20, "Неверная
площаль!");
}
15
 Модули верхнего уровня не должны
зависеть от модулей нижнего уровня. И те и
другие должны зависеть от абстракции.
 Абстракции не должна зависеть от
деталей, детали должны зависеть от
абстракций.
16
17
18
Клиент не должен вынужденно зависеть от
методов, которыми не пользуется.
Зависимость между классами должна быть
ограничена как можно более узким интерфейсом.
19
abstract class ServiceClient {
public string ServiceUri { get; set; }
public abstract void SendData(object data);
public abstract void Flush();
}
class HttpServiceClient : ServiceClient {
public override void SendData(object data) {...}
public override void Flush()
{
// Метод ничего не делает, но присутствует в классе
}
}
class BufferingHttpServiceClient : ServiceClient {
public override void SendData(object data) {...}
public override void Flush() {...}
}
20
abstract class ServiceClient {
public string ServiceUri { get; set; }
public abstract void SendData(object data);
}
abstract class BufferingServiceClient : ServiceClient {
public abstract void Flush();
}
class HttpServiceClient : ServiceClient {
public override void SendData(object data){ ... }
}
class BufferingHttpServiceClient : BufferingServiceClient {
public override void SendData(object data){ ... }
public override void Flush(){ ... }
}
21
 Мартин Р. Мартин М. Принципы, паттерны
и методики гибкой разработки на языке C#.
– СПб.: Символ-Плюс, 2011. – 768 с., ил.
 Ларман К. Применение UML 2.0 и шаблонов
проектирования. Практическое руководство. 3-е
издание. – Пер. с англ. – М.: ООО «И.Д.
Вильямс», 2013. – 736 с.: ил.
 http://bit.ly/40n2uT
 http://bit.ly/gGTAAv
 http://bit.ly/14xRxW7
 http://bit.ly/WmVJpH
22
Спасибо за
внимание!
23

More Related Content

What's hot

CiklumNetSat17032012SergeyKalinets- FubuMVC
CiklumNetSat17032012SergeyKalinets- FubuMVCCiklumNetSat17032012SergeyKalinets- FubuMVC
CiklumNetSat17032012SergeyKalinets- FubuMVCCiklum Ukraine
 
Msu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And UmlMsu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And Umlolegol
 
Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdasDynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdasAlex Mikitenko
 
Java. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLJava. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLcolriot
 
Dynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friendsDynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friendsAlex Mikitenko
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVCUnguryan Vitaliy
 

What's hot (8)

CiklumNetSat17032012SergeyKalinets- FubuMVC
CiklumNetSat17032012SergeyKalinets- FubuMVCCiklumNetSat17032012SergeyKalinets- FubuMVC
CiklumNetSat17032012SergeyKalinets- FubuMVC
 
Step 3.1
Step 3.1Step 3.1
Step 3.1
 
Msu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And UmlMsu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And Uml
 
Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdasDynamic Ruby. Lesson #3: Blocks, procs and lambdas
Dynamic Ruby. Lesson #3: Blocks, procs and lambdas
 
Java. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLJava. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UML
 
Dynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friendsDynamic Ruby. Lesson #4: method_missing and its friends
Dynamic Ruby. Lesson #4: method_missing and its friends
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 

Similar to SOLID. Принципы объектно ориентированного дизайна

C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.Igor Shkulipa
 
Секрет производства: программный продукт, за который не будет стыдно
Секрет производства: программный продукт, за который не будет стыдноСекрет производства: программный продукт, за который не будет стыдно
Секрет производства: программный продукт, за который не будет стыдноCUSTIS
 
Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesbeloslab
 
GRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияGRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияAlexander Nemanov
 
07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASP07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASPEdward Galiaskarov
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
Прагматичный подход к разработке гибких программных систем
Прагматичный подход к разработке гибких программных системПрагматичный подход к разработке гибких программных систем
Прагматичный подход к разработке гибких программных системAlexander Byndyu
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerValeriya Atamanova
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real worldEPAM
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPSergey Nemchinsky
 
PostSharp - Threading Model Library
PostSharp - Threading Model LibraryPostSharp - Threading Model Library
PostSharp - Threading Model LibraryAndrey Gordienkov
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxrobete3065
 

Similar to SOLID. Принципы объектно ориентированного дизайна (19)

C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
 
Секрет производства: программный продукт, за который не будет стыдно
Секрет производства: программный продукт, за который не будет стыдноСекрет производства: программный продукт, за который не будет стыдно
Секрет производства: программный продукт, за который не будет стыдно
 
Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practices
 
GRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного ПроектированияGRASP – паттерны Объектно-Ориентированного Проектирования
GRASP – паттерны Объектно-Ориентированного Проектирования
 
SOLID
SOLIDSOLID
SOLID
 
07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASP07 Архитектура информационных систем. Принципы GRASP
07 Архитектура информационных систем. Принципы GRASP
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Прагматичный подход к разработке гибких программных систем
Прагматичный подход к разработке гибких программных системПрагматичный подход к разработке гибких программных систем
Прагматичный подход к разработке гибких программных систем
 
Netpeak Talks #3: Масштабируемое приложение на PHP
Netpeak Talks #3: Масштабируемое приложение на PHPNetpeak Talks #3: Масштабируемое приложение на PHP
Netpeak Talks #3: Масштабируемое приложение на PHP
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен Dagger
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
Design principles
Design principles Design principles
Design principles
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASP
 
PostSharp - Threading Model
PostSharp - Threading ModelPostSharp - Threading Model
PostSharp - Threading Model
 
PostSharp - Threading Model Library
PostSharp - Threading Model LibraryPostSharp - Threading Model Library
PostSharp - Threading Model Library
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
 
Solid code via tdd
Solid code via tddSolid code via tdd
Solid code via tdd
 
Design Principles
Design PrinciplesDesign Principles
Design Principles
 

SOLID. Принципы объектно ориентированного дизайна

  • 2. Связанность (coupling) определяет насколько жестко один элемент (класс, модуль) связан с другими элементами, либо каким количеством данных о других элементах он владеет. Чем выше связанность, тем сложнее элемент изменить, понять и повторно использовать. Необходимо стремиться к низкой связанности 2
  • 3. 3
  • 4. Связность или сцепление (cohesion) – мера связанности и сфокусированности обязанностей класса. Считается, что элемент обладает высокой степенью сцепления, если его обязанности тесно связаны между собой и он не выполняет непомерных объемов работ. Нужно стараться достигать высокой степени сцепления 4
  • 5. 5
  • 6. 6
  • 7. SRP Принцип единственной обязанности OCP Принцип открытости/закрытости LSP Принцип подстановки Лисков ISP Принцип разделения интерфейсов DIP Принцип инверсии зависимостей 7
  • 8. У класса должна быть только одна причина для изменения (одна обязанность) Пример невыполнения SRP 8
  • 9. 9
  • 10.  Программные сущности (классы, модули, функции и т.п.) должны быть открыты для расширения, но закрыты для модификацииПример невыполнения OCP 10
  • 11. 11
  • 12. Должна быть возможность вместо базового типа подставить любой его подтип. При нарушении LSP часто появляется проверка типов во время выполнения (if или switch по типам, is, as) 12
  • 13. class Rectangle { private Point topLeft; private double width; private double height; public double Width { get { return this.width; } set { this.width = value; } } public double Height { get { return this.height; } set { this.height = value; } } } class Square : Rectangle { public new double Width { set { base.Width = value; base.Height = value; } } public new double Height { set { base.Width = value; base.Height = value; } } } 13
  • 14. void SetWidth(Rectangle r) { r.Width = 32; } У Square будет побочный эффект, а у Rectangle нет – нарушение LSP 14
  • 15. В иерархию добавили метод расчета площади – Area() public void TestArea(Rectangle r) { r.Width = 4; r.Height = 5; Debug.Assert(r.Area() == 20, "Неверная площаль!"); } 15
  • 16.  Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те и другие должны зависеть от абстракции.  Абстракции не должна зависеть от деталей, детали должны зависеть от абстракций. 16
  • 17. 17
  • 18. 18
  • 19. Клиент не должен вынужденно зависеть от методов, которыми не пользуется. Зависимость между классами должна быть ограничена как можно более узким интерфейсом. 19
  • 20. abstract class ServiceClient { public string ServiceUri { get; set; } public abstract void SendData(object data); public abstract void Flush(); } class HttpServiceClient : ServiceClient { public override void SendData(object data) {...} public override void Flush() { // Метод ничего не делает, но присутствует в классе } } class BufferingHttpServiceClient : ServiceClient { public override void SendData(object data) {...} public override void Flush() {...} } 20
  • 21. abstract class ServiceClient { public string ServiceUri { get; set; } public abstract void SendData(object data); } abstract class BufferingServiceClient : ServiceClient { public abstract void Flush(); } class HttpServiceClient : ServiceClient { public override void SendData(object data){ ... } } class BufferingHttpServiceClient : BufferingServiceClient { public override void SendData(object data){ ... } public override void Flush(){ ... } } 21
  • 22.  Мартин Р. Мартин М. Принципы, паттерны и методики гибкой разработки на языке C#. – СПб.: Символ-Плюс, 2011. – 768 с., ил.  Ларман К. Применение UML 2.0 и шаблонов проектирования. Практическое руководство. 3-е издание. – Пер. с англ. – М.: ООО «И.Д. Вильямс», 2013. – 736 с.: ил.  http://bit.ly/40n2uT  http://bit.ly/gGTAAv  http://bit.ly/14xRxW7  http://bit.ly/WmVJpH 22