From 96985d8ed98a91ed45ee14e307b9fe7cd405e51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Stra=C3=9Fer?= Date: Sat, 17 Apr 2021 13:01:35 +0200 Subject: [PATCH] added more pictures to doc --- README.md | 26 ++++++++++++++---- .../out/commands/ValidateAddressCommand.java | 8 +++--- documentation/add-address-commands.png | Bin 0 -> 41814 bytes documentation/valid-address-port.png | Bin 0 -> 11710 bytes 4 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 documentation/add-address-commands.png create mode 100644 documentation/valid-address-port.png diff --git a/README.md b/README.md index 0939848..59d0c61 100644 --- a/README.md +++ b/README.md @@ -174,17 +174,31 @@ With the interface the CustomerDao depends on the Application module. ### Validations -A general rule I like to follow, which is hard to enforce by code is, is that all domain models can only be instanciated in a valid state. For this the AddAddressUsecase is very interesting. Our business requires us to validate our address against a 3rd party system to ensure the correctness of the address. +A general rule I like to follow, is that all domain models can only be instantiated in a valid +state. For this the AddAddressUsecase is very interesting. Our business requires us to validate our +address against a 3rd party system to ensure the correctness of the address. -For this we take the AddAddressCommand and transfrom it into a ValidateAddressCommand. More often than not these models are the same in structure. They should still be two different models though, because they achive different purposes (trigger add-address usecase vs validate-address) and as two different things should also be seperate classes in the code. This may seems unnecessarily complicated, but most of the time our mapping framework (in this case mapstrcut) will do this work for us anyway. +For this we take the AddAddressCommand and transform it into a ValidateAddressCommand. More often +than not these models are the same in structure. They should still be two different models though, +because they achieve different purposes (trigger add-address usecase vs validate-address) and as two +different things should also be separate classes in the code. This may seem unnecessarily +complicated, but most of the time our mapping framework (in this case mapstruct) will do this work +for us anyway. -So once we have that ValidateAddressCommand we pass that into the ValidateAddressPort, which behind some abstraction that we don't know about in our application module does some validation magic. We then get a perfectly valid address model back from this adapter, which we can then use in our UseCase / Domain logic. +![img.png](documentation/add-address-commands.png) + +So once we have that ValidateAddressCommand we pass that into the ValidateAddressPort, which behind +some abstraction that we don't know about in our application module does some validation magic. We +then get a perfectly valid address model back from this adapter, which we can then use in our +UseCase / Domain logic. + +![img.png](documentation/valid-address-port.png) ### Disadvantages of this architecture -This style of implementing a service has alot of overhead. For a simple CRUD application or any -application without much business logic this approach, would certainly be overkill and would result -in alot of tedious mapping without much benefit. +This style of implementing a service has a lot of overhead. For a simple CRUD application or any +application without much business logic this approach would certainly be overkill and would result +in a lot of tedious mapping without much benefit. ### So when should I use this architecture? diff --git a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/commands/ValidateAddressCommand.java b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/commands/ValidateAddressCommand.java index e116865..920ec5e 100644 --- a/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/commands/ValidateAddressCommand.java +++ b/application/src/main/java/de/strasser/peter/hexagonal/application/customer/port/out/commands/ValidateAddressCommand.java @@ -8,8 +8,8 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor(force = true) public class ValidateAddressCommand { - String street; - Integer houseNumber; - Integer zipCode; - String country; + String street; + Integer houseNumber; + Integer zipCode; + String country; } diff --git a/documentation/add-address-commands.png b/documentation/add-address-commands.png new file mode 100644 index 0000000000000000000000000000000000000000..121425bc75e81fea10dd8e8298b6aabb5d358f95 GIT binary patch literal 41814 zcma%iRa9Nw(&d5R?u6j(65QQ_26uPY;4XpS!JXhP2X}(ITj1dC65RXbliT<2?uUNb z3?iQzNfd@d@=*zE|$J@iKBZncOyaV;xg-JyJ!akMBKa|j26a?R}d>P zoM0y|!Ex!5hN^WmN6)nI>?EX!4(n~|H1I+P5@*4YnEmL>7 z9drUNRYs-2YTXLHr?uEqy;HxleU0DxM=i-G9p&DTY{>%#ip2)`4=IcWH`E3T?$Kh^ z>B`u~iuoDuvTFOpfmI@pb(pW!Pw309rD(ER`}K`jud|eDQop%L5H2;-t}BpV=i%RM z;~C5lOj_&(yAh@}ORr7Jue<2(3qRFX4`4V zx2*u4C`91cuTVgOb>7v~Y82(_`O!}V3-Ql#&yHbOi2Hj_pJ1^JZ-pIiV?HoIvsR^K zxuXMweGvV+yJnpgy~H=(0e*+b+=Lv44d3dg$tk=DP^rOcSKTxsm4SIP}sWUWDs^ONUeUR^OQ7hoeO$IgXVh7ICar0rRhOKwRp!uPb zs8j5u6zj8EMLRmcO;(J_!C^YdXSDmH^^1b{GnCMZcYhF?lyWq4seIPPJ)9zj%KoYV z^$){e=p07azZeqjW6G!;mf)d!Is*QE1Jb{LSkVqQCIv4MMEv)&2U+x=PZs|BX^)nt z2?y0901GFUKo=&(8N(Ihm)hu+M=Tk)b@R{P+Q)h4Y36NFw(^#e8eqx#phE`!gakM_ zQ|qgZn+oXYuHhY5!;`yz`$-xR`sV<04Rw`i28b7&2feXJBrxB--zmi~|ERR@mVRmh zuLuYsocDmA@oz1t7G0*6Snw0m|N@gA(T&W z%-*!P2`5!^mDgxW`*ludvMG8mcMtl?x*^V!#Tn!*^XCOPS8M!y|uUaUl4M zAva-KzC=iTpkGjvPPMBR85vxK1r!v?3cCLkD(hFY@7^-dIOwsH{O$9};mN8-KXpys z;x}JAKcPIaIalp0=o`i9&B|ry@U4nPy&PjkeKN81(4o8JjA=W{Xx5�uGuwQl8B1 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 literal 0 HcmV?d00001 diff --git a/documentation/valid-address-port.png b/documentation/valid-address-port.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c6d9ff73a6f4897cff91d7c49ae2f906e6ac2d GIT binary patch literal 11710 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 gHtzpbn(~Fe>H)B$gQ