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

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

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

Oleg Dashevskii

November 11, 2013
Tweet

More Decks by Oleg Dashevskii

Other Decks in Education

Transcript

  1. ПРИНЦИП ОТДЕЛЕНИЯ ИНТЕРФЕЙСА • Interface Segregation Principle (ISP). • Клиенты

    не должны попадать в зависимость от методов, которыми они не пользуются.
  2. class Door { public: virtual void lock() = 0; virtual

    void unlock() = 0; virtual bool isOpen() = 0; }; ! class Timer { public: void register(int timeout, TimerClient *client); }; ! class TimerClient { public: virtual void timeout() = 0; }; Как сделать класс TimedDoor с сигналом о незакрытии?
  3. ПРОБЛЕМЫ • Door не имеет никакого отношения к таймеру! (SRP)

    • Все пользователи Door должны тащить за собой TimerClient (и зависеть от изменений в оном).
  4. ПРОБЛЕМЫ • Door не имеет никакого отношения к таймеру! (SRP)

    • Все пользователи Door должны тащить за собой TimerClient (и зависеть от изменений в оном). • Возможное нарушение принципа LSP.
  5. ПРОБЛЕМЫ • Door не имеет никакого отношения к таймеру! (SRP)

    • Все пользователи Door должны тащить за собой TimerClient (и зависеть от изменений в оном). • Возможное нарушение принципа LSP. • Если увлекаться подобным подходом, базовый класс будет излишне тучным, а производные — недомерками.
  6. SOLID Single responsibility principle
 Open-closed principle Liskov substitution principle Interface

    Segregation Principle Dependency Inversion principle Solid – прочный, крепкий, надежный…
  7. 1. ПЛАНИРОВАНИЕ • Отделяем то, что будем делать сейчас и

    в ближайшее время, от планов на будущее.
  8. 1. ПЛАНИРОВАНИЕ • Отделяем то, что будем делать сейчас и

    в ближайшее время, от планов на будущее. • Лучше всего браться за нечто простое, но цельное.
  9. 1. ПЛАНИРОВАНИЕ • Отделяем то, что будем делать сейчас и

    в ближайшее время, от планов на будущее. • Лучше всего браться за нечто простое, но цельное. • 90 % сил — сделать хорошо то, что «есть»
 10 % сил — «зарубки» на будущее.
  10. 2. КЛАССЫ И ОБЪЕКТЫ • Выделяем основополагающие объекты. • …если

    не получается: берем описание проекта и смотрим на самые часто встречающиеся существительные.
  11. 2. КЛАССЫ И ОБЪЕКТЫ • Выделяем основополагающие объекты. • …если

    не получается: берем описание проекта и смотрим на самые часто встречающиеся существительные. • Смотрим на связи (наследование, композиция, связь через другой объект, …)
  12. 2. КЛАССЫ И ОБЪЕКТЫ • Выделяем основополагающие объекты. • …если

    не получается: берем описание проекта и смотрим на самые часто встречающиеся существительные. • Смотрим на связи (наследование, композиция, связь через другой объект, …) • Ищем понятную простую, но цельную подсистему, с которой и начинаем, потом ищем еще одну…
  13. 3. ЯДРО И ПРОТОТИП • Признаки «ядерности»: • Ключевые алгоритмы.

    • Наиболее широко используемые абстракции.
  14. 3. ЯДРО И ПРОТОТИП • Признаки «ядерности»: • Ключевые алгоритмы.

    • Наиболее широко используемые абстракции. • Нет аддитивности. Убираем модуль — все рушится.
  15. 3. ЯДРО И ПРОТОТИП • Признаки «ядерности»: • Ключевые алгоритмы.

    • Наиболее широко используемые абстракции. • Нет аддитивности. Убираем модуль — все рушится. • Признаки периферийности:
  16. 3. ЯДРО И ПРОТОТИП • Признаки «ядерности»: • Ключевые алгоритмы.

    • Наиболее широко используемые абстракции. • Нет аддитивности. Убираем модуль — все рушится. • Признаки периферийности: • Частные случаи («поддержка 100 форматов файлов»).
  17. 3. ЯДРО И ПРОТОТИП • Признаки «ядерности»: • Ключевые алгоритмы.

    • Наиболее широко используемые абстракции. • Нет аддитивности. Убираем модуль — все рушится. • Признаки периферийности: • Частные случаи («поддержка 100 форматов файлов»). • Есть аддитивность. Убрали модуль — общий функционал чуть-чуть уменьшился.
  18. На первом этапе нужно вкладываться в ядро и довольствоваться 


    простой периферией! Ядро (прототип) + 
 простенькая периферия = 
 первая версия системы!
  19. ЗАТЫЧКИ • При объявленном полном интерфейсе класса реализация является: •

    пустой; • неполной (частный случай); • медленной; • приближенной; • …но зато пишется мгновенно!
  20. 4. ДАЛЬНЕЙШЕЕ РАЗВИТИЕ • Переход от взрывного роста к эволюционному.

    • Любые изменения не должны ухудшать работоспособность системы, качество кода и документации, нарушать конвенции.
  21. 4. ДАЛЬНЕЙШЕЕ РАЗВИТИЕ • Переход от взрывного роста к эволюционному.

    • Любые изменения не должны ухудшать работоспособность системы, качество кода и документации, нарушать конвенции. • Либо мы находим способ интегрировать новое, либо делаем отдельную систему.
  22. ВЫЯВЛЕНИЕ «БЯКИ» • Реализация «бяки» плоха. • Реализация «бяки» сама

    по себе хороша, но при включении в систему нарушаются принципы ООП. переписать!
  23. ВЫЯВЛЕНИЕ «БЯКИ» • Реализация «бяки» плоха. • Реализация «бяки» сама

    по себе хороша, но при включении в систему нарушаются принципы ООП. переписать! рефакторинг!
  24. ВЫЯВЛЕНИЕ «БЯКИ» • Реализация «бяки» плоха. • Реализация «бяки» сама

    по себе хороша, но при включении в систему нарушаются принципы ООП. • «Бяка» ставит под сомнение какой-то фундаментальный принцип или ограничение, заложенное в ядро. переписать! рефакторинг!
  25. ВЫЯВЛЕНИЕ «БЯКИ» • Реализация «бяки» плоха. • Реализация «бяки» сама

    по себе хороша, но при включении в систему нарушаются принципы ООП. • «Бяка» ставит под сомнение какой-то фундаментальный принцип или ограничение, заложенное в ядро. переписать! рефакторинг! проектирование заново
 с учетом переделок
  26. САМОДОКУМЕНТИРУЕМОСТЬ • Работа сознания человека: 
 имя → ассоциативные поля

    → понимание → действие. • Имя переменной: смысл ее значения.
  27. САМОДОКУМЕНТИРУЕМОСТЬ • Работа сознания человека: 
 имя → ассоциативные поля

    → понимание → действие. • Имя переменной: смысл ее значения. • Имя функции/метода: суть ее поведения.
  28. САМОДОКУМЕНТИРУЕМОСТЬ • Работа сознания человека: 
 имя → ассоциативные поля

    → понимание → действие. • Имя переменной: смысл ее значения. • Имя функции/метода: суть ее поведения. • Имя класса: смысл в общем контексте.
  29. САМОДОКУМЕНТИРУЕМОСТЬ • Работа сознания человека: 
 имя → ассоциативные поля

    → понимание → действие. • Имя переменной: смысл ее значения. • Имя функции/метода: суть ее поведения. • Имя класса: смысл в общем контексте. • Если смысл меняется, должно меняться и имя!
  30. МОДИФИЦИРУЕМОСТЬ • 100 % кода должно быть модифицируемым. • Какой-то

    код придется выбрасывать в любом случае, нужно относиться к этому спокойно.
  31. МОДИФИЦИРУЕМОСТЬ • 100 % кода должно быть модифицируемым. • Какой-то

    код придется выбрасывать в любом случае, нужно относиться к этому спокойно. • «Код на выброс» — не боимся экспериментировать.