Skip to content

Latest commit

 

History

History

exam

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Вопросы к экзамену

Паттерны проектирования

Паттерн проектирования "Стратегия"

  • Дайте описание паттерна.
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов 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
    
    Loading

Паттерн проектирования "Шаблонный метод"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Паттерн проектирования "Итератор"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Паттерн проектирования "Компоновщик"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Может ли в иерархии классов быть не один, а несколько классов-компоновщиков? Обоснуйте свой ответ.
  • Может ли в иерархии классов
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Как клиенты могут получить доступ к операциям составного объекта, имея изначально ссылку на базовый компонент?
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Паттерн проектирования "Состояние"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.
  • Особенности реализации паттерна "Состояние" в языках, не поддерживающих приватное наследование.

Паттерн проектирования "Заместитель"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие существуют виды паттерна "Заместитель"? Постройте их диаграммы классов?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Паттерн проектирования "Посетитель"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Для чего применяется ациклический посетитель? Нарисуйте его диаграмму классов. Какие есть недостатки у этой версии паттерна?
  • При использовании паттерна "Посетитель" возникает дублирование кода. Как можно уменьшить дублирование кода, используя шаблоны в C++?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Паттерн проектирования "Прототип"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Паттерн проектирования "Строитель"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Паттерн проектирования "Мост"

  • Дайте описание паттерна
  • Какие проблемы решает паттерн?
  • Постройте диаграмму классов этого паттерна.
  • Какие классы/интерфейсы участвуют в паттерне? Какую роль они играют?
  • Какие у паттерна есть преимущества и недостатки?
  • Приведите пример использования (нарисуйте диаграмму классов).
  • Какие существуют альтернативы этому паттерну?
  • Следованию каких принципов SOLID способствует применение паттерна?
  • Какие ограничения есть у паттерна?
  • Напишите пример кода, иллюстрирующий применение этого паттерна.

Архитектура GUI-приложений. Document-View

  • Достоинства и недостатки подхода Smart UI.
  • Из каких ключевых компонентов состоит приложение, использующее подход Document-View? За что отвечают эти компоненты?
  • Постройте диаграмму классов приложения, использующего этот подход.
  • Какие паттерны проектирования лежат в основе Document-View?
  • Достоинства и недостатки подхода Document-View.
  • Каким образом происходит обновление представления при изменении документа?
  • Каким образом действия пользователя в одном представлении могут привести к обновлению других представлений этого документа?
  • Напишите приложение, построенное с помощью подхода Document-View. Приложение должно отображать в окне сумму двух целых чисел, которые пользователь ввёл в поля ввода в окне. Сумма обновляется всякий раз, когда пользователь обновил содержимое поля ввода.

Архитектура GUI-приложений. Model-View-Controller

  • Достоинства и недостатки подхода Smart UI.
  • Из каких ключевых компонентов состоит приложение, использующее подход Model-View-Controller? За что отвечают эти компоненты?
  • Постройте диаграмму классов приложения, использующего этот подход.
  • Какие паттерны проектирования лежат в основе Model-View-Controller?
  • Достоинства и недостатки подхода Model-View-Controller.
  • Каковы сходства и отличия подходов MVC и Document-View.
  • Напишите приложение, построенное с помощью подхода Model-View-Controller. Приложение должно отображать в окне сумму двух целых чисел, которые пользователь ввёл в поля ввода в окне. Сумма обновляется всякий раз, когда пользователь обновил содержимое поля ввода.

Архитектура GUI-приложений. Model-View-Presenter

  • Достоинства и недостатки подхода 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 приводит к чрезмерному количеству классов.
    • В соответствии с SRP у класса должна быть ровно одна зона ответственности.
    • Принцип единственной ответственности применим только в объектно-ориентированных программах.

Принцип открытости-закрытости (OCP)

  • В чём заключается принцип открытости-закрытости?
  • В чём важность этого принципа в архитектуре ПО?
  • Приведите пример нарушения OCP на диаграмме классов. Какие недостатки имеет архитектура программы? Выполните рефакторинг так, чтобы архитектура следовала этому принципу.
  • Какая практическая польза от следования принципу открытости-закрытости? Обоснуйте свой ответ.
  • Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
  • Как соблюдение и нарушение OCP влияет на легкость поддержки кода? Обоснуйте свой ответ.
  • Как соблюдение и нарушение OCP влияет на легкость тестирования? Обоснуйте свой ответ.
  • Какие паттерны проектирования помогают соблюдать этот принцип?
  • Выразите своё отношение к следующим утверждениям:
    • Следование OCP означает, что не нужно никогда вносить изменения в существующий код.
    • Принцип открытости-закрытости применим только в объектно-ориентированных программах.
    • Следование OCP приводит к излишней сложности кода.
    • OCP имеет смысл применять только в больших программах.

Принцип подстановки Лисков (LSP)

  • В чём заключается принцип подстановки Лисков?
  • Почему этот принцип важен в архитектуре ПО?
  • Приведите примеры нарушения LSP.
  • Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
  • Что такое ковариантность и контрвариантность и как они связаны с этим принципом?
  • Как автоматически протестировать соблюдение LPS?
  • Как обнаружить нарушение этого принципа при ревью кода?
  • Каковы последствия нарушения принципа LSP?

Принцип разделения интерфейса (ISP)

  • В чём заключается Принцип Разделения Интерфейса?
  • Как этот принцип связан с принципом единственной ответственности?
  • Приведите пример нарушения ISP на диаграмме классов. Какой рефакторинг вы бы провели, чтобы соблюсти принцип ISP.
  • Как нарушение ISP влияет на легкость тестирования и поддержки кода? Обоснуйте свой ответ.
  • Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
  • Представьте, что вы проводите ревью кода. Как вы определите, нарушает ли код принцип разделения интерфейса?
  • Как принцип этот принцип связан с принципом инверсии зависимостей?
  • Выразите своё отношение к утверждениям:
    • В соответствии ISP каждый метод должен быть выделен в отдельный интерфейс.
    • ISP может быть применён только в объектно-ориентированных программах.
    • Следование ISP приводит к чрезмерному количеству интерфейсов.
    • ISP имеет смысл применять только в больших проектах.

Принцип инверсии зависимостей (DIP)

  • В чём заключается принцип инверсии зависимостей?
  • В чём важность принципа инверсии зависимостей в архитектуре ПО?
  • Приведите пример нарушения DIP на диаграмме классов. Проведите рефакторинг, чтобы соблюсти этот принцип.
  • Каким образом нужно проектировать программу, чтобы соблюсти этот принцип?
  • Какие паттерны проектирования помогают соблюдать DIP?
  • Каковы последствия от нарушения DIP? Обоснуйте свой ответ.
  • Как следование DIP влияет на легкость тестирования и поддержки кода?
  • Приведите пример использования DIP в реальном приложении.

Компоненты и их сочетаемость

  • В чём отличие связности (Cohesion) и сцепленность (Coupling)?
  • О чём говорит принцип "High Cohesion, Low Coupling"?
  • Что такое устойчивость компонента?
  • Метрики устойчивости компонента. Как вычислить неустойчивость компонента?
  • В чём заключается принцип устойчивых зависимостей (SDP)?
  • Определите устойчивость компонентов и нарушение/соблюдение принципа устойчивых зависимостей по диаграмме классов.
  • Как исправить нарушение SDP?
  • В чём заключается принцип устойчивости абстракций (SAP)?
  • Метрики абстрактности компонента. Как вычислить меру абстрактности компонента?
  • Диаграмма устойчивости/абстрактности компонентов. Отобразить компонент на диаграмме устойчивости/абстрактности.
  • Ключевые зоны диаграммы: зона боли, зона бесполезности, главная последовательность.
  • Как вычислить расстояние до главной последовательности?