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 подскажет развёрнутый ответ в реальном времени.