Nein, ADR wird derzeit kaum explizit für Embedded C/C++ unterstützt, da es primär aus der Webentwicklung stammt. Die Struktur lässt sich aber leicht manuell nachbilden, insbesondere in C++ mit Klassen oder in C mit Funktionsgruppen und getrennten Modulen. Unit-Test-Frameworks wie GoogleTest, Ceedling oder Catch2 helfen, die einzelnen Komponenten sauber testbar zu halten.
Hier ist ein einfaches Beispiel zu Punkt 6 – wie man das Action-Domain-Responder (ADR)-Pattern in C++ für ein Embedded-System umsetzen könnte.
Szenario:
Ein Taster wird gedrückt. Wenn der Taster mindestens 2 Sekunden gedrückt bleibt, soll eine LED eingeschaltet werden. Die Software ist in drei Teile aufgeteilt:
- Action: Reagiert auf den Taster-Interrupt.
- Domain: Bewertet die Drückdauer.
- Responder: Steuert die LED.
1. Domain (Geschäftslogik)
// domain/ButtonPressEvaluator.h
#pragma once
enum class ButtonAction {
NONE,
TURN_ON_LED
};
class ButtonPressEvaluator {
public:
ButtonAction evaluatePressDuration(int durationMs) {
if (durationMs >= 2000) {
return ButtonAction::TURN_ON_LED;
}
return ButtonAction::NONE;
}
};
2. Responder (Ausgabe)
// responder/LedController.h
#pragma once
#include <iostream>
class LedController {
public:
void handle(ButtonAction action) {
if (action == ButtonAction::TURN_ON_LED) {
turnOn();
}
}
private:
void turnOn() {
// In echtem Embedded-Code wäre das z. B. GPIO_SetPin(LED_PIN)
std::cout << "LED ON\n";
}
};
3. Action (Eingabeereignis)
// action/ButtonInterruptHandler.h
#pragma once
#include "domain/ButtonPressEvaluator.h"
#include "responder/LedController.h"
class ButtonInterruptHandler {
public:
ButtonInterruptHandler(ButtonPressEvaluator& evaluator, LedController& responder)
: evaluator(evaluator), responder(responder) {}
void onButtonReleased(int pressDurationMs) {
auto result = evaluator.evaluatePressDuration(pressDurationMs);
responder.handle(result);
}
private:
ButtonPressEvaluator& evaluator;
LedController& responder;
};
4. Main/Test (z. B. in Unit Test oder Main Loop)
#include "action/ButtonInterruptHandler.h"
#include "domain/ButtonPressEvaluator.h"
#include "responder/LedController.h"
int main() {
ButtonPressEvaluator evaluator;
LedController responder;
ButtonInterruptHandler handler(evaluator, responder);
handler.onButtonReleased(2500); // Beispiel: 2,5 Sekunden gedrückt → LED ON
handler.onButtonReleased(1000); // Beispiel: 1 Sekunde gedrückt → Keine Aktion
}
Hinweise:
- Unit-Tests wären sehr leicht möglich, da jede Komponente isoliert testbar ist.
- Für Embedded C wäre der Aufbau ähnlich, nur ohne Klassen – man würde mit Funktionszeigern und Modulen arbeiten.
- In einem echten Projekt würde
std::cout
natürlich durch GPIO-Funktionen oder Hardware-Abstraktionen ersetzt.