<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Evolving Software &#187; ddd</title>
	<atom:link href="http://evolving-software.co.uk/blog/tag/ddd/feed/" rel="self" type="application/rss+xml" />
	<link>http://evolving-software.co.uk/blog</link>
	<description>General tidbits about Domain Driven Design and TrueView</description>
	<lastBuildDate>Tue, 06 Dec 2011 21:29:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Domain Types &#8211; Interfaces</title>
		<link>http://evolving-software.co.uk/blog/2009/11/24/domain-types-interfaces/</link>
		<comments>http://evolving-software.co.uk/blog/2009/11/24/domain-types-interfaces/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:20:30 +0000</pubDate>
		<dc:creator>Vijay</dc:creator>
				<category><![CDATA[Useful info]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[domaintypes]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[source code]]></category>

		<guid isPermaLink="false">http://evolving-software.co.uk/blog/?p=313</guid>
		<description><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/11/24/domain-types-interfaces/" title="Domain Types - Interfaces"></a>In the last post, I published the DomainTypes library: a set of .NET interfaces &#38; base classes to provide the building blocks for DDD (source code included). In this post I&#8217;ll describe the interfaces and supporting design decisions. IDomainObject Represents &#8230;<p class="read-more"><a href="http://evolving-software.co.uk/blog/2009/11/24/domain-types-interfaces/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/11/24/domain-types-interfaces/" title="Domain Types - Interfaces"></a><p>In the <a href="http://evolving-software.co.uk/blog/2009/11/19/free-net-type-library-for-domain-driven-design-source-code/">last post</a>, I published the <a href="http://evolving-software.co.uk/downloads/DomainTypes.zip">DomainTypes library</a>: a set of .NET interfaces &amp; base classes to provide the building blocks for DDD (source code included).</p>
<p>In this post I&#8217;ll describe the interfaces and supporting design decisions.</p>
<h3>IDomainObject</h3>
<p>Represents any type of object within the Domain model. Currently this is simply used as a marker, signalling to developers that the implementation has DDD semantics.</p>
<h3>IEntity</h3>
<p>Represents a unique Entity within the system.  The <strong>ID </strong>property is used to identify the instance during it&#8217;s lifetime.  Using a GUID allows identity to be established without having to talk to a persistence store (i.e. database).</p>
<h3>IValueObject</h3>
<p>Represents a non-unique object within the system.  Note that it&#8217;s an object, and not a struct.  Structs may seem like a better semantic fit with DDD, but too many instances can cause memory problems (structs &#8211; like value types &#8211; are created on the stack).</p>
<div>The <strong>Clone() </strong>method is used to create copies.  The implementing class can decide whether to create new instances, or use the <em>FlyWeight</em> pattern.</div>
<h3>IList&lt;T&gt;</h3>
<p>Represents a list of Domain Objects.  It&#8217;s crucial that the implementing class raises events <em>before </em>items are added or removed from the list.  This allows consumer code to execute any domain rules, and cancel the action if necessary.</p>
<h3>IEvent</h3>
<p>This is one that <a href="http://domaindrivendesign.org/library/evans_2009_1">Eric Evans mentioned earlier this year</a>.  It is used to record &amp; identify <strong>domain events</strong>, and must be immutable. For example, a child&#8217;s birth should be captured, be identifiable, but never modified.</p>
<h3>IAggregateRoot</h3>
<p>Most people understand Aggregate Roots as a cluster of closely associated entities.  However, there are 2 additional concerns that an Aggregate Root has:</p>
<ol>
<li>It knows how to validate the entire aggregate</li>
<li>It is used to lock it&#8217;s contents in a multi-user environment</li>
</ol>
<p>The <strong>IsConsistent()</strong> method is a placeholder for all rules/invariants that apply to the aggregate.  The locking concerns are handled by<strong> IRepository&lt;T&gt; </strong>(see below).</p>
<h3>IFactory&lt;T&gt;</h3>
<p>Used to create Domain Objects/Entities/Aggregate Roots that are complex to build.  Only use factories when the code within your constructors becomes unweildy.</p>
<h3>IRepository&lt;T&gt;</h3>
<p>Used as a facade to a persistence store.  Strictly speaking, repositories should only deal with Aggregate Roots &#8211; to access other entities you would navigate through the Aggregate.</p>
<p>In addition to the typical <strong>Load()</strong>/<strong>Save()</strong>/<strong>Delete() </strong>methods, I&#8217;ve also included <strong>Lock()</strong> and <strong>Unlock</strong>() methods.  This is a crucial function in a multi-user system, and should be considered when designing your Aggregates.</p>
<h3>IService</h3>
<p>Currently this is simply used as a marker.  Only consider using Services if :</p>
<ol>
<li>Try as you might, <em>you can&#8217;t decide</em> on which Domain Object to place your logic</li>
<li>The logic requires the use of several unassociated Domain Objects</li>
<li>You&#8217;re communicating with another module/tier/component</li>
</ol>
<p>The remaining interfaces aren&#8217;t DDD specific, but are to aid real-world implementations.  I&#8217;ll discuss those in the near future.</p>
<p><a href="http://evolving-software.co.uk/downloads/DomainTypes.zip">Download the source code</a></p>
]]></content:encoded>
			<wfw:commentRss>http://evolving-software.co.uk/blog/2009/11/24/domain-types-interfaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eric Evans: &#8220;What I&#8217;ve learned about DDD since the book&#8221;</title>
		<link>http://evolving-software.co.uk/blog/2009/06/30/eric-evans-what-ive-learned-about-ddd-since-the-book/</link>
		<comments>http://evolving-software.co.uk/blog/2009/06/30/eric-evans-what-ive-learned-about-ddd-since-the-book/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 11:33:55 +0000</pubDate>
		<dc:creator>Vijay</dc:creator>
				<category><![CDATA[Useful info]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[domain driven design]]></category>
		<category><![CDATA[eric evans]]></category>
		<category><![CDATA[experimenting]]></category>
		<category><![CDATA[exploring]]></category>
		<category><![CDATA[ubiquitous language]]></category>

		<guid isPermaLink="false">http://evolving-software.co.uk/blog/?p=247</guid>
		<description><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/06/30/eric-evans-what-ive-learned-about-ddd-since-the-book/" title="Eric Evans: &quot;What I&#039;ve learned about DDD since the book&quot;"></a>Eric Evans talks about the most essential parts of his book, having practiced it over the last 5 years. One of the topics that caught my attention was Exploration and Experimentation (3m 25s into the video).  Evans suggests that teams &#8230;<p class="read-more"><a href="http://evolving-software.co.uk/blog/2009/06/30/eric-evans-what-ive-learned-about-ddd-since-the-book/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/06/30/eric-evans-what-ive-learned-about-ddd-since-the-book/" title="Eric Evans: &quot;What I&#039;ve learned about DDD since the book&quot;"></a><p><a href="http://domaindrivendesign.org/library/evans_2009_1">Eric Evans talks about</a> the most essential parts of his book, having practiced it over the last 5 years.</p>
<p>One of the topics that caught my attention was <strong>Exploration and Experimentation</strong> (3m 25s into the video).  Evans suggests that teams should be exploring &amp; experimenting even after a useful domain model is created.  His quote:</p>
<blockquote><p>What are the odds that [the first good model] is the best you could have done?</p></blockquote>
<p>So why aren&#8217;t teams doing this already?  Typically, it&#8217;s because of <strong>fear </strong>and <strong>cost of change</strong><em>. </em>Traditionally, software has never been easy to change (read <em>expensive</em>).  And for all of the new technology being spewed out, not all of it is designed to <em>make change easy</em>.</p>
<p>This is the void that <a href="http://www.evolving-software.co.uk/trueview-domain-modeller.html">TrueView </a>attempts to address.  It&#8217;s not about UI design, or database design, or Web Service contracts.  It&#8217;s about creating interactive domain models that Domain Experts and Software Experts can explore, discuss, and help refine the <strong>ubiquitous language</strong>.</p>
<p>If you haven&#8217;t tried it already, you can <a href="http://www.evolving-software.co.uk/downloads/TrueViewFreeTrial.exe">download it here</a>. I hope you find it useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://evolving-software.co.uk/blog/2009/06/30/eric-evans-what-ive-learned-about-ddd-since-the-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips for Domain Driven Design and TrueView</title>
		<link>http://evolving-software.co.uk/blog/2009/06/02/tips-for-domain-driven-design-and-trueview/</link>
		<comments>http://evolving-software.co.uk/blog/2009/06/02/tips-for-domain-driven-design-and-trueview/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 07:27:00 +0000</pubDate>
		<dc:creator>Vijay</dc:creator>
				<category><![CDATA[TrueView tips]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[domain driven design]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://evolving-software.co.uk/blog/?p=230</guid>
		<description><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/06/02/tips-for-domain-driven-design-and-trueview/" title="Tips for Domain Driven Design and TrueView"></a>Here are some tips for DDD newbies.  It&#8217;s easy to fall back to doing &#8216;what you know best&#8217;, so use these tips to stay focused. Hopefully your design skills will get better (and faster) as a result. Don&#8217;t start with &#8230;<p class="read-more"><a href="http://evolving-software.co.uk/blog/2009/06/02/tips-for-domain-driven-design-and-trueview/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/06/02/tips-for-domain-driven-design-and-trueview/" title="Tips for Domain Driven Design and TrueView"></a><p>Here are some tips for DDD newbies.  It&#8217;s easy to fall back to doing &#8216;what you know best&#8217;, so use these tips to stay focused. Hopefully your design skills will get better (and faster) as a result. <img src='http://evolving-software.co.uk/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ol>
<li><strong>Don&#8217;t start with the User Interface</strong><br />
Instead of asking &#8220;<em>How will the user solve this problem?</em>&#8220;, ask &#8220;<em>What is the problem?</em>&#8220;</li>
<li><strong>Design Domain Models, not database schemas</strong><br />
Most business users don&#8217;t understand database schemas &#8211; so don&#8217;t make them</li>
<li><strong>Design your Domain Model incrementally</strong><br />
Defining too much detail early on is the fastest way to get side-tracked</li>
<li><strong>Get constant feedback from your Domain Experts</strong><br />
Take advantage of TrueView’s auto-generated prototypes to get instant feedback</li>
<li><strong>Separate <em>business concerns</em> from </strong><em><strong>technical concerns</strong><br />
</em>Writing technical infrastructure code can be counter-productive during the modelling phase</li>
<li><strong>Unit testing wisely</strong><br />
Focus on testing         non-trivial behaviour and complex business logic, possibly using BDD</li>
<li><strong>Think agile, be agile</strong><br />
Your clients don&#8217;t have time to wait, so don&#8217;t make them</li>
</ol>
<p>You can read the detailed version <a href="http://evolving-software.co.uk/tips-for-domain-driven-design.html">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://evolving-software.co.uk/blog/2009/06/02/tips-for-domain-driven-design-and-trueview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A quick chat with Eric Evans</title>
		<link>http://evolving-software.co.uk/blog/2009/03/26/a-quick-chat-with-eric-evans/</link>
		<comments>http://evolving-software.co.uk/blog/2009/03/26/a-quick-chat-with-eric-evans/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 06:41:31 +0000</pubDate>
		<dc:creator>Vijay</dc:creator>
				<category><![CDATA[Useful info]]></category>
		<category><![CDATA[aspects]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[domain driven design]]></category>

		<guid isPermaLink="false">http://evolving-software.co.uk/blog/?p=185</guid>
		<description><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/03/26/a-quick-chat-with-eric-evans/" title="A quick chat with Eric Evans"></a>Eric Evans chatted with Alex Handy (SDTimes) about the primary aspects of DDD.  Read the interview here.]]></description>
			<content:encoded><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/03/26/a-quick-chat-with-eric-evans/" title="A quick chat with Eric Evans"></a><p>Eric Evans chatted with Alex Handy (SDTimes) about the primary aspects of DDD.  <a href="http://www.sdtimes.com/link/33357">Read the interview here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://evolving-software.co.uk/blog/2009/03/26/a-quick-chat-with-eric-evans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The BBC uses Domain Driven Design</title>
		<link>http://evolving-software.co.uk/blog/2009/03/24/the-bbc-uses-domain-driven-design/</link>
		<comments>http://evolving-software.co.uk/blog/2009/03/24/the-bbc-uses-domain-driven-design/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 07:08:52 +0000</pubDate>
		<dc:creator>Vijay</dc:creator>
				<category><![CDATA[Useful info]]></category>
		<category><![CDATA[bbc]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://evolving-software.co.uk/blog/?p=174</guid>
		<description><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/03/24/the-bbc-uses-domain-driven-design/" title="The BBC uses Domain Driven Design"></a>A little late , but still relevant&#8230; Michael Smethurst (Information Architect at the BBC) describes how DDD is used to make websites.]]></description>
			<content:encoded><![CDATA[<a href="http://evolving-software.co.uk/blog/2009/03/24/the-bbc-uses-domain-driven-design/" title="The BBC uses Domain Driven Design"></a><p>A little late <img src='http://evolving-software.co.uk/blog/wp-includes/images/smilies/icon_redface.gif' alt=':oops:' class='wp-smiley' />  , but still relevant&#8230;</p>
<p>Michael Smethurst (Information Architect at the BBC) describes<a href="http://www.bbc.co.uk/blogs/radiolabs/2009/01/how_we_make_websites.shtml"> how DDD is used to make websites</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://evolving-software.co.uk/blog/2009/03/24/the-bbc-uses-domain-driven-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

