Re: DDD Implementation: Marker interfaces for all classes

"Jan Bols [email protected] [domaindrivendesign]" <[email protected]> Mon, 15 Aug 2016 20:47:02 +0200
Newsgroups gmane.comp.programming.domain-driven-design
Message-ID <CAHd+Bxy23NpTt7ORNdPN1eK3DWDh9vZHq-NwWxp=N743x-J5Uw@mail.gmail.com>
--001a114b10267837ac053a20a8d8
Content-Type: text/plain; charset=UTF-8

Hi Niklas,
if you really want to enforce that every written class implements some
marker interface (or have some annotation), you can do it as some compile
time check using aspectJ for example (see
https://www.jayway.com/2010/03/28/architectural-enforcement-with-aid-of-aspectj/
for a similar example).

However, developers won't like it and will find a way to fool or bypass the
system. Once they do that, it becomes a completely useless protocol they
have to follow when creating a new class.

And you can't blame them.

Not every code you write can be marked as a 'Repository' or 'ValueObject'
or 'Entity' or 'DomainService' or ... It's just too limited and it's not
what DDD tries to achieve. There's always other stuff that has nothing to
do with DDD. I think you should invest the time less into enforcing a
certain view and spend more time on training, pair programming and code
reviewing.

It's far more important that developers understand the business and use the
same language in their code than it is to know if something is a "domain
service" or an "application service", a "value object" or an "entity".

On the other hand it is useful to mark certain classes playing certain
roles as a "Repository" or "Aggregate Root". It's extra information that
helps you understand the code better. But please, don't enforce it.
Encourage them instead.

Greetings
Jan

--001a114b10267837ac053a20a8d8
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable





<head>

<style type=3D"text/css">
<!--

/* start of attachment style */
       .ygrp-photo-title{
         clear: both;
         font-size: smaller;
         height: 15px;
         overflow: hidden;
         text-align: center;
         width: 75px;
       }
       div.ygrp-photo{
         background-position: center;
         background-repeat: no-repeat;
         background-color: white;
         border: 1px solid black;
         height: 62px;
         width: 62px;
       }

       div.photo-title=20
         a,
         div.photo-title a:active,
         div.photo-title a:hover,
         div.photo-title a:visited {
           text-decoration: none;=20
       }

       div.attach-table div.attach-row {
         clear: both;
       }

       div.attach-table div.attach-row div {
         float: left;
         /* margin: 2px;*/
       }

       p {
         clear: both;
         padding: 15px 0 3px 0;
	 overflow: hidden;
       }

       div.ygrp-file {
         width: 30px;
         valign: middle;
       }
       div.attach-table div.attach-row div div a {
         text-decoration: none;
       }

       div.attach-table div.attach-row div div span {
         font-weight: normal;
       }

       div.ygrp-file-title {
         font-weight: bold;
       }
 /* end of attachment style */
        -->
        </style>
        </head>
<html>
<head>
<style type=3D"text/css">
<!--
#ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
-->
</style>
</head>
<body>



<!-- |**|begin egp html banner|**| -->

<br><br>

<!-- |**|end egp html banner|**| -->


<div dir=3D"ltr">Hi Niklas,<div>if you really want to enforce that every=C2=
=A0written=C2=A0class implements some marker interface (or have some annota=
tion), you can do it as some compile time check using aspectJ for example (=
see=C2=A0<a href=3D"https://www.jayway.com/2010/03/28/architectural-enforce=
ment-with-aid-of-aspectj/">https://www.jayway.com/2010/03/28/architectural-=
enforcement-with-aid-of-aspectj/</a> for a similar example).</div><div><br>=
</div><div>However, developers won&#39;t like it and will find a way to foo=
l or bypass the system. Once they do that, it becomes a completely useless =
protocol they have to follow when creating a new class.=C2=A0</div><div><br=
></div><div>And you can&#39;t blame them.</div><div><br></div><div>Not ever=
y code you write can be marked as a &#39;Repository&#39; or &#39;ValueObjec=
t&#39; or &#39;Entity&#39; or &#39;DomainService&#39; or ... It&#39;s just =
too limited and it&#39;s not what DDD tries to achieve. There&#39;s always =
other stuff that has nothing to do with DDD. I think you should invest the =
time less into enforcing a certain view and spend more time on training, pa=
ir programming and code reviewing.</div><div><br></div><div>It&#39;s far mo=
re important that developers understand the business and use the same langu=
age in their code than it is to know if something is a &quot;domain service=
&quot; or an &quot;application service&quot;, a &quot;value object&quot; or=
 an &quot;entity&quot;.</div><div><br></div><div>On the other hand it is us=
eful to mark certain classes playing certain roles as a &quot;Repository&qu=
ot; or &quot;Aggregate Root&quot;. It&#39;s extra information that helps yo=
u understand the code better. But please, don&#39;t enforce it. Encourage t=
hem instead.=C2=A0</div><div><br></div><div>Greetings</div><div>Jan=C2=A0</=
div></div>




<!-- |**|begin egp html banner|**| -->

<br>


<br>

<!-- |**|end egp html banner|**| -->


<div width=3D"1" style=3D"color: white; clear: both;"/>__._,_.___</div>

=20=20=20=20=20=20
=20=20

=20=20=20=20
    <div id=3D"fromDMARC" style=3D"clear:both; margin-top: 10px;">
         <hr style=3D"height:2px ; border-width:0; color:#E3E3E3; backgroun=
d-color:#E3E3E3;">
         Posted by: Jan Bols &lt;[email protected]&gt;         <hr style=
=3D"height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
    </div>
<!-- Start Recommendations -->
<!-- End Recommendations -->



<!-- |**|begin egp html banner|**| -->

  <img src=3D"http://geo.yahoo.com/serv?s=3D97476590/grpId=3D8116923/grpspI=
d=3D1705007181/msgId=3D24796/stime=3D1471286829" width=3D"1" height=3D"1"> =
<br>

<!-- |**|end egp html banner|**| -->

=20=20
<!-- |**|begin egp html banner|**| -->

<br>



=20=20=20
=20=20=20=20=20
=20
        <!-- |**|begin egp html banner|**| -->
        <div id=3D"ygrp-vital" style=3D"background-color: #f2f2f2; font-fam=
ily: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

        <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-tr=
ansform: uppercase; "><a href=3D"https://groups.yahoo.com/neo/groups/domain=
drivendesign/info;_ylc=3DX3oDMTJlbGcyN2V0BF9TAzk3MzU5NzE0BGdycElkAzgxMTY5Mj=
MEZ3Jwc3BJZAMxNzA1MDA3MTgxBHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTQ3MTI4NjgyOA--"=
 style=3D"text-decoration: none;">Visit Your Group</a></span>

     <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: in=
line;">
            <li style=3D"border-right: 1px solid #000; font-weight: 700; di=
splay: inline; padding: 0 5px; margin-left: 0;">
      <span class=3D"cat"><a href=3D"https://groups.yahoo.com/neo/groups/do=
maindrivendesign/members/all;_ylc=3DX3oDMTJmaWJ0aW40BF9TAzk3MzU5NzE0BGdycEl=
kAzgxMTY5MjMEZ3Jwc3BJZAMxNzA1MDA3MTgxBHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzE0Nz=
EyODY4Mjg-" style=3D"text-decoration: none;">New Members</a></span>
      <span class=3D"ct" style=3D"color: #ff7900;">1</span>
    </li>
                                              </ul>
  </div>


<div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p=
x; padding: 0 2px 0 0; clear: both;">
  <a href=3D"https://groups.yahoo.com/neo;_ylc=3DX3oDMTJkMnRzMzBzBF9TAzk3ND=
c2NTkwBGdycElkAzgxMTY5MjMEZ3Jwc3BJZAMxNzA1MDA3MTgxBHNlYwNmdHIEc2xrA2dmcARzd=
GltZQMxNDcxMjg2ODI5" style=3D"float: left;"><img src=3D"http://l.yimg.com/r=
u/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height=3D"15"=
 width=3D"137" alt=3D"Yahoo! Groups" style=3D"border: 0;"/></a>
  <div style=3D"color: #747575; float: right;"> &bull; <a href=3D"https://i=
nfo.yahoo.com/privacy/us/yahoo/groups/details.html" style=3D"text-decoratio=
n: none;">Privacy</a> &bull; <a href=3D"mailto:domaindrivendesign-unsubscri=
[email protected]?subject=3DUnsubscribe" style=3D"text-decoration: none;">=
Unsubscribe</a> &bull; <a href=3D"https://info.yahoo.com/legal/us/yahoo/uto=
s/terms/" style=3D"text-decoration: none;">Terms of Use</a> </div>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

=20=20=20


  <br>

<!-- |**|end egp html banner|**| -->


<div style=3D"color: white; clear: both;"/>__,_._,___</div>
</body>

</html>

--001a114b10267837ac053a20a8d8--