From eed5099f013e024dccdd5f09970cd04be8518bb5 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 2 May 2024 14:46:50 +0200 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=93=9D=20ADR=20for=20datamodels=20in?= =?UTF-8?q?=20controller=20and=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/allLayersSeparateModel.drawio.png | Bin 0 -> 15603 bytes .../controllerServiceSharedModel.drawio.png | Bin 0 -> 19731 bytes .../adr002-controller-service-datamodels.md | 67 ++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 docs/src/public/allLayersSeparateModel.drawio.png create mode 100644 docs/src/public/controllerServiceSharedModel.drawio.png create mode 100644 docs/src/technik/adr/adr002-controller-service-datamodels.md diff --git a/docs/src/public/allLayersSeparateModel.drawio.png b/docs/src/public/allLayersSeparateModel.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..611e5da67e88d77c46fbb0f509ee7d8a46d7e6d5 GIT binary patch literal 15603 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 literal 0 HcmV?d00001 diff --git a/docs/src/public/controllerServiceSharedModel.drawio.png b/docs/src/public/controllerServiceSharedModel.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..04ce12123694b01cbed570cc46f7fbac715d6979 GIT binary patch literal 19731 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 literal 0 HcmV?d00001 diff --git a/docs/src/technik/adr/adr002-controller-service-datamodels.md b/docs/src/technik/adr/adr002-controller-service-datamodels.md new file mode 100644 index 000000000..b3ecd7c7f --- /dev/null +++ b/docs/src/technik/adr/adr002-controller-service-datamodels.md @@ -0,0 +1,67 @@ +# Kriterien für shared oder separated Datenmodell zwischen Service und Controller + +## Status + + + +## Kontext + +In den Services haben wir unterschiedliche Varianten was die Kopplung der einzelnen Schichten betrifft. + +Diese Unterscheidung halten wir für vertretbar da nicht alle Services gleich aufgebaut sein müssen. Wichtig ist, dass +nachvollziehbar ist, welche Variante wann zu bevorzugen ist. + +### Shared-Datenmodell bei Broadcast-Service + +Im Broadcast-Service verwenden sowohl Controller als auch Service dasselbe Datenmodell. Der Grund dafür war, dass die +Operationen im Service überschaubar waren und das gleiche Modellmodell wie der Controller erforderte. Um die +Komplexität und den Umfang nicht zu erhöhen, ohne dass ein Mehrwert entsteht, haben wir uns dafür entschieden, dass +dieselben Klassen verwendet werden sollen. + +### Separates Modell beim Briefwahl-Service + +Beim Briefwahl-Service gibt es für Controller und Service jeweils eigene Klassen. + +Das ermöglichte, dass im Service monadische Methoden, Methoden mit einem Argument, verwendet werden konnten. +Im Controller waren es drei Argumente, die aber zu einer semantischen Einheit gehörten. Im Service ist es nur ein Argument. + +## Entscheidung + +Services sollen einheitlich aufgebaut sein. In einem Service sollen die Varianten sich nicht vermischen, um durch +die Einheitlichkeit die Verständlichkeit zu wahren. + +### Separates Datenmodell je Layer + +![separate models](/allLayersSeparateModel.drawio.png) + +Jeder Layer hat sein eigenes Datenmodell. Der Controller mappt bevor er den Service verwendet auf Model, bzw. dessen +Antworten. Der Service macht das Gleiche bei der Kommunikation mit dem Repository. + +Dieses Vorgehen ist in der Regel zu wählen, sobald im Controller Pathvariablen oder Requestparameter im Kombination mit +einem Requestbody auftreten. + +In diesen Fällen werden für die gleiche Semantik jeweils unterschiedliche Datenmodell verwendet: Mehere Argumente vs. +ein Argument. + +### Gemeinsames Datenmodell für Controller und Service + +![shared model](/controllerServiceSharedModel.drawio.png) + +Controller und Service verwenden dasselbe Datenmodell. Das Repository hat sein eigenes Datenmodell. Der Service +verwendet einen Mapper. + +Kann verwendet werden, wenn Controller und Service das gleiche Datenmodell verwenden. Kein Umorganisieren der Parameter +notwendig + +## Konsequenzen + +### negativ + +- zusätzliche Klassen die teilweise identisch sind +- zusätzliches Mapping + +### positiv + +- konsequente Entkopplung der jeweiligen Schichten (Änderung am Service führt nicht zwangsläufig zu einer Änderung der Rest-API) +- bessere innere kohäsion der Schichten +- bessere Lesbarkeit von Code durch weniger Argumente in Methoden \ No newline at end of file From 5ae58464aa4fd95d92d1cb30d5255ec0cc74ef34 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 2 May 2024 14:47:16 +0200 Subject: [PATCH 2/6] add new adr to sidebar --- docs/.vitepress/config.mts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index cf6c365e6..e320a47a8 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -27,7 +27,8 @@ export default withMermaid({ }, { text: 'Entwicklungsumgebung', link: `${PATH_TECHNIK}development/` }, { text: 'Adr', link: `${PATH_TECHNIK}adr/`, collapsed: true, items: [ - { text: 'Renovate - ignoriere lombok', link: `${PATH_TECHNIK}adr/adr001-renovate-ignore-lombok` } + { text: 'Renovate - ignoriere lombok', link: `${PATH_TECHNIK}adr/adr001-renovate-ignore-lombok` }, + { text: 'Shared/Separated Datenmodell', link: `${PATH_TECHNIK}adr/adr002-controller-service-datamodels` } ] } ], [PATH_FEATURES]: [ From 274af33381800718f9033fae2a2b0ccf5be3a965 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 2 May 2024 15:51:25 +0200 Subject: [PATCH 3/6] reformat new link --- docs/.vitepress/config.mts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index e46399bfc..c0386361a 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -29,7 +29,10 @@ export default withMermaid({ { text: 'Adr', link: `${PATH_TECHNIK}adr/`, collapsed: true, items: [ {text: 'Renovate - ignoriere lombok', link: `${PATH_TECHNIK}adr/adr001-renovate-ignore-lombok`}, - {text: 'Shared/Separated Datenmodell', link: `${PATH_TECHNIK}adr/adr002-controller-service-datamodels`} + { + text: 'Shared/Separated Datenmodell', + link: `${PATH_TECHNIK}adr/adr002-controller-service-datamodels` + } ] } ], From ef37703241cfbcddbdd0e64b9a23f89f3f808101 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 8 May 2024 08:48:34 +0200 Subject: [PATCH 4/6] Apply suggestions from code review Co-authored-by: Robert Jasny --- .../adr002-controller-service-datamodels.md | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/docs/src/technik/adr/adr002-controller-service-datamodels.md b/docs/src/technik/adr/adr002-controller-service-datamodels.md index b3ecd7c7f..1b8d0b4ad 100644 --- a/docs/src/technik/adr/adr002-controller-service-datamodels.md +++ b/docs/src/technik/adr/adr002-controller-service-datamodels.md @@ -14,41 +14,38 @@ nachvollziehbar ist, welche Variante wann zu bevorzugen ist. ### Shared-Datenmodell bei Broadcast-Service Im Broadcast-Service verwenden sowohl Controller als auch Service dasselbe Datenmodell. Der Grund dafür war, dass die -Operationen im Service überschaubar waren und das gleiche Modellmodell wie der Controller erforderte. Um die -Komplexität und den Umfang nicht zu erhöhen, ohne dass ein Mehrwert entsteht, haben wir uns dafür entschieden, dass -dieselben Klassen verwendet werden sollen. +Operationen im Service überschaubar sind und das gleiche Modell wie der Controller erfordern. Um die +Komplexität und den Code-Umfang nicht ohne Mehrwert zu erhöhen, haben wir uns für die Verwendung der gleichen Klassen in Controller und Service entschieden. -### Separates Modell beim Briefwahl-Service +### Separated-Datenmodell beim Briefwahl-Service Beim Briefwahl-Service gibt es für Controller und Service jeweils eigene Klassen. -Das ermöglichte, dass im Service monadische Methoden, Methoden mit einem Argument, verwendet werden konnten. +Dadurch wird ermöglicht, dass im Service Methoden mit nur einem Argument verwendet werden können. Im Controller waren es drei Argumente, die aber zu einer semantischen Einheit gehörten. Im Service ist es nur ein Argument. ## Entscheidung -Services sollen einheitlich aufgebaut sein. In einem Service sollen die Varianten sich nicht vermischen, um durch -die Einheitlichkeit die Verständlichkeit zu wahren. +Grundsätzlich sind mit dem Shared- und Separated-Datenmodell zwei Varianten zur Kopplung von Controller und Service möglich. Die Kriterien dazu sind oben beispielhaft beschrieben. -### Separates Datenmodell je Layer +Services sollen aber einheitlich aufgebaut sein. Um die Verständlichkeit zu wahren dürfen sich die beiden Varianten innerhalb eines Service nicht vermischen. + +### Separated-Datenmodell je Layer ![separate models](/allLayersSeparateModel.drawio.png) -Jeder Layer hat sein eigenes Datenmodell. Der Controller mappt bevor er den Service verwendet auf Model, bzw. dessen -Antworten. Der Service macht das Gleiche bei der Kommunikation mit dem Repository. +Jeder Layer hat sein eigenes Datenmodell. Der Controller mappt die DTO-Klassen vor Verwendung des Service auf die Model-Klassen. Der Service mappt die Model-Klassen auf die Entity-Klassen des Repository. Dieses Vorgehen ist in der Regel zu wählen, sobald im Controller Pathvariablen oder Requestparameter im Kombination mit einem Requestbody auftreten. -In diesen Fällen werden für die gleiche Semantik jeweils unterschiedliche Datenmodell verwendet: Mehere Argumente vs. -ein Argument. +In diesen Fällen werden für die gleiche Semantik jeweils unterschiedliche Datenmodelle verwendet: Mehrere Argumente vs. ein Argument. -### Gemeinsames Datenmodell für Controller und Service +### Shared-Datenmodell für Controller und Service ![shared model](/controllerServiceSharedModel.drawio.png) -Controller und Service verwenden dasselbe Datenmodell. Das Repository hat sein eigenes Datenmodell. Der Service -verwendet einen Mapper. +Controller und Service verwenden die gleichen DTO-Klassen, ergo dasselbe Datenmodell. Es erfolgt hier kein Mapping. Der Service mappt dann die Model-Klassen auf die Entity-Klassen des Repository. Kann verwendet werden, wenn Controller und Service das gleiche Datenmodell verwenden. Kein Umorganisieren der Parameter notwendig @@ -57,11 +54,12 @@ notwendig ### negativ -- zusätzliche Klassen die teilweise identisch sind -- zusätzliches Mapping +- zusätzliche Klassen beim Shared-Datenmodell die teilweise identisch sind +- zusätzliches Mapping beim Shared-Datenmodell ### positiv -- konsequente Entkopplung der jeweiligen Schichten (Änderung am Service führt nicht zwangsläufig zu einer Änderung der Rest-API) -- bessere innere kohäsion der Schichten -- bessere Lesbarkeit von Code durch weniger Argumente in Methoden \ No newline at end of file +- Möglichkeit der Auswahl zwischen den beiden Modellen und dadurch Reduktion der Komplexität beim Shared-Datenmodell +- konsequente Entkopplung der jeweiligen Schichten (Änderung am Service führt nicht zwangsläufig zu einer Änderung der Rest-API) beim Shared-Datenmodell +- bessere innere Kohäsion der Schichten +- bessere Lesbarkeit von Code durch weniger Argumente in Methoden beim Shared-Datenmodell \ No newline at end of file From 914665841d30ae0a175bd7f999331453586cc7d9 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 8 May 2024 08:51:09 +0200 Subject: [PATCH 5/6] fix duplicated whitespace --- docs/src/technik/adr/adr002-controller-service-datamodels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/technik/adr/adr002-controller-service-datamodels.md b/docs/src/technik/adr/adr002-controller-service-datamodels.md index 1b8d0b4ad..cc360e8ac 100644 --- a/docs/src/technik/adr/adr002-controller-service-datamodels.md +++ b/docs/src/technik/adr/adr002-controller-service-datamodels.md @@ -28,7 +28,7 @@ Im Controller waren es drei Argumente, die aber zu einer semantischen Einheit ge Grundsätzlich sind mit dem Shared- und Separated-Datenmodell zwei Varianten zur Kopplung von Controller und Service möglich. Die Kriterien dazu sind oben beispielhaft beschrieben. -Services sollen aber einheitlich aufgebaut sein. Um die Verständlichkeit zu wahren dürfen sich die beiden Varianten innerhalb eines Service nicht vermischen. +Services sollen aber einheitlich aufgebaut sein. Um die Verständlichkeit zu wahren dürfen sich die beiden Varianten innerhalb eines Service nicht vermischen. ### Separated-Datenmodell je Layer From e4840f0f34de513d3faf163fd20650506c43c249 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 8 May 2024 09:08:54 +0200 Subject: [PATCH 6/6] change order on sidebar --- docs/.vitepress/config.mts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index a0e9b8d37..00ee5590e 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -33,14 +33,14 @@ export default withMermaid({ { text: 'Adr', link: `${PATH_TECHNIK}adr/`, collapsed: true, items: [ {text: 'Renovate - ignoriere lombok', link: `${PATH_TECHNIK}adr/adr001-renovate-ignore-lombok`}, - { - text: 'Shared/Separated Datenmodell', - link: `${PATH_TECHNIK}adr/adr002-controller-service-datamodels` - }, { text: 'Verbesserung Einstiegsfreundlichkeit', link: `${PATH_TECHNIK}adr/adr-improve-getting-started-of-services` }, + { + text: 'Shared/Separated Datenmodell', + link: `${PATH_TECHNIK}adr/adr002-controller-service-datamodels` + }, ] } ],