🗊Презентация Принципы объектно-ориентированного дизайна

Нажмите для полного просмотра!
Принципы объектно-ориентированного дизайна, слайд №1Принципы объектно-ориентированного дизайна, слайд №2Принципы объектно-ориентированного дизайна, слайд №3Принципы объектно-ориентированного дизайна, слайд №4Принципы объектно-ориентированного дизайна, слайд №5Принципы объектно-ориентированного дизайна, слайд №6Принципы объектно-ориентированного дизайна, слайд №7Принципы объектно-ориентированного дизайна, слайд №8Принципы объектно-ориентированного дизайна, слайд №9Принципы объектно-ориентированного дизайна, слайд №10Принципы объектно-ориентированного дизайна, слайд №11Принципы объектно-ориентированного дизайна, слайд №12Принципы объектно-ориентированного дизайна, слайд №13Принципы объектно-ориентированного дизайна, слайд №14Принципы объектно-ориентированного дизайна, слайд №15Принципы объектно-ориентированного дизайна, слайд №16Принципы объектно-ориентированного дизайна, слайд №17Принципы объектно-ориентированного дизайна, слайд №18Принципы объектно-ориентированного дизайна, слайд №19Принципы объектно-ориентированного дизайна, слайд №20Принципы объектно-ориентированного дизайна, слайд №21Принципы объектно-ориентированного дизайна, слайд №22Принципы объектно-ориентированного дизайна, слайд №23Принципы объектно-ориентированного дизайна, слайд №24Принципы объектно-ориентированного дизайна, слайд №25Принципы объектно-ориентированного дизайна, слайд №26Принципы объектно-ориентированного дизайна, слайд №27

Содержание

Вы можете ознакомиться и скачать презентацию на тему Принципы объектно-ориентированного дизайна. Доклад-сообщение содержит 27 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Принципы объектно-ориентированного дизайна
SOLID:
Single responsibility
Open-closed
Liskov substitution
Interface segregation
Dependency inversion
Описание слайда:
Принципы объектно-ориентированного дизайна SOLID: Single responsibility Open-closed Liskov substitution Interface segregation Dependency inversion

Слайд 2





Что такое SOLID
SOLID - это аббревиатура пяти основных принципов дизайна классов в объектно-ориентированном проектировании.
Аббревиатура была введена Робертом Мартином в начале 2000-х.
Рекомендую почитать:
Чистый код. Роберт Мартин
Описание слайда:
Что такое SOLID SOLID - это аббревиатура пяти основных принципов дизайна классов в объектно-ориентированном проектировании. Аббревиатура была введена Робертом Мартином в начале 2000-х. Рекомендую почитать: Чистый код. Роберт Мартин

Слайд 3





Основные принципы
Single responsibility - Принцип единственной обязанности
Open-closed - Принцип открытости/закрытости
Liskov substitution - Принцип подстановки Барбары Лисков
Interface segregation - Принцип разделения интерфейса
Dependency inversion - Принцип инверсии зависимостей
Описание слайда:
Основные принципы Single responsibility - Принцип единственной обязанности Open-closed - Принцип открытости/закрытости Liskov substitution - Принцип подстановки Барбары Лисков Interface segregation - Принцип разделения интерфейса Dependency inversion - Принцип инверсии зависимостей

Слайд 4





Single responsibility
Принцип единственной обязанности
Класс или модуль должны иметь одну и только одну причину измениться.
Описание слайда:
Single responsibility Принцип единственной обязанности Класс или модуль должны иметь одну и только одну причину измениться.

Слайд 5





Пример нарушения принципа SRP
class Order
{
    public void calculate(){ ... }
    public void addItem(Product product){ ... }
    public List<Product> getItems(){ ... }
    ...
    public void load(){ ... }
    public void save(){ ... }
    public void print(){ ... }
}
Описание слайда:
Пример нарушения принципа SRP class Order { public void calculate(){ ... } public void addItem(Product product){ ... } public List<Product> getItems(){ ... } ... public void load(){ ... } public void save(){ ... } public void print(){ ... } }

Слайд 6





Как исправить
class Order
{
    public void calculate();
    public void addItem(Product product){ ... }
    public List<Product> getItems(){ ... }
}
 
class OrderRepository
{
    public Order load(int orderId){ ... }
    public void save(Order order){ ... }
}
 
class OrderPrintManager
{
    public void print(Order order){ ... }
}
Описание слайда:
Как исправить class Order { public void calculate(); public void addItem(Product product){ ... } public List<Product> getItems(){ ... } } class OrderRepository { public Order load(int orderId){ ... } public void save(Order order){ ... } } class OrderPrintManager { public void print(Order order){ ... } }

Слайд 7





Но...
Существует, например, паттерн Active Record, который нарушает принцип SRP
Active Record может быть успешно использован в небольших проектах с простой бизнес-логикой.
Описание слайда:
Но... Существует, например, паттерн Active Record, который нарушает принцип SRP Active Record может быть успешно использован в небольших проектах с простой бизнес-логикой.

Слайд 8





Open-closed 
Принцип открытости/закрытости
Объекты проектирования (классы, функции, модули и т.д.) должны быть открыты для расширения, но закрыты для модификации.
Это означает, что новое поведение должно добавляться только добавлением новых сущностей, а не изменением старых.
Описание слайда:
Open-closed Принцип открытости/закрытости Объекты проектирования (классы, функции, модули и т.д.) должны быть открыты для расширения, но закрыты для модификации. Это означает, что новое поведение должно добавляться только добавлением новых сущностей, а не изменением старых.

Слайд 9





Пример нарушения OCP
class MessageSender {
    …
    public void send(String message, MessageType type){
            if(type == MessageType.SMS)                                sendSMS(msg);
            else 
               if(type == MessageType.EMAIL)                               sendEmail(msg);
   }
}
Описание слайда:
Пример нарушения OCP class MessageSender { … public void send(String message, MessageType type){ if(type == MessageType.SMS) sendSMS(msg); else if(type == MessageType.EMAIL) sendEmail(msg); } }

Слайд 10





Как исправить
Воспользуемся паттерном “Стратегия”
Описание слайда:
Как исправить Воспользуемся паттерном “Стратегия”

Слайд 11





Как исправить(продолжение)
Конкретные стратегии отправки
Описание слайда:
Как исправить(продолжение) Конкретные стратегии отправки

Слайд 12





Liskov substitution 
Принцип подстановки Барбары Лисков
Роберт С. Мартин определил этот принцип так:
    Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом.
Описание слайда:
Liskov substitution Принцип подстановки Барбары Лисков Роберт С. Мартин определил этот принцип так: Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом.

Слайд 13





Замещение
Описание слайда:
Замещение

Слайд 14





Нарушение принципа LSP
Circle-ellipse problem
Square-rectangle problem
Описание слайда:
Нарушение принципа LSP Circle-ellipse problem Square-rectangle problem

Слайд 15





Square-rectangle problem
Является ли класс Квадрат подклассом класса Прямоугольник?
Описание слайда:
Square-rectangle problem Является ли класс Квадрат подклассом класса Прямоугольник?

Слайд 16





Класс Rectangle
class Rectangle {
    private double width;
    private double height;
    public double getWidth() {
        return width;
    }
    public void setWidth(double width) {
        this.width = width;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public String toString() {		
        return this.width + "x" + this.height;
    }
}
Описание слайда:
Класс Rectangle class Rectangle { private double width; private double height; public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public String toString() { return this.width + "x" + this.height; } }

Слайд 17





Класс Square
class Square extends Rectangle {
  public void setWidth(double width) {
    this.setSide(width);
  }
  public void setHeight(double height) {
    this.setSide(height);
  }
  public void setSide(double side) {
    super.setWidth(side);
    super.setHeight(side);
  }
}
Описание слайда:
Класс Square class Square extends Rectangle { public void setWidth(double width) { this.setSide(width); } public void setHeight(double height) { this.setSide(height); } public void setSide(double side) { super.setWidth(side); super.setHeight(side); } }

Слайд 18





В чем же проблема?
public class LiskovViolation {
   public static void main(String[] args) {
      Rectangle rectangle = new Square();
      rectangle.setWidth(10);
      System.out.println(rectangle); // 10.0x10.0
      rectangle.setHeight(20);
      System.out.println(rectangle); // 20.0x20.0 !!!! Should be 10.0x20.0
  }
}
Описание слайда:
В чем же проблема? public class LiskovViolation { public static void main(String[] args) { Rectangle rectangle = new Square(); rectangle.setWidth(10); System.out.println(rectangle); // 10.0x10.0 rectangle.setHeight(20); System.out.println(rectangle); // 20.0x20.0 !!!! Should be 10.0x20.0 } }

Слайд 19





Как исправить
Если использовать концепцию неизменяемого объекта (immutable object), то принцип не будет нарушаться.
Необходимо убрать возможность изменения объекта после его создания.
Описание слайда:
Как исправить Если использовать концепцию неизменяемого объекта (immutable object), то принцип не будет нарушаться. Необходимо убрать возможность изменения объекта после его создания.

Слайд 20





Interface segregation 
Принцип разделения интерфейса
Слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе.
Описание слайда:
Interface segregation Принцип разделения интерфейса Слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе.

Слайд 21





“Толстый” интерфейс
Если среди методов интерфейса можно выделить группы методов, которые нужны определенным пользователям интерфейса, то скорее всего интерфейс “толстый”.
Такой интерфейс нужно разбить на более мелкие, которые будут выражать потребности конкретной группы пользователей интерфейса.
Описание слайда:
“Толстый” интерфейс Если среди методов интерфейса можно выделить группы методов, которые нужны определенным пользователям интерфейса, то скорее всего интерфейс “толстый”. Такой интерфейс нужно разбить на более мелкие, которые будут выражать потребности конкретной группы пользователей интерфейса.

Слайд 22





Пример нарушения ISP
interface Person {
    void goToWork();
    void withdrawSalary();
    void eat();
}
Описание слайда:
Пример нарушения ISP interface Person { void goToWork(); void withdrawSalary(); void eat(); }

Слайд 23





Как исправить
public interface Person {
    void eat();
}
public interface Worker {
    void goToWork();
    void withdrawSalary();
}
Описание слайда:
Как исправить public interface Person { void eat(); } public interface Worker { void goToWork(); void withdrawSalary(); }

Слайд 24





Dependency inversion 
Принцип инверсии зависимостей
Все взаимосвязи в программе должны поддерживаться с помощью абстракных классом или интерфейсов.
Описание слайда:
Dependency inversion Принцип инверсии зависимостей Все взаимосвязи в программе должны поддерживаться с помощью абстракных классом или интерфейсов.

Слайд 25





Нарушение принципа DIP
public class Crawler {
    public void saveHtmlDocument() {
     DomBasedHtmlParser parser = new DomBasedHtmlParser();
     HtmlDocument document = parser.parseUrl("http://example.com/");
     save(document, "index.html");
    }
    public void save(HtmlDocument htmlDocument, String pageName) {
     // сохранение документа в файл
    }
}
Описание слайда:
Нарушение принципа DIP public class Crawler { public void saveHtmlDocument() { DomBasedHtmlParser parser = new DomBasedHtmlParser(); HtmlDocument document = parser.parseUrl("http://example.com/"); save(document, "index.html"); } public void save(HtmlDocument htmlDocument, String pageName) { // сохранение документа в файл } }

Слайд 26





Как исправить. Вариант 1
public class Crawler {
    private HtmlParser parser;
    public Crawler(HtmlParser parser) {
        this.parser = parser;
    }
    public void saveHtmlDocument() {
     HtmlDocument document = parser.parseUrl("http://example.com/");
     save(document, "index.html");
    }
    public void save(HtmlDocument htmlDocument, String pageName) {
     // сохранение документа в файл
    }
}
Описание слайда:
Как исправить. Вариант 1 public class Crawler { private HtmlParser parser; public Crawler(HtmlParser parser) { this.parser = parser; } public void saveHtmlDocument() { HtmlDocument document = parser.parseUrl("http://example.com/"); save(document, "index.html"); } public void save(HtmlDocument htmlDocument, String pageName) { // сохранение документа в файл } }

Слайд 27





Как исправить. Вариант 2
public class Crawler{
    private HtmlParser parser = ParserFactory.getHtmlParser();
    public void saveHtmlDocument() {
     HtmlDocument document = parser.parseUrl("http://example.com/");
     save(document, "index.html");
    }
    public void save(HtmlDocument htmlDocument, String pageName) {
     // сохранение документа в файл
    }
}
Описание слайда:
Как исправить. Вариант 2 public class Crawler{ private HtmlParser parser = ParserFactory.getHtmlParser(); public void saveHtmlDocument() { HtmlDocument document = parser.parseUrl("http://example.com/"); save(document, "index.html"); } public void save(HtmlDocument htmlDocument, String pageName) { // сохранение документа в файл } }



Похожие презентации
Mypresentation.ru
Загрузить презентацию