Hardbest practices

Что такое NVI (Non-Virtual Interface) идиома?

1Постановка

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

2Решение

NVI: public методы класса — non-virtual, они вызывают private/protected virtual методы. Базовый класс контролирует, как и когда вызывается переопределяемый код (before/after hooks, validation, logging).

class Processor {
public:
    void process() {              // non-virtual public
        before();                 // hook — всегда вызывается
        doProcess();              // virtual — переопределяется
        after();
    }
protected:
    virtual void doProcess() = 0;  // реализация в производном
private:
    void before() { validate(); }
    void after()  { log(); }
};
  • Производный не может «забыть» вызвать базовое поведение;
  • Invariant enforcement: проверка пред/пост-условий;
  • Альтернатива — public virtual — даёт производному полный контроль (часто ведёт к ошибкам).

NVI — recommended в Sutter/Meyers, особенно для библиотечного кода. Это template method pattern.

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

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

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