Upgrade to Pro — share decks privately, control downloads, hide ads and more …

АФТИ ООП 2013-2014. Лекция I/08

АФТИ ООП 2013-2014. Лекция I/08

Oleg Dashevskii

October 28, 2013
Tweet

More Decks by Oleg Dashevskii

Other Decks in Education

Transcript

  1. V. МОДУЛЬНАЯ ЗАЩИЩЕННОСТЬ Аварийная ситуация в одном из модулей ограничится

    только этим модулем или максимум несколькими соседними
  2. ПРИНЦИП ПОДСТАНОВКИ ЛИСКОУ • Liskov Substitution Principle (LSP). • «Подтипы

    должны быть заменяемы их исходными типами»
  3. SQUARE И RECTANGLE • Если класс Rectangle имеет интерфейс, предполагающий

    раздельность изменений ширины и высоты (setWidth, setHeight), то Square нельзя наследовать от Rectangle. • Можно сделать, чтобы у класса Square и setWidth, и setHeight устанавливали как высоту, так и ширину, поддерживая «квадратность», но…
  4. void testArea(Rectangle &r) { ! r.setWidth(5); ! r.setHeight(4); ! assert(r.area()

    == 20); } Сломается, если передать Square
  5. ПРИНЦИП ИНВЕРСИИ ЗАВИСИМОСТЕЙ • Dependency Inversion Principle (DIP). • Модули

    высокого уровня не должны зависеть от модулей низкого уровня. Оба типа модулей должны зависеть от абстракций. • Абстракции не должны зависеть от подробностей, наоборот, подробности должны зависеть от абстракций.
  6. ПРОГРАММА COPY void copy() { int ch; while ((ch =

    getchar()) != EOF) putchar(ch); } Функция высокого уровня Функции низкого уровня
  7. BUTTON И LAMP class Lamp { public: void turnOn(); void

    turnOff(); }; class Button { Lamp lamp; public: void poll() { if (/*условие*/) lamp.turnOn(); } };
  8. BUTTON И LAMP class Lamp { public: void turnOn(); void

    turnOff(); }; class Button { Lamp lamp; public: void poll() { if (/*условие*/) lamp.turnOn(); } }; Сильная зависимость. Невозможно использовать Button для управления чем-то еще Button Lamp
  9. РЕФАКТОРИНГ class ButtonControllable { public: virtual void turnOn(); virtual void

    turnOff(); }; class Lamp : public ButtonControllable { public: virtual void turnOn(); virtual void turnOff(); }; class Button { ButtonControllable *controlled; public: // ... void poll() { if (/*условие*/) controlled->turnOn(); } }; Button Lamp Button Controllable
  10. ПОДДЕРЖАНИЕ ТЕМПЕРАТУРЫ #define THERMOMETER 0x86 #define FURNACE 0x87 #define ENGAGE

    1 #define DISENGAGE 0 void regulate(double minTemp, double maxTemp) { ! for (;;) { ! ! while (in(THERMOMETER) > minTemp) ! ! ! wait(1); ! ! out(FURNACE, ENGAGE); ! ! while (in(THERMOMETER) < maxTemp) ! ! ! wait(1); ! ! out(FURNACE, DISENGAGE); ! } }
  11. РЕФАКТОРИНГ void regulate(Thermometer &t, Heater &h, ! double minTemp, double

    maxTemp) { ! for (;;) { ! ! while (t.read() > minTemp) ! ! ! wait(1); ! ! h.engage(); ! ! while (t.read() < maxTemp) ! ! ! wait(1); ! ! h.disengage(); ! } }