- Вопросы к экзамену
- Паттерны проектирования
- Паттерн проектирования "Стратегия"
- Паттерн проектирования "Наблюдатель"
- Паттерн проектирования "Декоратор"
- Паттерн проектирования "Абстрактная фабрика"
- Паттерн проектирования "Фабричный метод"
- Паттерн проектирования "Команда"
- Паттерн проектирования "Адаптер"
- Паттерн проектирования "Шаблонный метод"
- Паттерн проектирования "Итератор"
- Паттерн проектирования "Компоновщик"
- Паттерн проектирования "Состояние"
- Паттерн проектирования "Заместитель"
- Паттерн проектирования "Посетитель"
- Паттерн проектирования "Прототип"
- Паттерн проектирования "Строитель"
- Паттерн проектирования "Мост"
- Архитектура GUI-приложений. Document-View
- Архитектура GUI-приложений. Model-View-Controller
- Архитектура GUI-приложений. Model-View-Presenter
- Принципы проектирования ПО
- Паттерны проектирования
- Дайте описание паттерна.
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Должны ли методы стратегии быть константными в C++? Обоснуйте свой ответ.
- Может ли интерфейс стратегии содержать несколько методов или только один?
- Может ли в роли стратегии выступать абстрактный класс вместо интерфейса? В каких случаях это имело бы смысл?
- Может ли класс стратегии иметь состояние? Если да, то приведите пример, когда это имело бы смысл.
- Могут ли метод(ы) стратегии принимать параметры и иметь результат отличный от void? В каких случаях это имело бы смысл?
- Каким образом Контекст и Стратегия обмениваются данными? Какие возможны подходы?
- Какой тип отношения между Контекстом и Стратегией: композиция, агрегация или зависимость?
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Может ли Субъект использоваться без участия Наблюдателей?
- Могут ли методы Наблюдателей, которые вызывает Субъект, возвращать значение, отличное от
void
? Обоснуйте свой ответ. - В каком модуле должен размещаться интерфейс Наблюдателя: в модуле Субъекта, Наблюдателя или где-то ещё? Обоснуйте свой ответ.
- Какие методы могут содержаться в интерфейсе Наблюдателя?
- Как Наблюдатель может узнать о характере изменений, произошедших в Субъекте?
- Может ли один и тот же экземпляр Наблюдателя использоваться для наблюдения за разными Субъектами? Как это сделать?
- Кто из участников паттерна инициирует обновление наблюдателей?
- Каким образом решается проблема висячих ссылок при удалении Субъекта в языках без сборщика мусора?
- Может ли Субъект при своём удалении удалять и своих Наблюдателей?
- Почему важно обеспечивать гарантии целостности состояния Субъекта перед отправкой уведомлений? Как его обеспечить?
- Push и Pull модель в реализации паттерна. Чем они отличаются?
- Как Наблюдатель может указать, в каких обновлениях он заинтересован?
- Может ли Субъект выступать в роли Наблюдателя? Может ли Наблюдатель выступать в роли Субъекта?
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
-
Дайте описание паттерна
-
Какие проблемы решает паттерн?
-
Постройте диаграмму классов этого паттерна (в вариациях "Адаптер объекта" и "Адаптер класса").
-
Чем отличается "Адаптер объекта" от "Адаптера класса"? Почему у этих классов такие названия?
-
Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
-
Какие у паттерна есть преимущества и недостатки?
-
Приведите пример использования (нарисуйте диаграмму классов).
-
Какие существуют альтернативы этому паттерну?
-
Следованию каких принципов SOLID способствует применение паттерна?
-
Какие ограничения есть у паттерна?
-
Напишите пример кода, иллюстрирующий применение этого паттерна.
-
Напишите адаптер, адаптирующий объекты
adaptee
к интерфейсамtarget
. См. диаграмму классов:classDiagram namespace target { class IShape { <<interface>> GetStyle() IStyle& } class IStyle { <<interface>> GetColor() uint32 } } namespace adaptee { class Shape { m_style: Style GetStyle() Style } class Style { m_color: Color GetColor() Color } class Color { <<struct>> r: byte g: byte b: byte a: byte } } class Client { } IShape ..> IStyle Shape *-- Style Style *-- Color Client ..> IShape Client ..> IStyle
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Может ли в иерархии классов быть не один, а несколько классов-компоновщиков? Обоснуйте свой ответ.
- Может ли в иерархии классов
- Приведите пример использования (нарисуйте диаграмму классов).
- Как клиенты могут получить доступ к операциям составного объекта, имея изначально ссылку на базовый компонент?
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Особенности реализации паттерна "Состояние" в языках, не поддерживающих приватное наследование.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие существуют виды паттерна "Заместитель"? Постройте их диаграммы классов?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Для чего применяется ациклический посетитель? Нарисуйте его диаграмму классов. Какие есть недостатки у этой версии паттерна?
- При использовании паттерна "Посетитель" возникает дублирование кода. Как можно уменьшить дублирование кода, используя шаблоны в C++?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Дайте описание паттерна
- Какие проблемы решает паттерн?
- Постройте диаграмму классов этого паттерна.
- Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
- Какие у паттерна есть преимущества и недостатки?
- Приведите пример использования (нарисуйте диаграмму классов).
- Какие существуют альтернативы этому паттерну?
- Следованию каких принципов SOLID способствует применение паттерна?
- Какие ограничения есть у паттерна?
- Напишите пример кода, иллюстрирующий применение этого паттерна.
- Достоинства и недостатки подхода Smart UI.
- Из каких ключевых компонентов состоит приложение, использующее подход Document-View? За что отвечают эти компоненты?
- Постройте диаграмму классов приложения, использующего этот подход.
- Какие паттерны проектирования лежат в основе Document-View?
- Достоинства и недостатки подхода Document-View.
- Каким образом происходит обновление представления при изменении документа?
- Каким образом действия пользователя в одном представлении могут привести к обновлению других представлений этого документа?
- Напишите приложение, построенное с помощью подхода Document-View. Приложение должно отображать в окне сумму двух целых чисел, которые пользователь ввёл в поля ввода в окне. Сумма обновляется всякий раз, когда пользователь обновил содержимое поля ввода.
- Достоинства и недостатки подхода Smart UI.
- Из каких ключевых компонентов состоит приложение, использующее подход Model-View-Controller? За что отвечают эти компоненты?
- Постройте диаграмму классов приложения, использующего этот подход.
- Какие паттерны проектирования лежат в основе Model-View-Controller?
- Достоинства и недостатки подхода Model-View-Controller.
- Каковы сходства и отличия подходов MVC и Document-View.
- Напишите приложение, построенное с помощью подхода Model-View-Controller. Приложение должно отображать в окне сумму двух целых чисел, которые пользователь ввёл в поля ввода в окне. Сумма обновляется всякий раз, когда пользователь обновил содержимое поля ввода.
- Достоинства и недостатки подхода Smart UI.
- Из каких ключевых компонентов состоит приложение, использующее подход Model-View-Presenter? За что отвечают эти компоненты?
- Постройте диаграмму классов приложения, использующего этот подход.
- Какие паттерны проектирования лежат в основе Model-View-Presenter?
- Достоинства и недостатки подхода Model-View-Presenter.
- Каковы сходства и отличия подходов MVP и MVC.
- Напишите приложение, построенное с помощью подхода Model-View-Presenter. Приложение должно отображать в окне сумму двух целых чисел, которые пользователь ввёл в поля ввода в окне. Сумма обновляется всякий раз, когда пользователь обновил содержимое поля ввода.
- Визуализация структуры программы на диаграмме классов.
- Как обозначаются классы на диаграмме классов?
- Как обозначаются абстрактные классы?
- Как обозначить видимость методов и данных на диаграмме классов?
- Как обозначаются статические методы и данные на диаграмме классов?
- Как обозначаются абстрактные методы?
- Композиция.
- Что такое композиция?
- Когда возникает отношение композиции между классами?
- Обозначение композиции на диаграмме классов.
- Приведите пример использования композиции в реальной программе.
- Сокрытие данных при композиции.
- Агрегация
- Что такое агрегация?
- Когда возникает отношение агрегации?
- Обозначение агрегации на диаграмме классов.
- Сокрытие данных при агрегировании.
- Приведите пример агрегации в реальной программе.
- Отличие агрегации и композиции.
- Зависимость
- Что такое зависимость?
- Когда возникает отношение зависимости между классами?
- Обозначение зависимости на диаграмме классов.
- Что такое транзитивность зависимостей?
- Приведите пример зависимости в реальной программе.
- Наследование
- Что такое наследование? Какое отношение между классами существует при наследовании?
- Как наследование обозначается на диаграмме классов?
- Интерфейсы
- Как отображаются интерфейсы на диаграмме классов.
- Каким отношениями могут и не могут быть связаны интерфейсы с другими программными сущностями?
- Как на диаграмме классов обозначается класс, реализующий интерфейс?
- Может ли один интерфейс быть унаследован от другого?
- В чём заключается Принцип Единственной Ответственности?
- Приведите пример нарушения SRP на диаграмме классов. Выполните рефакторинг, чтобы соблюсти SRP.
- Какие выгоды от следования принципу SRP? Обоснуйте свой ответ.
- Как соблюдение и нарушение SRP влияет на поддерживаемость кода? Обоснуйте свой ответ.
- Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
- Как соблюдение и нарушение SRP влияет на тестируемость кода? Обоснуйте свой ответ.
- Выразите своё отношение к следующим утверждениям:
- Согласно SRP класс должен иметь только один метод.
- SRP имеет смысл применять только в больших проектах.
- Следование SRP приводит к чрезмерному количеству классов.
- В соответствии с SRP у класса должна быть ровно одна зона ответственности.
- Принцип единственной ответственности применим только в объектно-ориентированных программах.
- В чём заключается принцип открытости-закрытости?
- В чём важность этого принципа в архитектуре ПО?
- Приведите пример нарушения OCP на диаграмме классов. Какие недостатки имеет архитектура программы? Выполните рефакторинг так, чтобы архитектура следовала этому принципу.
- Какая практическая польза от следования принципу открытости-закрытости? Обоснуйте свой ответ.
- Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
- Как соблюдение и нарушение OCP влияет на легкость поддержки кода? Обоснуйте свой ответ.
- Как соблюдение и нарушение OCP влияет на легкость тестирования? Обоснуйте свой ответ.
- Какие паттерны проектирования помогают соблюдать этот принцип?
- Выразите своё отношение к следующим утверждениям:
- Следование OCP означает, что не нужно никогда вносить изменения в существующий код.
- Принцип открытости-закрытости применим только в объектно-ориентированных программах.
- Следование OCP приводит к излишней сложности кода.
- OCP имеет смысл применять только в больших программах.
- В чём заключается принцип подстановки Лисков?
- Почему этот принцип важен в архитектуре ПО?
- Приведите примеры нарушения LSP.
- Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
- Что такое ковариантность и контрвариантность и как они связаны с этим принципом?
- Как автоматически протестировать соблюдение LPS?
- Как обнаружить нарушение этого принципа при ревью кода?
- Каковы последствия нарушения принципа LSP?
- В чём заключается Принцип Разделения Интерфейса?
- Как этот принцип связан с принципом единственной ответственности?
- Приведите пример нарушения ISP на диаграмме классов. Какой рефакторинг вы бы провели, чтобы соблюсти принцип ISP.
- Как нарушение ISP влияет на легкость тестирования и поддержки кода? Обоснуйте свой ответ.
- Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
- Представьте, что вы проводите ревью кода. Как вы определите, нарушает ли код принцип разделения интерфейса?
- Как принцип этот принцип связан с принципом инверсии зависимостей?
- Выразите своё отношение к утверждениям:
- В соответствии ISP каждый метод должен быть выделен в отдельный интерфейс.
- ISP может быть применён только в объектно-ориентированных программах.
- Следование ISP приводит к чрезмерному количеству интерфейсов.
- ISP имеет смысл применять только в больших проектах.
- В чём заключается принцип инверсии зависимостей?
- В чём важность принципа инверсии зависимостей в архитектуре ПО?
- Приведите пример нарушения DIP на диаграмме классов. Проведите рефакторинг, чтобы соблюсти этот принцип.
- Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
- Какие паттерны проектирования помогают соблюдать DIP?
- Каковы последствия от нарушения DIP? Обоснуйте свой ответ.
- Как следование DIP влияет на легкость тестирования и поддержки кода?
- Приведите пример использования DIP в реальном приложении.
- В чём отличие связности (Cohesion) и сцепленность (Coupling)?
- О чём говорит принцип "High Cohesion, Low Coupling"?
- Что такое устойчивость компонента?
- Метрики устойчивости компонента. Как вычислить неустойчивость компонента?
- В чём заключается принцип устойчивых зависимостей (SDP)?
- Определите устойчивость компонентов и нарушение/соблюдение принципа устойчивых зависимостей по диаграмме классов.
- Как исправить нарушение SDP?
- В чём заключается принцип устойчивости абстракций (SAP)?
- Метрики абстрактности компонента. Как вычислить меру абстрактности компонента?
- Диаграмма устойчивости/абстрактности компонентов. Отобразить компонент на диаграмме устойчивости/абстрактности.
- Ключевые зоны диаграммы: зона боли, зона бесполезности, главная последовательность.
- Как вычислить расстояние до главной последовательности?