Mediumnvıdesign

Что такое идиома non-virtual interface (NVI)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

NVI (Non-Virtual Interface) — публичные методы класса невиртуальные, виртуальные — приватные (или protected). Публичный метод вызывает приватный virtual, добавляя pre/post-условия.

class Algorithm {
public:
    void run() {               // невиртуальный — оркестрация
        preCheck();
        doRun();               // виртуальный — конкретная логика
        postCheck();
    }
private:
    virtual void doRun() = 0;  // переопределяют наследники
    void preCheck();
    void postCheck();
};

Преимущества: (1) invariant enforcement — базовый класс гарантирует pre/post-checks всегда выполняются; (2) наследники не могут пропустить проверки; (3) гибкость — можно менять оркестрацию без изменения интерфейса; (4) лучше документация.

Альтернатива — Template Method pattern. STL практически не использует NVI, но в крупных фреймворках распространена.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.