From 04136df717bb7ccd33adee7f18d96c40e1f7d873 Mon Sep 17 00:00:00 2001 From: MPostol Date: Thu, 20 Jun 2024 09:42:12 +0200 Subject: [PATCH] ExDM Add documentation to the selected parts of the code #369 - working on the MVVM in the README.MVVM.md document --- .../.Media/MVVMLayeredArchitecture.png | Bin 0 -> 20795 bytes .../MVVMLayeredArchitectureProjectBased.png | Bin 0 -> 27908 bytes ExDataManagement/GraphicalData/README.MVVM.md | 28 ++++++++++++++---- 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 ExDataManagement/GraphicalData/.Media/MVVMLayeredArchitecture.png create mode 100644 ExDataManagement/GraphicalData/.Media/MVVMLayeredArchitectureProjectBased.png diff --git a/ExDataManagement/GraphicalData/.Media/MVVMLayeredArchitecture.png b/ExDataManagement/GraphicalData/.Media/MVVMLayeredArchitecture.png new file mode 100644 index 0000000000000000000000000000000000000000..fe63424f51f1a6e8c2737528f892ab7abaf8c6a8 GIT binary patch literal 20795 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 LNkvXXu0mjfSz@X# literal 0 HcmV?d00001 diff --git a/ExDataManagement/GraphicalData/.Media/MVVMLayeredArchitectureProjectBased.png b/ExDataManagement/GraphicalData/.Media/MVVMLayeredArchitectureProjectBased.png new file mode 100644 index 0000000000000000000000000000000000000000..eab5bfcbd75307e07164108d8e73badd228b5d1e GIT binary patch literal 27908 zcma&O1yqz#+cpX+ARwTmfQqCvNH>afcX#&)L#IkfOLqv8Lw6%0Al(ez-Q98ayzl@0 zXPsK>xRxR_&+NUQ{p`E0>$)dcQC5()N60+V?RPf5}OObcr z2l{78EhrKa_Fu$bV9et9B|y36PD zk$<wddn3KA(!~ zA=@R0C7Q{E+CP6QV@Kv1!F2iITh1#g#U7)(7S_ElwXNQtKc#d3crNnvs1CNZB|e!| zaJ-iw_9*AotVc_(oU|ObGdEcL_v5?|+#kNkwy&vnkG*zN^^eG){1^>h4`Jx4>#m`+ z(5f=Z2>bQ+D{dw%v})%PMaA_KnAy#=@6tKEpz%=h#|QMpdei2D#rbC%PYNcK-hTRgD|TI>#IUY|~S-gG@! zs)U|tpCHMldrAW-4dqv56s%ZVwfL~7c1k7i)T12|^jQDr%fd?^JJ$FKZlR5T6q>t< zYQelw2}Slj>Pr%_PZ)LUegt3=#Y@dlN<^5h{);jjsR0)#P0-(d2YUfl^PVkB6uCgI&G0?hunFvJx|HQe!R%RFrRO7-<_?ml%0OV@4~n@UCj_v69C>-`SGFPTX1CLJ9_#; z*=cz>Ii?tw0C_nDjX#8Pj}4D!&AjTJWXfmCIJiy5-<6KA4Mk$1{dsx0KRdE-9xO{b znt=Z4la#Df&J}dD-fJhKpi%Xw8_!Io{rS$NN5gS{MRC(zJBEsD!7R^=7SyQ?t&Vr9 z(z0E@bKsg2euvV`Ewchq7PzKT^ynKqb;>czG$@(5ZH8?=wCXo|EJ#>A@-tO z4u`T&!fn({Hp)*Pg5MU<9=FW9;>9H0-H5N>mKXGu6pUMM4O9GZc-;8;NZhHuxiuoK zwI{$vY3$hHU7ftM?rYm%I^!i>{y1toKc}z9;hQ|?fdP-pb|&3R<{Lh#X-M49I%f7= zGynCCdLq3n+%Z2L(rVEp+lzXSWLh|`Tj!E8-Wd5JR~Y za#CS$WbCOd)}BF<*|vSGrm{4N-~3JbPVEYk<>rB39*mM+22&&j1y^$v&xS!Jb=UTC z^XlFSvp}MhyOl}>+B$Z#Yz%3?fCz=B#0Y9+8Ot<#o3L?SOnIy_R(s7l)YRrcX2fqV z2V2GXYV8!61oYC7G;3L8g|}T8n7=l(&(meU!8}@^`8r~<+j!7IDIm}!JMFWTlW=%) z!f^Xr+0@FuvvaU(bZ7zXOL5TP;ci$)aErw)yecjr8tm7iDMUqo4&O{NG@hZ>_>9tM zDeC?8jXAS^2BfN7PSI|n-zTkP#avij#X-1ax*MucC04+Z4Vmc_!;VFD!9aFWiEAxl zn&uTzb;6|;?EKT-&g*mQmQnZYE`Z6<9)$Pa($DjZgXk8MKhn$S~zqv!Zzkr z;pWYIswjYgkAbpKJlPhKCNU)l!FaI!gMAt%Y1;(QOqbJe$X}+Lq86xX>s*@a&8}Z#+-8ES6cn^X~mhfg+W) z+(3}Ho$?xHT&I zc_bdO5^khGv3hUsW4=e9`I*y$7nqsiTuzv8NS^ zsqn+X3-lkUm7~;6+byf9c=C2#pTg!MbQ{hr$wtJ&Yi(Eeg=Q?XQhT_?Ew{th#?9DM0^}2?KRmOj;~{y9gjQi zU+1sye~U@858>kFOp959C$T|z(FSw}oFje`xPkDzu=w_lCa7bpjBZd3?_@{ z8TmF}{0&1ddA`=p1Zkf-x6FJnSoeaUMpP(89cCt(VBW-8#LrpSU~E)E#U$t_6ZPKf zeuKtmCYAq%zzu|vQbjJoA;V#Fm%wjt|I(a-9J$4Rp-#>(Z-Lvb?;VR!H%!5qhM7EA zoKl$9@loTWMAl!VgXh-3(D0;llJ4Ef_-)7?(7VN~B~*3UvZ&s;JHyY#q#mj(SXL?Wph3#hI%X@BT|^Z-9DqONd!-6fez9-Jj|BKe^n# zF)_3H_{o<{eb6foj^<1^0sS#rR?=U0xY2dpWfQeh{~1`d%4ejsWYkqYi>cFu$+J7t zbj#QNu|%*s^KY+FE7e#f0Ry zTkq30%uV&->ZhkBce`-+a>z~4_9rd94Ubd3yTWQzpZT%kb^B9I91G8HJE~}li&Ni4 z^0uBil-DjT-nw47_ppzZtpD^?(A3ga9E8VQ#YmjEro&ykbML_61c&?7cKEmDg7wYj z_5RkjXl7|%+e$M01ZDBCos>-NEeyV_q(5gn@ZNlhfSvI|a_Jmm;v{RInWk3RlK0-bNFWyw5QZYlaP1Fr zZ!1+6k`k^<1JB$(XyaOGyzwIIfJV7vD*Ym3@6&^e+@T}Xd|gI?Kog!TRcw7~HgDJ^z;MU6lw`#|6sV)H!9jeIrBp-O?ycAXaxf#Qd?J9y0}uZs&V3X}ciWkVV8 zOvPOw!P>>$&ic--L~P^M*cr`#5@fjX2wzC`H9tunD;a>V1TAf-1q`$yhwV=#XY^Wa zzq`G*1GliaZmLi$(3V$RO<*s7PDPbhalK%2TjoI&HSA!yzhI%bVcx{uz|BQ3LnAyF z6W18A?H8(H&SKs(yT&s;b$Ah$P_S#+wZI>F*mfItU6Z}MOm@vDR_+K_;zL0*%&z!l z&`6Vd=Um*ja$RNT?^n!eT^(pJf&Wln3zCukywVq%qnOp&?XB;a5APLVbxtc>&NixR z*&ElxO)X?U`yXF<+_HKX_{&5M>o&d)EzKjfBblHtgCK$Ug$V7MqNXJ#j;Ja#Ct(;Q zD@(S6=Mb9ZrR7A}AW@0fk}aftaezFGbS&=3uQ5weKpw9$t4bo zceVmETnUPp`lX}>`^H_mXq=IGe9s80VeUipLy?dKNUyUjA~=*)({Kv<*#!*}77UVw z@0H?2&p%jEXFSwv`5K5wlVmXJ4?GeKPaMj@Pndgw)4 zD8CDRBiArhF;=#=B@ZUTk$9ZW9ZTNQrHK4oEIzoW;1v8smT7Ur&yep@QJw4FoLoOp zsiHNKug;09qO4V`kdXRDH_xMGYwA3F2kAL6lzYK4hJ4;${yMeDS3&n50o9t*p35tC z!VTu_RpcfU(HmkR_*=M%C6V0UB>+$R*(6Ep*EkDHzD$X-#Pd$k21u|UP-s< z1=g4FI215_&a{ix_xgmtX+^)A#EDT|aXiypkMOAZ8x&;fe8kfnjRD*C9Heja_5+~CS&oe}LB$$os?xPJ99_&dDWv`0D-7s@dat)$z54J;7y`;8#k^!Rd6$W6D)&n1 zoRgFa#*)grP2LiTuBE+o*$YA}N4aY2YHidi9Mr|>JtEE^D$R1WsIOfz4soe z;GDSV3OE*BRB#tqTY|4oc*#0MZG3) z6jF2YH32RdOU%oFt61mpm(?n#2z}a1$o{=|u@8pY(@#{2xMs$yl5;*#EK)A7%^LfT zZCn#OwfIZ-`Yj2Xh97H}=M(B)>^?7>XE^95 zXyx>iNaU8#%#^gWSEn~?c`z_A!n%2r9U8uWHIbLIzG1!Sk3xyakK-mn)1kKz3?eGo zNEh!bSr#-iWl7zWITs)j(=vEREf|A!)9zN{%5QyBH(F)y?EOQjHaSQL{W_8fO=ir; zW%0n!rvFM-M_#zUnT}}TC z4LR;U-r&iAG%~`@<9$Wr`R7mY_b~IBs7ld}j>?sk+Nb$PpT8Qo z>slOjdWY=~lVC!r6`U;#abnYVM&(;Qj*RjW$T~yxB$95O6oC7Ca^(pHKFZpoVM%8^ z4kRep7H6*g>39uaO2MWcHQIc)kJ~TD)Cf&8pcb|I@j*)9n2SuHzxglztGy!P@k-~Y zi)wl%NTkOj;Zk~2(?a)^6yYSu;x+JSGJ789H4Oz>W2euuj8`yu8*K4of21eWYf%fi z)v$o{0VFFU-nXx^rRLVUXNz#NJ*rUO(sQMUqrF+JB`w7-Z!Rf!>Fol5A6T z^x?cdOC&G2P4d@P1@QN+Sp&*L^*7j4j5(nS{VabBduM>okGuU`o%=f$&_xqKs zZ=W*(&vFClJb;`YAMRWW*0(UCRpB6NAUf*s+KoFqRyT(#wK%u!%BIqog8D(>#z=M} zOIjf{T}y&ZiCpn)Up@7GdY>Ordrp7lJgPDNboPLQZR8|c`<6FvTzd>&?A1G<(39kf zpO7drnM3M?f&I41{cQqdt}QPFGnlRbfQCQ+!9)MiQ!X23XQh|s4TmfufxM4rraO1) z50BOv%{`vbrB$5ILP=>SR<@a8{~rZ<6y|d-o|zpXQBIVwC#Ec7%(9V$Us2R^?Zo>qZ zyb|-`V!>^rtv=YI?2{!%|;DZ-A3{1t%;&HAe+~) z?;xzx<|y5@QU``%l5VN9Sk7{OkXbs(nVT;=b~Pq1-gEBkvzc(|P8!~x3M*0#T2xLS(|NXW%oDNvmQmVCk21gGqwXAgW@)42qx`G+K6#y}JvEwzA8*d8lC)?N)c;EP7eMvxb8d2CF zUIw{wp~AhzVT<597DquoY~TO~FRX(6imTh2va3B6qLb63U_PVrlsAMVl{=U2%x2+U zAYv!Jaqq!3C7q}y&aTY02w)Y@o&WpE;qzz1<-fsej>Xg|*o&4H?Oi5_Tz@r9N#Sr? zC2h)UlOt$A-yAYYP0v56+?$61p0d?KU5yV*b+j@q{wo2zk7?F#F6$c0&S2c`OQT}C z4GyHPL}=+da}gFE)kY6nGF4m^VxQzSAah2dmNKBEOuW5g`@=l<8=!G9ufHK`V%=A^ zN-$2Z3QN6mpN|Rg2O7JXpH>8&+&O(#;S3=vZ}=6 zQyJTjrl8VYg!`HlZZ>^#Cn+>3}=Vwrh{Ak0t*3l7zW^&5Od?drA&l>j1V7N%zwr?aJNL&CRFf`j5sa!w6Y0#j)c{iF#f%eo3Pf~)%(`Y+39WQagdDjYs$6Y3q-B*P~$ZapLt;>GE zQgHF+ri0%ZCDvd%t(oAyBRKB3syZl%?6N1(Uq-k%MJUu^?J#yQC0M3Efre) zXFd>SVFlv;%z^&T6_rcv@4c@+%Px3znZvcEr3Ou>Sso7WQWQ*#N=)4>Wdeh0#>nyz zY2%r^@+jLIKE(>)U-m3YiQHthJy2z8UoZPY<6p|9&O2T{d)VcbZ*`F?t5kmv{Eb>N zaHj(ND@5ikr>0-w*W0B`RT!sT0BEA4^n4GJ7$llOJ#~7xJJd42<=1a;W-*_|BE{Rz zcKMUfoqFbpiHcWxTpT?bqzn0EQObJTPNsRe|8mz(_1P}|pAU~an8vNKKxY1adH_%< zTjTUkb!-?w;y-0<=)r3tgtwXNe?gM}u)499`_Kqcg^>Ul(nKO6Di2|hYwLY83KxHL z3rsEH>(Bbxo!yQ+@Y{uMzZM%bYyH~zs45F62Ue9_*|yny6`}xk@1@2{?ziN;I;v`VQGIX9>A#VJzBuhsxUa#)}R5;6h zaXL8T3qd(3;)9m~pzd2~w(uDJCGUJ^GT>vMaKQ7&mG^w*+Pn87vu>pEe;`OW0;~r3 z#(-{1_iBCbl*6vT=(8s}IUkEBKC{pTj3!WC*~}Ob+D+@)>Ceff;V_uaMr(x}?bMTYT^=K}kNuiu%SXh$brx?1IyQR&GRgw&FFGbpFt zJ*v=pAw&iNEIDCJjAPGuZORr9SkAc}a#W+rtpjg2)as2l`)UukY(*I7UmB|Nn^mzE zt(v&U7R;n}CVTTSvSh&X=b(V>Bs?P7JOLev$7?^Nt?RiDW%3$7_Krks1TifmFZ9S` zVo$L9wEWIWeUOOXh5%&fo1VdadgW@VtC6 z{mosgRl6&aZ189W=fP&=2QPH}IX?d1@qEo~Z0|{*pRj|E{cVr>u=O5~AVIN6FzU_3UY);VV>}p7X&%7@0ZKF(I6pwG zQ3L@vHK#$U3_%*IEXCCKnmo`Urn}_^W$AxrG>UDk1WcfzGA?aBA%q_XF;jVh2|R+C z{EXgK&Hl%S;9O_x)k}?z`2hqUiuB=UXm|y;X30N52#%HNnFPcIxKFgw-;N^2-8{2= zVY$tmm@10;A>oII*26nWX|P`Ux>tC13N<)fdctqO9V0`8=SIi$5F79YS^F;W<6~h+ zL+#U|p(`msS|VZHHW7Sk;PCwXDZp0;Oqrkf#tV7CV~Y;&d}WyYt8#n>O{Ds!42orx z77v(|U?Oqe&Wco3CJ^h#2fBo{QG-9~W(7AvO@d%SsxNU`PNz}FmthW{)^u1ypGfm^ z9G<8%rrfis9TUQ%hY?#F$vH=)2bOD_$gcnG*DHMOVo~J4C&K({p6kc`x30AKpA8r& zYPMA-irshD~cu{T3sfh&vZk=xSTb>bl=&IM0eiK`!u`*H$g4Q1|Av3 zq|0iN%UWyK<;5k+fI%pmvn%34+)6dAk>7(U02h=c8UFMwTSPLG%Ad7<3T?v*@@xK| ztEa|AiBsvExX{0V=QPpVx|Bs=}>=BRuDW$0>;7-9xpCTAsurAu_-~Xcp07NQ+Sp7fW z1TTDx5qTOj^SV;U^WB|%%gl|(S)4KAB@ncp8aXZnFX>9PL?4`QbB*T!gZcBzbX)HK zHp2f5*{y^tlBoMb<@vZBjI=@TI0mejS|<^4H88IK?}dY5m!m%4?jL!f$3*ur`Ll8& zR!&p<*7)m$qM7{%dMGBjtn~k;g8yf_|K1+BgI9<>tcT5F%`;y~0X{gUXZF8)^lvN$ zY{37Uh5v7phXI0_#-fPL)u6Pc;#lsfk@EkKhxY%m)BkU~3zqWTv7FjEbfUi}95n*# zSZ!M0#V+Ywd^_B0BMc@uV5qkLdYHdzZ*E$q!=79;DF)o067wsjS64UJ3q>vE+B+5- z5=@QS94_`nNRrC$99UNLTc8mOf+hX)e@rD#vG?jPp`tlrMoQh^&h7VlFOY$)Q_teLPOan7OjJxLxdZ-^}5QJpJ&9np~9EW_LC*C5roG&K_2kQ{p}MXs|lp^kW&cOtuls7%tlk z{#66N{>h3K3m&jroXm{%r1XD|@}E81mnJ!s#I1dv)r2q~T32dxH>zNrr$!ivXDypm z_cfBr0i2_cU?zVl{C9^@RKQ*e{$ugM%T&%X;G=(30sbSBD691Nt<*B1NMZ=WqGRZ! zk*K7=iBkEGMJNZLh(!Mdhm`t1hg41R?SJ1ytiebbh5Ek(js0h!)bcNq(RBgOb7_E| z|FilGMHKN#H+;mTZd9vSVTc7D(IRZ}Nb(=?ODV91WhF!yT8{d`UZ8{cY$OI^p2)CW zB&q-Y8lVninm`94fFb?x5NeRPB;Q>0=Ia3I39VAvzW{$su+PQ_oy!|`Y%Y2LARan7 zQ&44!NBM>k&?#PqyPranFn48Sdxm(;zs{XwkIi8Vi>A)e?~@$AhD0&;P8hd^KHcY0kKNGp_uA)0!SKIVOUt|mtFs|vG#q&!(LXSp#_DHh_ zZ@FmFJ+{1(aJ_+3BXjJ!Ba-ZiR0WR)!hsO*{NUTD{bFjzJzs8&<4lqa6A5D54Ru$ZUqXpI_d1Y~cKKET&*}7q$P)ZIL zaV^r~pK97zgb?HT8?~}%B*-)L9O&p5$Hw_+xf>9X4C?h15JOTEfx2J~WF#sV?WO<_ z8RE)Uuh%LX}mWRx?V`=8Hf1fa+AabvM2*A@S#@Mjv|NfU5aMwkQ8`N;o|d(CI1l%9$p6CSuc zTIu~|=j!U}bF){=W`)QCp06p0$NJNX&9tUV_SDqBN`9~po_RTw_u65nb$P@fF1ocG@FOll@I$WZj&N@YtoX)0Gtc36reM!b-rVn91l9~sl-D7qDgoc6g)ZLOgg zRCSr8XT-dYrUm+tmCkTcF|j!7l&Rg~;_uogz(2?VO^O47lr{>_v=Bhh|4XF`ek;|REvImfxMV8*F}6fKdZc3@H|j3 z{_6-3L~K9KZt9^>lpd-3SbK2XSV%-1nkqTNKXodC)73b3GFj_xjy^K z+5BuCVs0J?=xxBOS3NylNmFVrn9j4!6@9Q#KM)fCB+Rl;lT+q2L$2bQr@HFhY|(Ox zuM?TNRv$_994|xF99|4qZ_mNgT$LE4?PuPNeI+p|-#9(x6&K)`U=#iLxXsQFQbN4W zH`DEqK!E`E^2wJ|Sx!K+m|4QjMMXQywiXN6w%oNU0bpRwu}43g&t=ZqRUV(b|ec0xuMw$(*ih z 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 G@V@}2!AIW! literal 0 HcmV?d00001 diff --git a/ExDataManagement/GraphicalData/README.MVVM.md b/ExDataManagement/GraphicalData/README.MVVM.md index d800f5c..9216612 100644 --- a/ExDataManagement/GraphicalData/README.MVVM.md +++ b/ExDataManagement/GraphicalData/README.MVVM.md @@ -179,12 +179,32 @@ The next topic is a layered model called MVVM. It stands for model, view, view-m In other words, we will talk about the program architecture keeping in mind that the program is only a sequence of characters. Here, unfortunately, I often encounter the practice of disregarding the principles of layered program structure, because it complicates, and limits, and it is easier and possible to live without it, etc. Let us note that we have three significantly different worlds here. The first is the model mentioned in the topic, i.e. MVVM. We don't see any signs of his presence yet, but he appeared in the context of engineering a graphical user interface. The second one is a typical program architecture, which also distinguishes three layers, but this time called presentation, logic, and data. The third world lacks of layers. If these worlds exist there are probably some reasons behind each of them, even trivial ones, such as lack of knowledge. To rule out a lack of knowledge, let's take a closer look at this topic. -Let's start with the fact that our sample program has three projects. The first one with the View suffix is ​​based on Framework 4.61, so it is dedicated to a specific implementation of the .NET library. This limits the portability on other hardware and system platforms, but there is no option because WPF is a technology dedicated to Windows. The remaining projects are based on .NET Standard. .NET Standard is an abstract definition of the .NET library, i.e. it does not contain any implementation, only abstract definitions. Thanks to this, projects based on the .NET standard are portable and once the library is compiled, it can be implemented on any system platform for which there is a .NET implementation. Without going into details, we can illustrate the relationship between these projects as follows. There is a legend for those curious about what the individual arrows mean. Now, for the sake of simplicity, we are only interested in the direction of these arrows. - ### 6.2. Layer Implementation using project concept +Let's start with the fact that our sample program has three projects. The first one with the View suffix is ​​based on Framework 4.61, so it is dedicated to a specific implementation of the .NET library. This limits the portability on other hardware and system platforms, but there is no option because WPF is a technology dedicated to Windows. The remaining projects are based on .NET Standard. .NET Standard is an abstract definition of the .NET library, i.e. it does not contain any implementation, only abstract definitions. Thanks to this, projects based on the .NET standard are portable and once the library is compiled, it can be implemented on any system platform for which there is a .NET implementation. Without going into details, we can illustrate the relationship between these projects as follows. There is a legend for those curious about what the individual arrows mean. Now, for the sake of simplicity, we are only interested in the direction of these arrows. + ### 6.3. MVVM as Sub-layers of the Presentation Layer +The MVVM is a design pattern commonly used in Windows Presentation Foundation to structure the code and separate concerns. Hence, we have the word presentation in the name, in the context of the general architecture, we can assume that the layers of the MVVM model contribute to the presentation layer of a general architectural model. Based on this detailed analysis, let's try to answer a more general question: what is a layer, and how to implement it? + +Before examining the gathered examples, first I must remind you that the algorithm development is far beyond the scope of our discursion. Second, to make the discursion practical we must apply the layered pattern to the program text but not to the thinking process. The main goal is to apply the layered pattern rules directly to the program text as a result of the implementation of the algorithm derived from a research process. To promote a practical approach, I propose investigating this issue in the context of the semantics and syntax of a selected programming language. Although we are using a concrete development environment, the main hope is that the proposed approach is easily portable. All the examples in concern have been added to the `Graphical Data` folder. Check out the solution `ExDataManagement`solution to follow me in this respect. + +We already proved that theoretically a layered program design pattern is very beneficial. Simplifying, by design, layered program design pattern applies to the program as one whole - keeping in mind - that the program is just a text. A program is just a text compliant with a selected programming language. Hence the pattern including the layers and layers relationship must be expressed using terminology defined by the language itself. Further discussion may depend on the selection of a concrete programming language. Therefore, according to the rules the further discussion is conducted using CSharp as the programming language and Visual Studio as the development environment. + +Languages offering object-oriented programming usually use the custom types definitions as building blocks that take responsibility to implement the algorithm/data in concern. It is also the case for the CSharp programming language. Additionally the layered architecture is also abstract term and therefore must be implemented somehow. To implement the layers I propose sets of custom-type definitions. Answering the question of what is a layer, the answer is it is a set of custom types. In maths, sets are a group of well-defined entities called members of the set. In the proposed case the well-defined entity is a custom type - a language construct. The set notion is derived from the mathematical theory and is well known from the background school education, hence we may skip deep diving into this theory. The only important thing is how to recognize the membership. There must be a boundary that we can use to distinguish if a type belongs to the selected set or not. To make the layer unambiguous it must be assumed that any type belongs only to one set, to one layer. This way we can convert the discussion about mathematical sets to an examination of types grouping. Now we must answer a question about how to recognize the membership of a type. In other words the fact of being a member of a selected group. + +The namespace construct could be a relief to help make up a boundary of the set and finally of a layer. Namespaces are used to organize and provide a level of separation of program parts and to avoid name collisions. The namespace unique name could be used as a prefix of an identifier of the definition to make the full name unique in the program scope. On the other hand, the namespace can also be considered a container or an organization unit of definitions. This concept perfectly fits the concept of grouping or more formally enforcing set membership of types. + +This concept is illustrated in the figure below where we have three main layers created using the proposed method. It was generated from the text gathered in the `Graphical Data` folder. This image has been created using a code analytic tool embedded in the development environment. After removing not important parts, thanks to this image we can distinguish three layers, called View, ViewModel, and Model. It is also worth notifying that internally inside the layer circular dependencies are perfectly OK. Let me recall that only between layers we must have unidirectional top-down dependencies. As a side effect of using the embedded tool to analyze the architecture of the program text, there are different kinds of arrows. We may safely neglect this. This tool is not a subject of our examination. + +![MVVM Layered Architecture](.Media/MVVMLayeredArchitecture.png) + +Minimizing the number of projects in a solution reduces maintenance costs and reduces dependency hell, so if portability is not a goal it may not be worth forcing separate projects. However, here we are dealing with a scenario where portability is critical, so separating projects is justified. The purpose of implementing layers using projects may be to minimize the program area dependent on technology by limiting the dependency on one project only. Let me give you an example. There is no doubt. A graphical user interface should be implemented differently for desktop devices equipped with a high-resolution monitor and for smartphone devices. So let's try to put forward the thesis that layers can be implemented using projects. + +From the point of view of the development environment, a project is just an organizational unit within the solution. Solution and project are concepts related to the tool like Visual Studio, and not to the program text consistent with the selected programming language. This would indicate that using projects to implement layers is not a good idea because it has no direct connection with the programming language. However, we must consider an important feature of a solution project - the project is also a compilation unit. Therefore, its content must be consistent and compliant with a programming language. It can be treated as the boundary of a set of type definitions. Unidirectional and hierarchical top-down relationships can be implemented using the References/Dependencies project branches, as shown in the figure below. Additionally, in the case of projects compared to namespaces, type definitions visibility control can be employed, which should further facilitate the implementation of a layer as a set of type definitions and hierarchical unidirectional relationships between layers. + +![MVVM Layered Architecture Using Projects](.Media/MVVMLayeredArchitectureProjectBased.png) + ### 6.4. Diagram View ### 6.5. Porządkowanie diagramu @@ -212,13 +232,9 @@ Let's start with the fact that our sample program has three projects. The first ## Model warstwowy -### Model Warstwowy Wprowadzenie - -Zacznijmy od tego, że nasz program przykładowy ma dwa projekty. Pierwszy z przyrostkiem View bazuje na Framework 4.61, więc jest dedykowany dla konkretnej implementacji biblioteki .NET. To ogranicza pole manewru w zakresie jego wykorzystania na innych platformach sprzętowych i systemowych, ale wyjścia nie ma, bo WPF jest technologią dedykowaną dla Windows. Drugi projekt bazuje na .NET Standard. .NET Standard jest abstrakcyjną definicją biblioteki .NET, tzn. nie zawiera żądnej implementacji, a jedynie abstrakcyjne definicje. Dziki temu projekty bazujące na .NET standard są przenośne i raz skompilowana biblioteka może być realizowana na każdej platformie systemowej, dla której istnieje implementacja .NET. Nie wchodząc w szczegóły, zależność pomiędzy tymi projektami możemy zilustrować w następujący sposób. Dla dociekliwych co oznaczają poszczególne strzałki jest legenda. Na potrzeby tej lekcji nas będzie interesował tylko zwrot tych strzałek. ### Czy projekt może być warstwą -Odpowiadając na pytanie co to jest warstwa, spróbujmy zatem postawić tezę, że warstwy powinny być zaimplementowane z wykorzystaniem projektów. Zauważmy, że w poprzedniej lekcji używałem tego samego programu przykładowego, ale wszystko było w jednym projekcie i działało. Generalnie minimalizowanie liczby projektów prowadzi do zmniejszenia kosztów utrzymania, więc jeśli przenośność nie jest wartością dodaną, to może nie warto wydzielać na siłę osobnych projektów. Tu jednak ćwiczymy scenariusz, w który przenośność jest krytyczna, więc rozdzielenie projektu na dwa jest konieczne. Wydzielenie części programu do osobnego projektu - z punktu widzenia jego semantyki, więc działania - nic nie zmieniło. Tu trzeba podkreślić, że projekt to tylko jednostka organizacyjna w ramach solution. Solution, czyli rozwiązanie i projekt to pojęcie związane z narzędziem jakim jest Visual Studio, a nie z semantyką programu. Tak, czy inaczej używanie projektów do implementacji warstw to nie jest dobry pomysł. Tu jednak ważne zastrzeżenie, tylko dzięki odpowiedniej architekturze programu wydzielenie jego fragmentu do osobnego projektu nie było trudne. Natomiast warunkiem koniecznym, aby ten proces w ogóle był możliwy jest, aby referencje, czyli odwołania do definicji typów były wyłącznie hierarchiczne, ponieważ tylko takie można zdefiniować dla projektów. Z rysunku oraz z gałęzi references i Depencies widać, że w tym przypadku jest to spełnione. ### MVVM jako podwarstwy warstwa prezentacji