
- •1. Событийно-управляемое приложение: событие, типы событий, сообщение, обработчик, механизм обмена сообщениями, очередь сообщений.
- •3. Жизненный цикл объектов: создание, уничтожение, конструкторы, деструкторы. Автоматическое управление памятью. Утечка памяти. Создание объектов с помощью различных конструкторов.
- •4. Наследование, типы видимости, типы наследования. Композиция, агрегация, ассоциация, зависимость. Композиция или наследование, в чём отличие и в чём похожесть.
- •6. Полиморфизм: переопределение и перекрытие методов. Вызов унаследованных методов. Варианты реализации в разных языках. Виртуальный деструктор.
- •7. Приведение типов. Правила, цель, стандартные приемы. Самостоятельная реализация, варианты реализации в разных языках.
- •8.Grasp-паттерны: информационный эксперт, низкая связность, высокое зацепление. Антипаттерны.
- •Золотой молоток (Golden hammer)
- •9. Бесклассовое (прототипно-ориентированное) ооп
- •10. Множественное наследование, интерфейсы и примеси (mixins).
- •11. Делегирование, объектная шизофрения.
- •13. Solid – принципы: sol.
- •14. Solid – принципы: id.
- •15. Объектная интроспекция и рефлексия.
- •16. Язык uml (диаграммы классов, состояний, последовательностей).
- •17. Архитектура Model–View–Controller (mvc) и её варианты. Самый простой способ её нарушить и исправить.
- •17. Одинарная и двойная диспетчеризация.
- •17. Покажите, как с помощью паттерна Prototype можно создавать копии любых объектов, не зная о конкретном классе каждого объекта.
- •18. Требуется создать такой класс, для которого в приложении не может существовать больше одного экземпляра. Опишите ситуацию, в которой это может потребоваться и решение с помощью паттерна Singleton
- •20. Покажите, как с помощью паттерна Decorator динамически (во время выполнения программы) видоизменять поведение объектов.
- •22. Инкапсулируйте любое действие в программе в отдельный объект, и покажите, как паттерн Command позволяет при этом манипулировать такими объектами и реализовывать отмену действий.
- •25. Покажите, как с помощью паттерна Observer можно реализовать динамическую (в момент работы программы) подписку одних объектов на уведомления об изменении других объектов.
- •26. Покажите, как с помощью паттерна Strategy реализуются различные варианты реализации одной и той же функциональности объекта.
- •30. Требуется в имеющейся функциональной иерархии объектов динамически изменять внутреннюю реализацию любого объекта. Покажите, как это может быть сделано с помощью паттерна Bridge.
- •31. Покажите, каким образом с помощью паттерна Visitor можно добавить новую функциональность целой иерархии потомков одного базового класса, не изменив ни одного класса этой иерархии.
8.Grasp-паттерны: информационный эксперт, низкая связность, высокое зацепление. Антипаттерны.
Информационный эксперт (Information expert) – это GRASP-принцип, утверждающий, что код должен быть написан там, где естественным образом есть максимум информации для решения имеющейся проблемы. Например, в вашей первой лабораторной работе, где нужно создавать круги на форме по нажатию на клавишу мыши и выделять их той же клавишей мыши, имея координаты мыши e.X и e.Y написать примерно такой код:
Мы передаем ему всю необходимую информацию для принятия решения, потому что именно он обладает или должен обладать максимумом информации о том, должен ли он выделяться при нажатии на него мыши:
f o r (const auto &s : shape s ) {
s−>onClick ( e .X, e .Y) ;
}
Принцип слабого зацепления (Low coupling) – это GRASP-принцип, требующий снижать связность между объектами как меру того, насколько сильно один класс зависит от его предположений о каком-то другом конкретном классе. Например, мы скажем, что класс A слишком сильно связан с классом B, если класс A так использует класс B, что попытка заменить B на какой-то класс C связана с такими большими проблемами и усилиями, что за это никто из команды программистов даже не готов браться. При этом речь идёт именно о связности между классами, а не между объектами. Например, если два объекта связаны циклически, но через интерфейсы, то это ещё не говорит о нарушении принципа низкой связности, как это было бы, храни они прямые ссылки друг на друга по родным классам.
Принцип высокой связности (High cohesion) – это GRASP-принцип, призванный уравновешивать стремление снизить до нуля какие-либо зависимости классов друг от друга. Он утверждает, что сильно связанная бизнес-логика взаимодействия между объектами реального мира должна выражаться в сильной связности между описывающими их программными классам.
Программирование копи-пастом (Copy and Paste Programming)
Данный анти-паттерн является, наверное, самым древним в программировании. Когда от программиста требуется написание двух схожих функций, самым «простым» решением является написание одной функции, её копирование и внесение некоторых изменений в копию.
Во-первых, ухудшается переносимость кода
Во-вторых, понижается качество кода
В-третьих, усложняется поддержка кода
Золотой молоток (Golden hammer)
Золотой молоток — уверенность в полной универсальности любого решения. На практике это — применение одного решения для всех возможных и невозможных задач..
9. Бесклассовое (прототипно-ориентированное) ооп
Сам подход к созданию новых объектов путем клонирования существующих получает своё развитие в так называемом бесклассовом или прототипно-ориентированном программировании. В «привычном» ООП мы сначала создавали классы, а потом на основе класса можно было создавать объекты. В бесклассовом ООП, как ни странно, классов нет (хотя объекты, разумеется, есть), и для создания типовых и разнообразных объектов используются три механизма:
✎ создание пустого объекта без свойств и методов;
✎ добавление в любой объект новых свойств и методов;
✎ создание копии любого объекта.
Таким образом там, где в классовом ООП мы сначала создавали бы класс, наполняли бы его свойствами и методами, а затем создавали бы множество объектов – в бесклассовом ООП мы сначала создаём пустой объект, наполняем его свойствами и методами, а потом создаём множество клонов. Как и везде, в результате мы получаем, плюс-минус километр, одно и тоже – множество объектов с одинаковыми наборами свойств, но с потенциально разными значениями этих свойств. Конечно, дальше в каждый из таких «экземпляров» могут быть добавлены новые свойства, но правило «все объекты одного класса обязательно имеют одинаковый набор свойств» при этом не нарушается – ведь классов то нет!
Там, где в классовом ООП мы наследовали новый класс от предка, добавляли в него новые свойства и затем уже создавали объекты класса-потомка, в бесклассовом ООП мы клонируем существующий объект, добавляем в него новые свойства и методы, а затем создаём множество клонов изменённого объекта – в этом смысле наследование в прототипном ООП тоже есть, потому что позволяет добиться той же цели.
Понятно, что ЯП, позволяющий «на лету» добавлять в объект свойства и методы, имеет, скорее всего, динамическую природу и допускает большую гибкость. Соответственно, и вопросов по поведению таких объектов возникает сразу возникает много.