Code: Select all
structIm Code werden Bezeichner mithilfe einer Tag-basierten Vorlage implementiert, um Typsicherheit zu erreichen:
Code: Select all
template
class Id {
// some fields
};
struct AxisIdTag {};
struct RunIdTag {};
struct ReportIdTag {};
struct RecordIdTag {};
using AxisId = Id;
using RunId = Id;
using RecordId = Id;
using ReportId = Id;
Code: Select all
enum class ErrorCode {
// some fields
};
struct Error {
ErrorCode code{};
std::string summary;
std::optional details;
std::optional axisId;
std::optional runId;
std::chrono::system_clock::time_point timestamp;
};
Das Ziel des Klassendiagramms besteht nicht darin, die C++-Syntax eins zu eins wiederzugeben, sondern die Entwurfsabsicht zu kommunizieren:
- dass AxisId, RunId usw. eindeutige Domänenkennungen sind,
- dass sie alle auf einer gemeinsamen Id-Abstraktion basieren,
- dass Typsicherheit ein bewusster Teil des Designs ist,
- und dass einige Typen (z. B. Error) als Datenträger/wertähnliche Domänenobjekte gedacht sind.
Frage
Was ist die idiomatische oder allgemein akzeptierte Möglichkeit, Folgendes in einem UML-Klassendiagramm darzustellen?
- Vorlagenbasierte starke ID-Typen wie Id
- Typaliase wie AxisId, RunId usw.
- Einfache Datenstrukturen (), die in erster Linie als unveränderliche oder halb-unveränderliche Datenträger fungieren
Code: Select all
struct
- Soll Id als Vorlagenklasse mit Vorlagenbindungen angezeigt werden?
- Sollten AxisId, RunId usw. als Vorlagenspezialisierungen, Stereotypen (z. B. ) oder weggelassen und über Notizen dokumentiert?
- Sollte struct Error genau wie eine UML-Klasse modelliert oder mit einem Stereotyp wie oder , annotiert werden?
- Gibt es eine bevorzugte Möglichkeit, die Klarheit des Domänenmodells gegen eine Überlastung des Diagramms mit C++-spezifischer Implementierung auszugleichen? Details?
Ich würde mich über Hinweise dazu freuen, ob dieser Ansatz das beabsichtigte Design angemessen kommuniziert und welche Alternativen in UML klarer oder idiomatischer sein könnten.
Mobile version