<?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/"
	>

<channel>
	<title>Outformations</title>
	<atom:link href="http://www.outformations.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.outformations.com/blog</link>
	<description>Step Beyond Information</description>
	<pubDate>Thu, 11 Feb 2010 03:22:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mapping to the past considered helpful&#8230;</title>
		<link>http://www.outformations.com/blog/?p=775</link>
		<comments>http://www.outformations.com/blog/?p=775#comments</comments>
		<pubDate>Thu, 11 Feb 2010 03:22:35 +0000</pubDate>
		<dc:creator>Scott Hurlbert</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<category><![CDATA[by Scott]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=775</guid>
		<description><![CDATA[



  $(document).ready(function(){
    var url = "http://www.hurlbert.net/blog/20100210-MappingToThePast.v1.txt";
    doAjax(url, $("#target_20100210"), $("#target_20100210"));
  });

]]></description>
			<content:encoded><![CDATA[<p><span id="target_20100210"></span><br />
<script src="http://code.jquery.com/jquery-latest.pack.js"></script><br />
<script src="http://www.hurlbert.net/blog/inject.v9.js"></script><br />
<script>
  $(document).ready(function(){
    var url = "http://www.hurlbert.net/blog/20100210-MappingToThePast.v1.txt";
    doAjax(url, $("#target_20100210"), $("#target_20100210"));
  });
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=775</wfw:commentRss>
		</item>
		<item>
		<title>Lucky Number Seven Should Be Taken in Context</title>
		<link>http://www.outformations.com/blog/?p=713</link>
		<comments>http://www.outformations.com/blog/?p=713#comments</comments>
		<pubDate>Mon, 11 Jan 2010 13:21:41 +0000</pubDate>
		<dc:creator>Scott Hurlbert</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=713</guid>
		<description><![CDATA[The TDD approach is Agile and I certainly like using this approach myself.  No, it wasn't the strategy of TDD that was bothering me.  It was something else..]]></description>
			<content:encoded><![CDATA[<p><span id="target_lucky"></span><br />
<script src="http://code.jquery.com/jquery-latest.pack.js"></script><br />
<script src="http://www.hurlbert.net/blog/inject.v9.js"></script><br />
<script>
  $(document).ready(function(){
    var url = "http://www.hurlbert.net/blog/20100116%20-%20Lucky%20number%20seven%20should%20be%20taken%20in%20context.v7.txt";
    doAjax(url, $("#target_lucky"), $("#target_lucky"));
  });
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=713</wfw:commentRss>
		</item>
		<item>
		<title>Outformations in 2009</title>
		<link>http://www.outformations.com/blog/?p=705</link>
		<comments>http://www.outformations.com/blog/?p=705#comments</comments>
		<pubDate>Wed, 30 Dec 2009 20:05:46 +0000</pubDate>
		<dc:creator>Scott Hurlbert</dc:creator>
		
		<category><![CDATA[Outformations]]></category>

		<category><![CDATA[Productivity]]></category>

		<category><![CDATA[Values]]></category>

		<category><![CDATA[by David]]></category>

		<category><![CDATA[by Don]]></category>

		<category><![CDATA[by Scott]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=705</guid>
		<description><![CDATA[





  $(document).ready(function(){
    var url = "http://hurlbert.net/blog/20091230-Teambook.v1.txt";
    doAjax(url, $("#target_20091230"), $("#target_20091230"));
  });

]]></description>
			<content:encoded><![CDATA[<p><span id="target_20091230"></span><br />
<script src="http://code.jquery.com/jquery-latest.pack.js">
</script><br />
<script src="http://www.hurlbert.net/blog/inject.v9.js">
</script><br />
<script>
  $(document).ready(function(){
    var url = "http://hurlbert.net/blog/20091230-Teambook.v1.txt";
    doAjax(url, $("#target_20091230"), $("#target_20091230"));
  });
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=705</wfw:commentRss>
		</item>
		<item>
		<title>Don&#8217;t Do Me Like That</title>
		<link>http://www.outformations.com/blog/?p=695</link>
		<comments>http://www.outformations.com/blog/?p=695#comments</comments>
		<pubDate>Tue, 29 Dec 2009 02:44:31 +0000</pubDate>
		<dc:creator>Scott Hurlbert</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[by David]]></category>

		<category><![CDATA[by Steve]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=695</guid>
		<description><![CDATA[



  $(document).ready(function(){
    var url = "http://www.hurlbert.net/blog/20100116%20-%20Dont%20Do%20Me%20Like%20That.v7.txt"
    doAjax(url, $("#target_DontDoMe"), $("#target_DontDoMe"));
  });

]]></description>
			<content:encoded><![CDATA[<p><span id="target_DontDoMe"></span><br />
<script src="http://code.jquery.com/jquery-latest.pack.js"></script><br />
<script src="http://www.hurlbert.net/blog/inject.v9.js"></script><br />
<script>
  $(document).ready(function(){
    var url = "http://www.hurlbert.net/blog/20100116%20-%20Dont%20Do%20Me%20Like%20That.v7.txt"
    doAjax(url, $("#target_DontDoMe"), $("#target_DontDoMe"));
  });
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=695</wfw:commentRss>
		</item>
		<item>
		<title>This Blog Entry Was Self-Written, By Me v2.0</title>
		<link>http://www.outformations.com/blog/?p=658</link>
		<comments>http://www.outformations.com/blog/?p=658#comments</comments>
		<pubDate>Wed, 23 Dec 2009 17:37:50 +0000</pubDate>
		<dc:creator>Scott Hurlbert</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=658</guid>
		<description><![CDATA[I hope this discussion is seen as a wake up call to the teachers and practitioners of scrum and Agile.  They will do themselves and their teams a favor by replacing "self-organizing" with "autonomous team" in their nomenclature.

This represents a fundamental improvement to the principles of Agile.]]></description>
			<content:encoded><![CDATA[<p><span id="target_20091228"></span><br />
<script src="http://code.jquery.com/jquery-latest.pack.js"></script><br />
<script src="http://www.hurlbert.net/blog/inject.v9.js"></script><br />
<script>
  $(document).ready(function(){
    var url = "http://hurlbert.net/blog/20091228-Self-Written.v2.txt";
    doAjax(url, $("#target_20091228"), $("#target_20091228"));
  });
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=658</wfw:commentRss>
		</item>
		<item>
		<title>Every Project Needs a Project Logbook</title>
		<link>http://www.outformations.com/blog/?p=637</link>
		<comments>http://www.outformations.com/blog/?p=637#comments</comments>
		<pubDate>Wed, 16 Dec 2009 14:05:11 +0000</pubDate>
		<dc:creator>Scott Hurlbert</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=637</guid>
		<description><![CDATA[



  $(document).ready(function(){
    var url = "http://hurlbert.net/blog/20091216-Project-Logbook.v5.txt";
    doAjax(url, $("#target_20091216"), $("#target_20091216"));
  });

]]></description>
			<content:encoded><![CDATA[<p><span id="target_20091216"></span><br />
<script src="http://code.jquery.com/jquery-latest.pack.js"></script><br />
<script src="http://www.hurlbert.net/blog/inject.v9.js"></script><br />
<script>
  $(document).ready(function(){
    var url = "http://hurlbert.net/blog/20091216-Project-Logbook.v5.txt";
    doAjax(url, $("#target_20091216"), $("#target_20091216"));
  });
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=637</wfw:commentRss>
		</item>
		<item>
		<title>Are You Happy Learning?  Probably Not&#8230;</title>
		<link>http://www.outformations.com/blog/?p=506</link>
		<comments>http://www.outformations.com/blog/?p=506#comments</comments>
		<pubDate>Tue, 01 Dec 2009 03:32:52 +0000</pubDate>
		<dc:creator>Scott Hurlbert</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<category><![CDATA[Productivity]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[by Scott]]></category>

		<category><![CDATA[Learning]]></category>

		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=506</guid>
		<description><![CDATA[All of a sudden I was happy with my choice.  I felt less frustrated and more certain that I was on the right track.  Here's the kicker - the breaks were too short to get anything done.  I wasn't actually accomplishing anything but I felt better about my efforts.  ]]></description>
			<content:encoded><![CDATA[<p><span id="target_20091130"></span><br />
<script src="http://code.jquery.com/jquery-latest.pack.js"></script><br />
<script src="http://www.hurlbert.net/blog/inject.v9.js"></script><br />
<script>
  $(document).ready(function(){
    var url = "http://hurlbert.net/blog/20091130-Happiness.v1.txt";
    doAjax(url, $("#target_20091130"), $("#target_20091130"));
  });
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=506</wfw:commentRss>
		</item>
		<item>
		<title>Why more architectural layers = less toil (Part 4)</title>
		<link>http://www.outformations.com/blog/?p=443</link>
		<comments>http://www.outformations.com/blog/?p=443#comments</comments>
		<pubDate>Mon, 23 Nov 2009 18:31:37 +0000</pubDate>
		<dc:creator>Don Robins</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Application Development]]></category>

		<category><![CDATA[Architecture]]></category>

		<category><![CDATA[ASL]]></category>

		<category><![CDATA[DTO]]></category>

		<category><![CDATA[Enterpise]]></category>

		<category><![CDATA[Layers]]></category>

		<category><![CDATA[Repository]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=443</guid>
		<description><![CDATA[I my last post, I described the benefits of applying the Repository pattern to encapsulate all logic pertaining to the direct manipulation of your data entities.  The repository is responsible for shaping the data entities that will get passed back up through the ASL to your services or views, as well as pushing the [...]]]></description>
			<content:encoded><![CDATA[<p>I my <a href="http://www.outformations.com/blog/?p=440">last post</a>, I described the benefits of applying the <strong>Repository</strong> pattern to encapsulate all logic pertaining to the direct manipulation of your data entities.  The repository is responsible for shaping the data entities that will get passed back up through the ASL to your services or views, as well as pushing the data through the data services layer down to its final persistence location.  You should note that this could be any number of data source types, from a relational database, to xml files, to an external web service.  The repository is the manager of all such data centric interactions.</p>
<p>It is most important to note that when fetching data and passing it up into the application layers, it should be packaged appropriately based on the need of the calling layer.  While you could simply pass full data entities of your Model into the application from repository calls, care should be taken to avoid unnecessarily exposing full Model entity details throughout your application.  It is important to minimize the number of locations that will break if the data model changes over time, and rest assured, it will change over time. For this reason, we depend upon the ASL and Repository layer interfaces when using and accessing the Data Model as these methods can be used to create packages of data that represent just the specific information necessary to enact a Use Case or support a View.  This collection of information is often referred to as the ViewModel; you can think of this as a Model specifically abstracted for the View, or a specialization of the domain Model.<br />
<span id="more-443"></span><br />
We use the <a href="http://en.wikipedia.org/wiki/Data_transfer_object">Data Transfer Object (DTO) pattern</a> to create packages of information to abstract the ViewModel. And as the application layers are designed specifically to represent each Use Case, it makes sense to delegate to them the responsibility of creating such packages which will be contained in the <strong>Data Transfer Objects (DTO)</strong>. The DTO’s are passed to the layers above to be used as needed, and subsequently passed back to the Repository for processing into the underlying data source using whichever data service technology is in force, whether <a href="https://www.hibernate.org/343.html">NHibernate</a>, Microsoft’s <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ to SQL</a>, the <a href="http://msdn.microsoft.com/en-us/data/aa937723.aspx">Entity Framework</a> or calls to external services, etc.</p>
<p>Any DTO may contain an instantiation of a single entity, a collection of entities, or even just a limited property set representing whatever needs to be managed at the View or Controller level. At some point you may feel the need to reference properties of the Data Model’s entities, but in situations other than when Data Binding to controls, it is a better practice to limit direct property access, and instead use methods that act on the entity types and their Repositories as much as possible.</p>
<p>So, that&#8217;s it on layering for now.  There will certainly be other classes and utilities in your solution as with any complex application, but utilizing ASL and Repository layers will give you some real bang for the buck. Once in place in your architecture, and once you get the feel for how to abstract the logic across these additional but thin layers, all of a sudden making changes to your system code becomes simpler, and you find yourself breaking and fixing your code less often, even though you may be re factoring faster and more frequently.</p>
<p>Adding layering functionality, even though you may have to spread it out across multiple classes, becomes less error prone because you find yourself writing simpler and less verbose code. Testing becomes easier because you only need to create tests for the smaller methods that you create at each layer. Method names can be more explicit and self-documenting because the methods themselves have a more explicit single purpose. And as your system grows, you become more and more aware of where each discreet piece of functionality lives and why it lives there, as a clean consistency of design slowly emerges and makes itself evident.</p>
<p>How about that…cleaner code, fewer bugs, easier to write, easier to test, easier to understand, easier to maintain. Who would’a thunk you get all this, just from adding a few more layers…but it’s true.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=443</wfw:commentRss>
		</item>
		<item>
		<title>Why more architectural layers = less toil (Part 3)</title>
		<link>http://www.outformations.com/blog/?p=440</link>
		<comments>http://www.outformations.com/blog/?p=440#comments</comments>
		<pubDate>Mon, 23 Nov 2009 18:31:28 +0000</pubDate>
		<dc:creator>Don Robins</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Application Development]]></category>

		<category><![CDATA[Architecture]]></category>

		<category><![CDATA[ASL]]></category>

		<category><![CDATA[DTO]]></category>

		<category><![CDATA[Enterpise]]></category>

		<category><![CDATA[Layers]]></category>

		<category><![CDATA[Repository]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=440</guid>
		<description><![CDATA[In my last post, I described the benefits of the Application Services Layer (ASL) and how it can act as a representation of  a particular domain in your application.  Your services or UI layer talks directly to the ASL layer for all of its needs; it effectively represents an Application Programming interface (API) [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.outformations.com/blog/?p=437">last post</a>, I described the benefits of the <strong>Application Services Layer (ASL)</strong> and how it can act as a representation of  a particular domain in your application.  Your services or UI layer talks directly to the ASL layer for all of its needs; it effectively represents an Application Programming interface (API) to your application that can be utilized by any number or style of front end web services or thin client applications. </p>
<p>Now let’s drop down a level. Implementing a <a href="http://martinfowler.com/eaaCatalog/repository.html">Data Repository pattern</a> provides a class whose methods represent specific actions that must be performed upon data entities managed by the Model. You would typically create one repository for each sub-domain or arbitrary collection of your system’s entities, and these methods will act upon the entities in your Model, calling on their methods, perhaps setting their properties, perhaps managing multiple entities or a list of entities all at once.<br />
<span id="more-440"></span><br />
Essentially, these classes will encapsulate all calls down into your Data Services layer. Imagine a collection of methods, each executing a specific LINQ query and returning or changing the state of one or more entity classes in your Model. Imagine how attractive it would be to have all querying logic encapsulated in one explicit class for each module of your application rather than scattered about the application or in the controllers where it often ends up; too often we hear the excuse, “Well at least I didn’t put it in the View!”.</p>
<p>What about the Data Model? We have to be careful here because the term ‘Model’ becomes a bit overloaded. In its truest sense, the Data Model of your application will consist of the classes representing the business entities, both in structure and behavior. Many of your application’s layers will use or depend upon entities in your application’s Data Model.  Some of the higher layers such as the View or Controller will also call upon objects within themselves that will be referred to as the ‘Model’ but are actually placeholders within the MVC layer to manipulate data from the Data Model layer.</p>
<p>In my <a href="http://www.outformations.com/blog/?p=443">next post</a> and last in this series, I&#8217;ll talk about how we can partition the entities of your application and selectively marshall only what is needed up and down the layers of your application using <strong>Data Transfer Objects (DTOs)</strong>&#8230;  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=440</wfw:commentRss>
		</item>
		<item>
		<title>Why more architectural layers = less toil (Part 2)</title>
		<link>http://www.outformations.com/blog/?p=437</link>
		<comments>http://www.outformations.com/blog/?p=437#comments</comments>
		<pubDate>Mon, 23 Nov 2009 18:17:00 +0000</pubDate>
		<dc:creator>Don Robins</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Application Development]]></category>

		<category><![CDATA[Architecture]]></category>

		<category><![CDATA[ASL]]></category>

		<category><![CDATA[DTO]]></category>

		<category><![CDATA[Enterpise]]></category>

		<category><![CDATA[Layers]]></category>

		<category><![CDATA[Repository]]></category>

		<guid isPermaLink="false">http://www.outformations.com/blog/?p=437</guid>
		<description><![CDATA[In my last post, I introduced the concept of extending the separation of concerns beyond the common MVC pattern.  While separating the front end of the application into the Model/View/Controller objects is certainly a good thing, we can continue to extend the layers beneath the MVC and continue to gain great leverage. 
Let’s start [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://www.outformations.com/blog/?p=334">last post</a>, I introduced the concept of extending the separation of concerns beyond the common MVC pattern.  While separating the front end of the application into the Model/View/Controller objects is certainly a good thing, we can continue to extend the layers beneath the MVC and continue to gain great leverage. </p>
<p>Let’s start with the <strong>Application Services Layer</strong>. An <strong>ASL </strong>class should implement an interface with methods explicitly representing a particular domain in your application. The methods comprising the interface of an ASL class would explicitly match the names of your defined Use Cases. Each collection of methods represents what might be considered, and could eventually end up being implemented as, a component in your system. A small application may have only one such class, but a complex enterprise application could have dozens of these classes.<br />
<span id="more-437"></span><br />
“But wait,” you say, “Now I have to define and implement an entirely new layer of classes and methods for my system? What a big pain…” Well, actually it shouldn’t be. You see, there’s really not much that you have to do other than to define what those methods are in each interface that represent your system’s functions and to implement each one. In fact, most ASL methods typically consist of only a few lines of code at most, simply passing down requests from a Controller either to fetch or process data from a method in a Repository or Service class which does the actual work. And if you haven’t already defined these methods or actions, I’d say you haven’t really done your design homework properly; it suggests that you haven’t yet defined the set of functions that your application is supposed to support.</p>
<p>We believe that these explicit user and system processes need to be clearly defined and represented within the class structure of any application. They are what your system does, and represent your system’s API. They do not necessarily pertain to only one business entity, nor do they even necessarily rely on a visual user interface. They might represent application functionality that you want to expose through a web service to external applications, or that would be called by one or more pages in your web application, or forms in your desktop application.</p>
<p>So, properly implementing the ASL insures that you have designed and built into your system those very functions that map to the requirements that you should be continually defining and refining with your project stakeholders. If it turns out that the interface to your ASL doesn’t contain a method that supports a particular required feature, somebody dropped the ball somewhere. If you can write a suite of tests with one test method for each of your ASL methods, you have now created an Acceptance Level test suite that proves to your stakeholders that the application is at least designed to do what it is supposed to do; whether or not it actually functions correctly is a different matter.</p>
<p>In my <a href="http://www.outformations.com/blog/?p=440">next post</a> I&#8217;ll dig into the <strong>Repository</strong> layer where you can encapsulate all of the logic necessary to manage the data flow into and out of your application&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.outformations.com/blog/?feed=rss2&amp;p=437</wfw:commentRss>
		</item>
	</channel>
</rss>
