SOLID
     GRASP
основные принципы ООП
SOLID
Буква Акро-   англ.                   рус.
      ним
      SRP     Single responsibility   Принцип единственной
  S
              principle               обязанности
      OCP     Open/closed principle   Принцип
 O
                                      открытости/закрытости
      LSP     Liskov substitution     Принцип подстановки
  L
              principle               Барбары Лисков
      ISP     Interface segregation   Принцип изоляции
  I
              principle               интерфейса
      DIP     Dependency inversion Принцип инверсии
 D
              principle            зависимостей
Single responsibility principle
    Принцип единственной обязанности

На каждый объект должна быть возложена одна
         единственная обязанность.
смешенная ответственность




разделенная ответственность
Open/closed principle
      Принцип открытости/закрытости

Программные сущности должны быть открыты для
    расширения, но закрыты для изменения.
открытая "кухня"




закрытая "кухня"
Liskov substitution principle
   Принцип подстановки Барбары Лисков

 Объекты в программе могут быть заменены их
наследниками без изменения свойств программы.
кот и пес не смогут стать животными :)
треугольник может стать фигурой
Interface segregation principle
        Принцип изоляции интерфейса

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




набор тонких специализированных интерфейсов
Dependency inversion principle
            Принцип инверсии зависимостей

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

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




слабая зависимость
GRASP
General Responsibility Assignment Software Patterns
  №   англ.                  рус.
  1   Information Expert     Информационный эксперт
  2   Creator                Создатель
  3   Controller             Контроллер
  4   Low Coupling           Слабая связанность
  5   High Cohesion          Сильное зацепление
  6   Polymorphism           Полиморфизм
  7   Pure Fabrication       Чистая выдумка
  8   Indirection            Посредник
  9   Protected Variations   Сокрытие реализации
Information Expert
         Информационный эксперт

   обязанности должны быть назначены
  объекту, который владеет максимумом
необходимой информации для выполнения
обязанности (информационному эксперту).

      Тривиально, но очень важно!
Creator
                     Создатель

    Это применение шаблона Information
    Expert к проблеме создания объектов.

Класс B должен (может) создавать объекты
             класса A когда:
●   Класс B содержит или агрегирует объекты A.
●   Класс B записывает экземпляры объектов A.
●   Класс B активно использует объекты A
●   Класс B обладает данными инициализации для
    объектов A.
Abstract Factory
Абстрактная фабрика
Builder
Строитель
Controller
                    Контроллер

     Берет на себя ответственность за
   выполнение операций, приходящих от
              пользователя.

    Как правило, не выполняет работу
самостоятельно, а делегирует обязанности
         компетентным объектам.

Пример: Model-View-Controller
Low Coupling
                     Слабая связанность

Распределяет обязанности между
объектами таким образом, чтобы степень
связанности между системами оставалась
низкой.
Степень связанности (coupling) — это мера, определяющая, насколько
жестко один элемент связан с другими элементами, либо каким
количеством данных о других элементах он обладает.

Свойства элемента с низкой степенью связанности(слабым связыванием):
●   Малое число зависимостей между классами (подсистемами).
●   Слабая зависимость одного класса (подсистемы) от изменений в
    другом классе (подсистеме).
●   Высокая степень повторного использования подсистем.
High Cohesion
        Сильное (функциональное) зацепление

     Задает свойство сильного зацепления
             внутри подсистемы.
Зацепление (cohesion) (функциональное зацепление) — это мера
связанности и сфокусированности обязанностей класса.


Объект обладает высокой степенью зацепления, если
его обязанности тесно связаны между собой и он не
выполняет огромных объемов работы.

Antipattern: God object
Polymorphism
                  Полиморфизм

 Позволяет обрабатывать альтернативные
  варианты поведения на основе типа и
   заменять подключаемые компоненты
                системы.

Все альтернативные реализации приводятся к общему
интерфейсу.
Pure Fabrication
              Чистая выдумка

 Класс, не отражающий никакого реального
объекта предметной области, но специально
  придуманный для усиления зацепления,
  ослабления связанности или увеличения
    степени повторного использования.
Indirection
                    Посредник

  Поддерживает слабую связанность путём
 назначения обязанностей промежуточному
                 объекту.

Пример: Model-View-Controller
Protected Variations
           Сокрытие реализации

Защищает элементы от изменения других
  элементов, вынося взаимодействия в
      фиксированный интерфейс.

Поведение может варьироваться лишь с помощью
   создания другой реализации интерфейса.
SOLID & GRASP

SOLID & GRASP

  • 1.
    SOLID GRASP основные принципы ООП
  • 3.
    SOLID Буква Акро- англ. рус. ним SRP Single responsibility Принцип единственной S principle обязанности OCP Open/closed principle Принцип O открытости/закрытости LSP Liskov substitution Принцип подстановки L principle Барбары Лисков ISP Interface segregation Принцип изоляции I principle интерфейса DIP Dependency inversion Принцип инверсии D principle зависимостей
  • 5.
    Single responsibility principle Принцип единственной обязанности На каждый объект должна быть возложена одна единственная обязанность.
  • 6.
  • 8.
    Open/closed principle Принцип открытости/закрытости Программные сущности должны быть открыты для расширения, но закрыты для изменения.
  • 9.
  • 11.
    Liskov substitution principle Принцип подстановки Барбары Лисков Объекты в программе могут быть заменены их наследниками без изменения свойств программы.
  • 12.
    кот и песне смогут стать животными :)
  • 13.
  • 15.
    Interface segregation principle Принцип изоляции интерфейса Много специализированных интерфейсов лучше, чем один универсальный.
  • 16.
    жирный интерфейс набор тонкихспециализированных интерфейсов
  • 18.
    Dependency inversion principle Принцип инверсии зависимостей Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. а) Модули более высокого уровня не должны зависеть от модулей более низкого уровня. И те и другие должны зависеть только от абстракций. б) Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
  • 19.
  • 20.
    GRASP General Responsibility AssignmentSoftware Patterns № англ. рус. 1 Information Expert Информационный эксперт 2 Creator Создатель 3 Controller Контроллер 4 Low Coupling Слабая связанность 5 High Cohesion Сильное зацепление 6 Polymorphism Полиморфизм 7 Pure Fabrication Чистая выдумка 8 Indirection Посредник 9 Protected Variations Сокрытие реализации
  • 21.
    Information Expert Информационный эксперт обязанности должны быть назначены объекту, который владеет максимумом необходимой информации для выполнения обязанности (информационному эксперту). Тривиально, но очень важно!
  • 23.
    Creator Создатель Это применение шаблона Information Expert к проблеме создания объектов. Класс B должен (может) создавать объекты класса A когда: ● Класс B содержит или агрегирует объекты A. ● Класс B записывает экземпляры объектов A. ● Класс B активно использует объекты A ● Класс B обладает данными инициализации для объектов A.
  • 24.
  • 25.
  • 26.
    Controller Контроллер Берет на себя ответственность за выполнение операций, приходящих от пользователя. Как правило, не выполняет работу самостоятельно, а делегирует обязанности компетентным объектам. Пример: Model-View-Controller
  • 28.
    Low Coupling Слабая связанность Распределяет обязанности между объектами таким образом, чтобы степень связанности между системами оставалась низкой. Степень связанности (coupling) — это мера, определяющая, насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает. Свойства элемента с низкой степенью связанности(слабым связыванием): ● Малое число зависимостей между классами (подсистемами). ● Слабая зависимость одного класса (подсистемы) от изменений в другом классе (подсистеме). ● Высокая степень повторного использования подсистем.
  • 29.
    High Cohesion Сильное (функциональное) зацепление Задает свойство сильного зацепления внутри подсистемы. Зацепление (cohesion) (функциональное зацепление) — это мера связанности и сфокусированности обязанностей класса. Объект обладает высокой степенью зацепления, если его обязанности тесно связаны между собой и он не выполняет огромных объемов работы. Antipattern: God object
  • 30.
    Polymorphism Полиморфизм Позволяет обрабатывать альтернативные варианты поведения на основе типа и заменять подключаемые компоненты системы. Все альтернативные реализации приводятся к общему интерфейсу.
  • 32.
    Pure Fabrication Чистая выдумка Класс, не отражающий никакого реального объекта предметной области, но специально придуманный для усиления зацепления, ослабления связанности или увеличения степени повторного использования.
  • 34.
    Indirection Посредник Поддерживает слабую связанность путём назначения обязанностей промежуточному объекту. Пример: Model-View-Controller
  • 35.
    Protected Variations Сокрытие реализации Защищает элементы от изменения других элементов, вынося взаимодействия в фиксированный интерфейс. Поведение может варьироваться лишь с помощью создания другой реализации интерфейса.