C++ C++  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Шаблоны проектирования на современном C++

Профессиональный тест проверяет, умеет ли разработчик выбирать форму вариативности: виртуальный интерфейс, шаблон, callable, variant или обычную функцию. Задания разбирают Strategy, Observer, Factory и случаи, где классический шаблон превращается в лишнюю иерархию.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов, время — 85 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 30
Когда виртуальный Strategy уместен?
C++C++20
struct CompressionStrategy {
    virtual Bytes compress(std::span<const std::byte>) = 0;
    virtual ~CompressionStrategy() = default;
};
class Archiver {
    std::unique_ptr<CompressionStrategy> strategy_;
};
Вопрос 2 из 30
Что даёт передача стратегии как шаблонного параметра?
C++C++20
template<class Strategy>
class Archiver {
    [[no_unique_address]] Strategy strategy_;
public:
    Bytes run(Data data) { return strategy_(data); }
};
Вопрос 3 из 30
Когда `std::function<Result(Input)>` удобнее базового класса Strategy?
C++C++20
using Strategy = std::function<Result(const Input&)>;

Result execute(const Input& input, const Strategy& strategy) {
    return strategy(input);
}

execute(data, [](const Input& x) { return fast_path(x); });
Вопрос 4 из 30
Какой риск у хранения Strategy* сырым указателем без контракта?
C++C++20
class Processor {
    Strategy* strategy_; // кто владеет и сколько живёт?
public:
    explicit Processor(Strategy* strategy) : strategy_(strategy) {}
};
Вопрос 5 из 30
Что напечатает код?
C++C++20
#include <iostream>
struct AddOne { int operator()(int x) const { return x+1; } };
template<class Strategy> struct Processor {
    Strategy s; int run(int x){ return s(x); }
};
int main(){ std::cout << Processor<AddOne>{}.run(5); }
Вопрос 6 из 30
Главная lifetime-проблема классического списка `Observer*`?
C++C++20
class Subject {
public:
    void subscribe(Observer& observer) { observers_.push_back(&observer); }
    void notify() {
        for (Observer* observer : observers_) observer->update();
    }
private:
    std::vector<Observer*> observers_;
};
Вопрос 7 из 30
Почему нельзя бездумно удалять наблюдателя из vector во время range-for уведомления?
C++C++20
for (Observer* observer : observers_) {
    observer->on_event(event); // callback может вызвать unsubscribe(observer)
}
Вопрос 8 из 30
Что такое reentrancy в Observer?
C++C++20
void Subject::notify(Event e) {
    for (auto& observer : observers_)
        observer(e); // callback может снова вызвать notify
}
Вопрос 9 из 30
Чем pull-модель отличается от push?
C++C++20
// push
observer.on_price_changed(new_price);
// pull
observer.on_changed();
auto price = subject.current_price();
Вопрос 10 из 30
Как weak_ptr помогает в списке наблюдателей?
C++C++20
std::vector<std::weak_ptr<Observer>> observers;
for (auto it = observers.begin(); it != observers.end();) {
    if (auto observer = it->lock()) {
        observer->notify();
        ++it;
    } else {
        it = observers.erase(it);
    }
}
Вопрос 11 из 30
Какой результат естественен для фабрики единственного владельца полиморфного объекта?
C++C++20
struct Shape {
    virtual ~Shape() = default;
    virtual double area() const = 0;
};

std::unique_ptr<Shape> make_shape(const Config& config);
Вопрос 12 из 30
Что должна делать фабрика при неизвестном типе из конфигурации?
C++C++20
std::unique_ptr<Codec> make_codec(std::string_view name) {
    auto it = factories.find(name);
    if (it == factories.end())
        throw UnknownCodec{name, available_names()};
    return it->second();
}
Вопрос 13 из 30
Как registry factory позволяет плагинам добавлять типы?
C++C++20
using Creator = std::function<std::unique_ptr<Base>()>;
std::unordered_map<std::string, Creator> registry;

registry.emplace("json", [] {
    return std::make_unique<JsonCodec>();
});
Вопрос 14 из 30
Когда Abstract Factory оправдана?
C++C++20
struct UiFactory {
    virtual std::unique_ptr<Button> make_button() = 0;
    virtual std::unique_ptr<Menu> make_menu() = 0;
    virtual ~UiFactory() = default;
};
Вопрос 15 из 30
Как compile-time factory может выбирать тип?
C++C++20
template<Backend backend>
auto make_renderer() {
    if constexpr (backend == Backend::vulkan)
        return VulkanRenderer{};
    else
        return SoftwareRenderer{};
}
Вопрос 16 из 30
Когда variant+visit лучше виртуальной иерархии?
C++C++20
using Shape = std::variant<Circle, Rectangle, Polygon>;
for (const Shape& shape : shapes) {
    area += std::visit([](const auto& s) { return s.area(); }, shape);
}
Вопрос 17 из 30
Когда обычная free function лучше Command class?
C++C++20
Result normalize(Document document) {
    remove_empty_nodes(document);
    sort_attributes(document);
    return document;
}
// операция не хранится, не ставится в очередь и не имеет undo
Вопрос 18 из 30
Как policy class отличается от Strategy?
Вопрос 19 из 30
Когда data-oriented таблица переходов лучше State-классов?
Вопрос 20 из 30
Как ranges pipeline может заменить Visitor над простой коллекцией?
Вопрос 21 из 30
Как проверить все Strategy реализации?
Вопрос 22 из 30
Как воспроизвести reentrancy-баг Observer?
Вопрос 23 из 30
Что тестировать у registry factory?
Вопрос 24 из 30
Как mutation testing полезен для шаблонов проектирования?
Вопрос 25 из 30
Как проверить отсутствие цикла владения Observer?
Вопрос 26 из 30
Что сравнивать при выборе virtual vs variant?
Вопрос 27 из 30
Почему `std::function` может аллоцировать?
C++C++20
std::function<int(int)> operation;
operation = [state = std::array<int, 128>{}](int x) {
    return state[x % state.size()];
};
// Захват может не поместиться во внутренний малый буфер std::function.
Вопрос 28 из 30
Когда virtual interface лучше шаблонного API для стабильной библиотеки?
Вопрос 29 из 30
Как слишком мелкая Strategy ухудшает дизайн?
Вопрос 30 из 30
Какой признак говорит, что pattern стоит упростить?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу