- •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 можно добавить новую функциональность целой иерархии потомков одного базового класса, не изменив ни одного класса этой иерархии.
13. Solid – принципы: sol.
SOLID – это английская аббревиатура для пяти известных принципов, применяемых при разработке объектно-ориентированных программ
● S — Single Responsibility Principle (SRP), единственная ответственность. Каждый класс отвечает за строго определенную функциональность, инкапсулированную в классе. Если это не так, класс нужно разбить и использовать композицию.
● O — Open-Close Principle (OCP), открытость-закрытость. Программные сущности (классы, функции, модули) должны быть открыты для расширения, но закрыты для изменения. Есть две интерпретации принципа: ○ Однажды разработанная реализация класса в дальнейшем требует только исправления ошибок, а новые или измененные функции требуют создания нового класса, возможно, наследуемого от старого.
● L — Liskov Substitution Principle (LSP), принцип подстановки Барбары Лисков. Если нечто справедливо по отношению к классу-предку, то оно должно быть справедливо и к классу-потомку, только такое наследование допустимо. Иначе: функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа без знания об этом. Поведение наследуемых классов не должно противоречить поведению базового класса.
14. Solid – принципы: id.
SOLID – это английская аббревиатура для пяти известных принципов, применяемых при разработке объектно-ориентированных программ
I — Interface Segregation Principle (ISP), принцип разделения интерфейсов. Сложные интерфейсы необходимо разделять на более специфические, чтобы потенциальные объекты, использующие только часть интерфейса, не реализовывали все его методы. Клиенты не должны реализовывать методы, которые им не нужно использовать. Кроме того, этот принцип указывает на то, что интерфейс должен решать лишь какую-то одну задачу.
D — Dependency Inversion/Injection Principle (DIP), принцип инверсии/внедрения зависимостей.
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
15. Объектная интроспекция и рефлексия.
Интроспекция и рефлексия – два связанных понятия, описывающих возможность программного кода анализировать (интроспекция) и изменять (рефлексия) свою собственную внутреннюю структуру.
Интроспекция — это способность программы исследовать тип или свойства объекта во время работы программы. Как мы уже упоминали, вы можете поинтересоваться, каков тип объекта, является ли он экземпляром класса.
Рефлексия — это способность компьютерной программы изучать и модифицировать свою структуру и поведение во время выполнения. Простым языком: она позволяет вам вызывать методы объектов, создавать новые объекты, модифицировать их, даже не зная имён интерфейсов, полей, методов во время компиляции.
В C++ интроспекцию можно провести, например, с помощью dynamic_cast. В Java используется instanceof или Object.getClass() и Class.getName(). Можно использовать собственные методы:
● с помощью виртуального метода getClassName(), который возвращает в строке название класса; метод не учитывает иерархию класса;
● с помощью виртуального метода isA(String _who), сравнивает переданную строку с названием класса и вызывает метод для вышестоящего в иерархии класса; метод учитывает иерархию.
