Тема  9. Введение в ОО дизайн

Содержание

  1. SOLID
    1. SRP: Принцип единственной ответственности
    2. OCP: Принцип открытости/закрытости
    3. LSP: Принцип подстановки Лисков
    4. ISP: Принцип разделения интерфейса
    5. DIP: Принцип инверсии зависимостей
  2. Квадрат и прямоугольник
    1. Постановка задачи
    2. Источник проблем
    3. Возможные решения
      1. Отказ от изменений
        1. Возврат нового значения
        2. Возврат флага
        3. Исключения
      2. Отказ от наследования
        1. Полный
        2. Выделение общего базового класса
      3. Дополнительные действия
      4. Выделение модифицируемых сущностей
      5. Отказ от квадратов
  3. Равенство
    1. Свойства равенства
    2. Метод equals
    3. Метод hashCode
    4. Взаимодействие с наследованием
      1. Наивная реализация
      2. Использование сравнения предка
      3. Сегрегация сравнения

Домашнее задание 12. Выражения

  1. Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide для вычисления выражений с одной переменной в типе int (интерфейс Expression).
  2. Классы должны позволять составлять выражения вида
    new Subtract(
        new Multiply(
            new Const(2),
            new Variable("x")
        ),
        new Const(3)
    ).evaluate(5)
                
    При вычислении такого выражения вместо каждой переменной подставляется значение, переданное в качестве параметра методу evaluate. Таким образом, результатом вычисления приведенного примера должно стать число 7.
  3. Метод toString должен выдавать запись выражения в полноскобочной форме. Например
    new Subtract(
        new Multiply(
            new Const(2),
            new Variable("x")
        ),
        new Const(3)
    ).toString()
                
    должен выдавать ((2 * x) - 3).
  4. Сложный вариант. Метод toMiniString (интерфейс ToMiniString) должен выдавать выражение с минимальным числом скобок. Например
    new Subtract(
        new Multiply(
            new Const(2),
            new Variable("x")
        ),
        new Const(3)
    ).toMiniString()
                
    должен выдавать 2 * x - 3.
  5. Реализуйте метод equals, проверяющий, что два выражения совпадают. Например,
    new Multiply(new Const(2), new Variable("x"))
        .equals(new Multiply(new Const(2), new Variable("x")))
                
    должно выдавать true, а
    new Multiply(new Const(2), new Variable("x"))
        .equals(new Multiply(new Variable("x"), new Const(2)))
                
    должно выдавать false.
  6. Для тестирования программы должен быть создан класс Main, который вычисляет значение выражения x2−2x+1, для x, заданного в командной строке.
  7. При выполнении задания следует обратить внимание на:
    • Выделение общего интерфейса создаваемых классов.
    • Выделение абстрактного базового класса для бинарных операций.

Слайды

HTML

Экзаменационные вопросы

  1. Принципы SOLID
  2. Проблема квадрата и прямоугольника
  3. Равенство объектов

Практические навыки

  1. Умение определять необходимость наследования
  2. Умение реализовывать корректное сравнение объектов на равенство

Библиография

  1. Robert C. M. Design Principles and Design Patterns
  2. Wikipedia Wikipedia: SOLID
  3. Robert C. M. The Liskov Substitution Principle
  4. Wikipedia Circle-Ellipse problem
  5. Odersky M., Spoon L., Venners B. How to Write an Equality Method in Java