0 Tage Serie
cpp / expert
Snippet

Non-Virtual Interface (NVI) Pattern zur Kontrolle von Invarianten

Das Non-Virtual Interface (NVI) Idiom trennt die öffentliche API-Schnittstelle von den Anpassungspunkten einer Klasse. Die Basisklasse stellt öffentliche, nicht-virtuelle Methoden bereit, die Vor- und Nachbedingungen sowie Logging-Invarianten erzwingen, während das eigentliche Verhalten an private oder geschützte virtuelle Methoden delegiert wird, die von abgeleiteten Klassen überschrieben werden.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <memory>
class BaseTask {
public:
virtual ~BaseTask() = default;
void execute() {
log_start();
do_execute();
log_finish();
}
private:
void log_start() const {
std::cout << "[NVI] Pre-condition check & logging task start.\n";
}
void log_finish() const {
std::cout << "[NVI] Post-condition verification & task completion.\n";
}
virtual void do_execute() = 0;
};
class DataProcessingTask : public BaseTask {
private:
void do_execute() override {
std::cout << "[Task] Executing core data processing logic.\n";
}
};
int main() {
std::unique_ptr<BaseTask> task = std::make_unique<DataProcessingTask>();
task->execute();
}
Erklärung
1
void execute() { log_start(); do_execute(); log_finish(); }
Öffentliche nicht-virtuelle Methode, die als Einstiegspunkt dient und Invarianten durchsetzt.
2
virtual void do_execute() = 0;
Private rein virtuelle Funktion als Anpassungspunkt für abgeleitete Klassen.
3
task->execute();
Führt das Basisklassen-Skelett aus und leitet den virtuellen Aufruf dynamisch weiter.