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.