<?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>Eric Feminella &#187; Design Patterns</title>
	<atom:link href="http://www.ericfeminella.com/blog/category/design-patterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ericfeminella.com/blog</link>
	<description>Thoughts on Software Design and Development</description>
	<lastBuildDate>Mon, 06 Feb 2012 06:00:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>One-time function initialization</title>
		<link>http://www.ericfeminella.com/blog/2012/02/04/one-time-function-initialization/</link>
		<comments>http://www.ericfeminella.com/blog/2012/02/04/one-time-function-initialization/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 01:02:42 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mobile Web]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=3492</guid>
		<description><![CDATA[When developing Mobile Web Applications, even the seemingly marginal micro-optimizations can result in a noticeable performance improvement over time and, therefore should be implemented where possible. One could also argue (and rightly so) that this same principle applies when developing Web Applications on the Desktop; however, in the context of Mobile Web Experiences, such optimizations [...]]]></description>
			<content:encoded><![CDATA[<p>When developing Mobile Web Applications, even the seemingly marginal micro-optimizations can result in a noticeable performance improvement over time and, therefore should be implemented where possible. One could also argue (and rightly so) that this same principle applies when developing Web Applications on the Desktop; however, in the context of Mobile Web Experiences, such optimizations are essential, perhaps even obligatory on the developers part.</p>
<p>In a previous post from a few months back I discussed some of the benefits of <a href="http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/" title="Function Overwriting in JavaScript" target="_blank">function overwriting</a> in JavaScript. One similar performance optimization I regularly employee is that of <em>One-time function initializations</em>.</p>
<p>Conceptually, a <em>One-time function initialization</em> is a rather simple pattern which can be broadly described as follows:</p>
<ol>
<li>An Immediate Function / Self-executing Function performs some initial test conditions.</li>
<li>The Immediate Function returns an anonymous function which, in turn, returns the results of the test conditions. Alternately, the Immediate Function can just return the test condition results.</li>
<li>The anonymous function returned is assigned to a function expression or, the test condition results are assigned directly.</li>
</ol>
<p>An example in code illustrates just how simple this pattern is:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">var</span> hasSomeFeature = <span class="br0">&#40;</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">// implement test logic&#8230; for example, testing</span><br />
&nbsp; &nbsp; <span class="co1">// a feature&#8217;s existence in the browser against</span><br />
&nbsp; &nbsp; <span class="co1">// multiple vendor prefixes, etc.</span></p>
<p>&nbsp; &nbsp; <span class="co1">// return a function which returns the results, or</span><br />
&nbsp; &nbsp; <span class="co1">// just return the result value if desired&#8230;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// return results&#8230;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>;<br />
<span class="br0">&#125;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
<p>Practical implementation example:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">var</span> hasWebSockets = <span class="br0">&#40;</span> <span class="kw2">function</span><span class="br0">&#40;</span> window <span class="br0">&#41;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> prefixes = <span class="st0">&#8216;ms O Moz Webkit&#8217;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&#8216; &#8216;</span><span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; n = prefixes.<span class="me1">length</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; i = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> ; i &lt; n; ++i <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> window<span class="br0">&#91;</span> prefixes<span class="br0">&#91;</span>i<span class="br0">&#93;</span> + <span class="st0">&#8216;WebSocket&#8217;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#8216;WebSocket&#8217;</span> <span class="kw1">in</span> window;<br />
<span class="br0">&#125;</span><span class="br0">&#40;</span> <span class="kw1">this</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
<p>Implementing <em>One-time function initializations</em> are quite useful in many situations. Specifically, they are of most value when implemented for use-cases where conditions are too complex to assign to a variable directly and, when the conditions tested only need to be evaluated once, after which re-evaluating the condition would be redundant and unnecessary &#8211; such as certain feature detections. </p>
<p>As a general rule of thumb, if a condition or set of conditions can be tested once; that is, they are guaranteed to not change during the execution of the application and, the tests are too complex to maintain if directly assign to a variable, then implementing One-time function initializations are a small, yet simple and practical optimization.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2012/02/04/one-time-function-initialization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AT&amp;T Best Practices Guide for App Development</title>
		<link>http://www.ericfeminella.com/blog/2012/01/15/att-best-practices-guide-for-app-development/</link>
		<comments>http://www.ericfeminella.com/blog/2012/01/15/att-best-practices-guide-for-app-development/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 11:00:20 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mobile Web]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Tablets]]></category>
		<category><![CDATA[User Experience Design]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=3419</guid>
		<description><![CDATA[When considering the various best practices surrounding the design of Mobile Web Experiences and Architectures, such works as the W3C&#8217;s Mobile Web Application Best Practices guide, or the excellent Mobile Web Best Practices site, and of course, the seminal text, Mobile First, are likely to come to mind. The concepts and strategies presented in these [...]]]></description>
			<content:encoded><![CDATA[<p>When considering the various best practices surrounding the design of Mobile Web Experiences and Architectures, such works as the W3C&#8217;s <a href="http://www.w3.org/TR/mwabp/" target="_blank">Mobile Web Application Best Practices</a> guide, or the excellent <a href="http://mobilewebbestpractices.com/" target="_blank">Mobile Web Best Practices</a> site, and of course, the seminal text, <a href="http://www.abookapart.com/products/mobile-first" target="_blank">Mobile First</a>, are likely to come to mind. The concepts and strategies presented in these works are a staple in the design of many modern Mobile Web Experiences and are without question an invaluable resource. In addition to these and other similarly related works, another new and valuable resource has been made available from a very important player in the Mobile Space indeed &#8211; an actual Wireless Carrier, AT&#038;T.</p>
<p>Recently, I was contacted by a representative of the AT&#038;T Developer Program informing me of the research conducted by the <a href="http://www.research.att.com/editions/201201_home.html?fbid=Mu13IZ0xu2h" target="_blank">AT&#038;T Research Labs</a> and, the subsequent resources made available by AT&#038;T as a result of their findings. Since I was unaware of this work, I was very interesting in learning more and, after reading the introductory statements, I was quite eager to apply AT&#038;T&#8217;s recommendations as well; to quote specifically:<br />
<blockquote>We quickly saw that a few, simple design approaches could significantly improve application responsiveness.</p></blockquote>
<p>Having read through the material in it&#8217;s entirety (provided <a href="#resources" target="_self">below</a>) I must say I am rather impressed. The information provided has very real and practical implications on the design of Mobile Web Applications. Specifically, I found the clear and concise explanation of the underlying implementation of the <a href="http://en.m.wikipedia.org/wiki/Radio_Resource_Control">Radio Resource Control (RRC) protocol</a> to be particularly relevant and useful. RRC is by far one of the most important design factors to consider in terms of battery life and Application responsiveness and, as the research suggests, this may not have been common knowledge. </p>
<p>By far, the most interesting and notable aspect of the AT&#038;T Research Lab&#8217;s work in this area is the fact that all of the information provided is applicable in the context of all Wireless Carriers, not just AT&#038;T. That is, the recommendations given, such as those regarding the RRC State Machine, for example, are all based on carrier-independent standards and protocols implemented by all Wireless Carriers. As such, understanding the implementation specifics and recommendations provided is certain to prove valuable for all users of your Application, regardless of their Carrier.</p>
<p>If you haven&#8217;t all ready, I highly recommend reading and applying the principles provided by AT&#038;T&#8217;s research to your current and future Mobile Web Application Designs.</p>
<h2 id="resources">AT&#038;T Research Labs: Mobile Application Resources</h2>
<p><a href="https://developer.att.com/developer/forward.jsp?passedItemId=7200042" target="_blank">Build Efficient Apps</a><br />
<a href="http://www.research.att.com/export/sites/att_labs/techdocs/TD_100229.pdf" target="_blank">Profiling Resource Usage for Mobile Applications: A Cross-layer Approach</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2012/01/15/att-best-practices-guide-for-app-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>External Templates in jQote2</title>
		<link>http://www.ericfeminella.com/blog/2011/12/12/external-templates-in-jqote2/</link>
		<comments>http://www.ericfeminella.com/blog/2011/12/12/external-templates-in-jqote2/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 12:00:56 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jqote2]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[templating]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=3315</guid>
		<description><![CDATA[The jQote2 API Reference provides plenty of useful examples which are sure to help users get up and running quickly. I found it a bit unclear, though, as to how templates could be loaded externally as, in the reference examples, templates are defined within the containing page. For the sake of simplicity this approach certainly [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://aefxx.com/api/jqote2-reference/" target="_blank">jQote2 API Reference</a> provides plenty of useful examples which are sure to help users get up and running quickly. I found it a bit unclear, though, as to how templates could be loaded externally as, in the reference examples, templates are defined within the containing page. For the sake of simplicity this approach certainly makes sense in the context of examples. However, in practice, templates would ideally be loaded externally. </p>
<p>While <a href="http://aefxx.com/jquery-plugins/jqote2/" target="_blank">jQote2</a> provides a perfect API for templating, it does not provide a method specifically for loading external templates; this is likely due to the fact that loading external templates could easily be accomplished natively in <a href="http://jquery.com/" target="_blank">jQuery</a>. However, since this is a rather common development use case, having such a facility available would be quite useful.</p>
<p>After reviewing the comments I came across a nice example from <a href="http://aefxx.com/" target="_blank">aefxx</a> (the author of jQote2) which demonstrated a typical approach to loading external templates which was simular to what I had been implementing myself. </p>
<p>And so, I wrote a simple jQuery Plug-in which provides a tested, reusable solution to loading external templates. After having leveraged the Plugin on quite a few different projects, I decided to open source it as others may find it useful as well.</p>
<p>You can grab the source and view the example over on the <a href="https://github.com/efeminella/jqote2-template-loader">jQote2 Template Loader</a> Github page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2011/12/12/external-templates-in-jqote2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Function Overwriting in JavaScript</title>
		<link>http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/</link>
		<comments>http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 19:45:40 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Object Oriented Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=3129</guid>
		<description><![CDATA[Whether intentional, or simply a by-product of it&#8217;s design, Javascript, being a dynamic language, allows for a level of expressiveness which most any seasoned programmer would come to appreciate. Javascript naturally provides the ability to implement some rather intriguing and quite unique patterns; one of which is the ability to overwrite a function at runtime. [...]]]></description>
			<content:encoded><![CDATA[<p>Whether intentional, or simply a by-product of it&#8217;s design, Javascript, being a <a href="http://en.wikipedia.org/wiki/Dynamic_programming_language" target="_blank">dynamic language</a>, allows for a level of expressiveness which most any seasoned programmer would come to appreciate. Javascript naturally provides the ability to implement some rather intriguing and quite unique patterns; one of which is the ability to overwrite a function at runtime.</p>
<section>
<h2>Function Overwriting</h2>
<p><em>Function Overwriting</em> (also known as &#8220;Self-Defining Functions&#8221; or &#8220;Lazy Defining Functions&#8221;) provides a pattern which, as stated above, allows for overwriting a function&#8217;s definition at runtime. This can be accomplished from outside of the function, but also from within the function&#8217;s implementation itself.</p>
<p>For example, on occasion a function may need to perform some initial piece of work, after which, all subsequent invocations would result in unnecessarily re-executing the initialization code. Typically, this issue is addressed by storing initialization flags or refactoring the initialization code to another function. While such a design solves this problem, it does result in unnecessary code which will need to be maintained. In JavaScript, perhaps a different approach is in order: we can simply redefine the function after the initialization work has been completed.</p>
<p>A possible candidate use-case for Function Overwriting is Feature Detection as, detecting for specific feature support in the Browser typically only needs to be tested once, at which point subsequent tests are unnecessary. </p>
<p>Below is a basic example of implementing <em>Function Overwritting</em> in the context of an abstraction of the <a href="http://dev.w3.org/geo/api/spec-source.html" title="HTML5 Geolocation" target="_blank">HTML5 Geolocation</a> API.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co1">// Initial &quot;getLocation&quot; implementation. Since we only need to test</span><br />
<span class="co1">// for Geolocation support once, we perform the initial test and then</span><br />
<span class="co1">// overwrite the &quot;getLocation&quot; implementation based on the results of</span><br />
<span class="co1">// the test.</span><br />
<span class="kw2">var</span> getLocation = <span class="kw2">function</span> <span class="br0">&#40;</span> success, fail, options <span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> geolocation = navigator.<span class="me1">geolocation</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> geolocation <span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> _options = <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; enableHighAccuracy : <span class="kw2">true</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timeout &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span class="nu0">60000</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; maximumAge &nbsp; &nbsp; &nbsp; &nbsp; : <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Geolocation is supported, so we overwrite the implementation</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// to simply invoke &quot;geolocation.getCurrentPosition&quot; as there </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// is no need to perform the test again.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; getLocation = <span class="kw2">function</span> <span class="br0">&#40;</span>success, fail, options<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; geolocation.<span class="me1">getCurrentPosition</span> <span class="br0">&#40;</span> success, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fail, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options || _options<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; getLocation<span class="br0">&#40;</span> success, fail, options <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Geolocation is not supported, so we overwrite the </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// implementation to simply return false (a real </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// implementation might provide a polyfill here&#8230;).</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; getLocation = <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>&nbsp; &nbsp;&nbsp; &nbsp; <br />
<span class="br0">&#125;</span>;</div>
</section>
<section>
<h2>Considerations</h2>
<p>Since functions are objects in Javascript, it is important to keep in mind that if you add a property or method to a function (either statically or via the function&#8217;s prototype), and then overwrite the function, you will have effectively removed those properties or methods as well. Also, if the function is referenced by another variable, or by a method of another object, the initially defined implementation will be preserved and the overwriting process will not occur. As such, be mindful when implementing this pattern. As a general rule of thumb, I typically only implement Function Overwriting when the function being redefined is in a private scope.<br />
</section>
<section>
<h2>Concluding Thoughts</h2>
<p>As you can see, Function Overwriting provides a convenient facility for optimizing code execution at runtime. There are many use-cases for dynamically overwriting functions and, where appropriate, they can certainly provide value in terms of performance and code maintainability. </p>
<p>Below you can find an example which demonstrates two basic <em>Function Overwriting</em> implementations. Simply load the page and add some breakpoints in Firebug to test the execution paths; both before and after overwriting each function occurs, or you can simply view the source.<br />
<a href="http://code.ericfeminella.com/articles/examples/js/function-overwritting/" title="Function Overwriting Example" target="_blank">Example</a><br />
</section>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Circumventing Conditional Comparisons</title>
		<link>http://www.ericfeminella.com/blog/2011/10/14/circumventing-conditional-comparisons/</link>
		<comments>http://www.ericfeminella.com/blog/2011/10/14/circumventing-conditional-comparisons/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 23:36:37 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Object Oriented Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[conditional comparison]]></category>
		<category><![CDATA[equality operator]]></category>
		<category><![CDATA[identity operator]]></category>
		<category><![CDATA[javascript equality operator]]></category>
		<category><![CDATA[javascript identity operator]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=2800</guid>
		<description><![CDATA[Often during the course of my day I come across code which evaluates the same conditional comparisons in multiple contexts. Understandably, this is rather typical of most software systems, and while it may only introduce a negligible amount of technical dept (in the form of redundancy) for smaller systems, that dept can grow considerably in [...]]]></description>
			<content:encoded><![CDATA[<p>Often during the course of my day I come across code which evaluates the same conditional comparisons in multiple contexts. Understandably, this is rather typical of most software systems, and while it may only introduce a negligible amount of technical dept (in the form of redundancy) for smaller systems, that dept can grow considerably in more complex, large scale applications. From a design perspective, this issue is applicable to nearly every language.</p>
<p>For example, consider a simple <code>Compass</code> class which defines just one public property, &#8220;direction&#8221; and, four constants representing each cardinal direction: North, East, South and West, respectively. In JavaScript, this could be defined simply as follows:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">var</span> Compass = <span class="kw2">function</span><span class="br0">&#40;</span>direction<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">direction</span> = direction;<br />
<span class="br0">&#125;</span><br />
Compass.<span class="me1">NORTH</span> = <span class="st0">&quot;North&quot;</span>;<br />
Compass.<span class="me1">EAST</span> &nbsp;= <span class="st0">&quot;East&quot;</span>;<br />
Compass.<span class="me1">SOUTH</span> = <span class="st0">&quot;South&quot;</span>;<br />
Compass.<span class="me1">WEST</span> &nbsp;= <span class="st0">&quot;West&quot;</span>;</div>
<p>Technically, there is nothing problematic with the above class signature; the defined constants certainly provide a much better design than conditional comparisons against literal strings throughout implementation code. That being said, this design does lead to redundancy as every instance of <code>Compass</code> which needs to evaluate the state of <code>direction</code> requires conditional comparisons. </p>
<p>For example, to test for <code>Compass.North</code>, typically, client code must be implemented as follows: </p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">if</span> <span class="br0">&#40;</span>compass.<span class="me1">direction</span> === Compass.<span class="me1">NORTH</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; <span class="co1">//&#8230;</span><br />
<span class="br0">&#125;</span></div>
<p>Likewise, simular comparisons would need to be implemented for each cardinal direction. And, while this may seem trivial for a class as simple as the <code>Compass</code> example, it does become a maintenance issue for more complex implementations. </p>
<p>With this in mind, we can simplify client code by defining each state as a specific method of <code>Compass</code>. In doing so, we afford our code the benefit of exercising (unit testing) <code>Compass</code> exclusively. This alone improves maintainability while also simplifying client code which depends on <code>Compass</code>. As such, <code>Compass</code> could be refactored to:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">var</span> Compass = <span class="kw2">function</span><span class="br0">&#40;</span>direction<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">direction</span> = direction;<br />
<span class="br0">&#125;</span><br />
Compass.<span class="me1">prototype</span> = <span class="br0">&#123;</span><br />
&nbsp; &nbsp; isNorth: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">direction</span> === Compass.<span class="me1">NORTH</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; isWest: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">direction</span> === Compass.<span class="me1">WEST</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; isSouth: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">direction</span> === Compass.<span class="me1">SOUTH</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; isEast: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">direction</span> === Compass.<span class="me1">EAST</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>Based on the above implementation of <code>Compass</code>, the previous conditional comparison can be refactored as follows:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">if</span> <span class="br0">&#40;</span>compass.<span class="me1">isNorth</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; <span class="co1">//&#8230;</span><br />
<span class="br0">&#125;</span></div>
<h3>Comparator API</h3>
<p>To simplify implementing conditional comparisons, I have provided a simple <code>Comparator</code> API that defines a single static method: <code>Comparator.each</code>, which allows for augmenting existing objects with comparison methods. <code>Comparator.each</code> can be invoked with three arguments as follows:</p>
<table class="api-doc-table" cellspacing="0">
<thead></thead>
<tbody>
<tr class="api-method">
<td>type
<td class="default"></td>
</tr>
<tr>
<td colspan="2" class="desc">The Class to which the comparison methods are to be added.</td>
</tr>
<tr class="api-method">
<td>property</td>
<td class="default"></td>
</tr>
<tr>
<td colspan="2" class="desc">The property against which the comparisons are to be made. If the property has not been defined it, too, will be added.</td>
</tr>
<tr class="api-method">
<td>values</td>
<td class="default"></td>
</tr>
<tr>
<td colspan="2" class="desc">An <code>Array</code> of constants where each value will be used to create a new comparison method (prefixed with &#8220;is&#8221;). If the constants specified are Strings, typically an <code>Array</code> containing each constant should suffice. For example, passing <code>[Foo.BAR]</code> where <code>BAR</code> equals &#8220;Bar&#8221; would result in an <code>isBar()</code> method being created. To specify custom comparison method names, an <code>Object</code> of name/value pairs can be used where each name defines the name of the method added and the value is the constant evaluated by the method. This is useful for constants which are not strings. For example, <code>{isIOS421: DeviceVersion.IOS_4_2_1}</code> where <code>IOS_4_2_1</code> equals 4.2.1 would result in an <code>isIOS421()</code> method being created.</td>
</tr>
</table>
<p>Taking the <code>Compass</code> example, the previous comparison methods could be augmented without the need to explicitly define them via <code>Comparator.each</code>:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">var</span> Compass = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">direction</span> = direction;<br />
<span class="br0">&#125;</span><br />
Compass.<span class="me1">NORTH</span> = <span class="st0">&quot;North&quot;</span>;<br />
Compass.<span class="me1">EAST</span> &nbsp;= <span class="st0">&quot;East&quot;</span>;<br />
Compass.<span class="me1">SOUTH</span> = <span class="st0">&quot;South&quot;</span>;<br />
Compass.<span class="me1">WEST</span> &nbsp;= <span class="st0">&quot;West&quot;</span>;<br />
Comparator.<span class="me1">each</span><span class="br0">&#40;</span> Compass, <span class="st0">&quot;direction&quot;</span>, <span class="br0">&#91;</span>Compass.<span class="me1">NORTH</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compass.<span class="me1">WEST</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compass.<span class="me1">SOUTH</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compass.<span class="me1">EAST</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>;</div>
<p>The above results in the comparison methods <code>isNorth</code>, <code>isEast</code>, <code>isSouth</code> and <code>isWest</code> being added to the <code>Compass</code> type.</p>
<p><strong>Comparator</strong>: <span class="figure"><a href="http://code.ericfeminella.com/apis/javascript/comparator/js/comparator.js" target="_blank">source</a> | <a href="http://code.ericfeminella.com/apis/javascript/comparator/js/comparator-min.js" target="_blank">min</a> | <a href="http://code.ericfeminella.com/apis/javascript/comparator/tests/comparator-test.js" target="_blank">test</a> (<a href="http://code.ericfeminella.com/apis/javascript/comparator" target="_blank">run</a>)</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2011/10/14/circumventing-conditional-comparisons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiscreen Software Design</title>
		<link>http://www.ericfeminella.com/blog/2011/03/06/multiscreen-software-design/</link>
		<comments>http://www.ericfeminella.com/blog/2011/03/06/multiscreen-software-design/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 16:21:10 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Object Oriented Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Tablets]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[User Experience Design]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=1852</guid>
		<description><![CDATA[&#8220;We are in the midst of a revolution across a variety of screens&#8221; You may recall first hearing the notion of a &#8220;Multiscreen Revolution&#8221; during the keynote at Max 2010. If you take a moment and think about it that&#8217;s a rather profound statement, and by all apparent indications a very true one. This is [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;We are in the midst of a revolution across a variety of screens&#8221;</p></blockquote>
<p>You may recall first hearing the notion of a &#8220;Multiscreen Revolution&#8221; during the keynote at Max 2010. If you take a moment and think about it that&#8217;s a rather profound statement, and by all apparent indications a very true one.</p>
<p>This is also how <a href="http://www.adobe.com/aboutadobe/pressroom/executivebios/kevinlynch.html" target="_blank">Kevin Lynch</a>, CTO at Adobe, begins his recent article, aptly titled  &#8220;<a href="http://blogs.adobe.com/conversations/2011/02/the-multiscreen-revolution.html" target="_blank">The Multiscreen Revolution</a>&#8221; in which Kevin provides a succinct breakdown covering the driving forces behind this revolution and how it is guiding the future of the Flash Platform. </p>
<p>Allow me to digress for a moment as, in a way, for me at least, the &#8220;Multiscreen Revolution&#8221; tends to conjure up the hypothetical notion of a <a href="http://www.sciencedaily.com/releases/2010/01/100112165249.htm" target="_blank">Multiverse</a>. This may be a suitable analogy I suppose as  we have been focused in a predominantly Personal Computer based reality for many years, and while this remains relevant, it is no longer exclusive. </p>
<p>I have been giving a lot of thought lately regarding designing software in a multi form factor paradigm and felt I would share some initial thoughts on the subject. Keep in mind much of this is still quite new and subject to change; however, I have made an attempt to isolate what I feel will remain constant moving forward, particularly in the context of developing native applications with the Flash Platform across a variety of screens. </p>
<h3>First, User Experience Design</h3>
<p>My initial thoughts on the implications of what a Multiscreen paradigm will have on the way we think about the design of software are primarily concerned with <a href="http://en.wikipedia.org/wiki/User_experience_design" target="_blank">User Experience Design</a> (UX Design). While simply using <a href="http://www.w3.org/TR/css3-mediaqueries/" target="_blank">CSS3 media queries</a> to facilitate dynamic runtime layouts will be needed for most HTML based web applications, I do not believe these types of solutions alone will allow for the kinds of compelling experiences users have come to expect. Sure they are useful, and for some HTML based websites they may suffice. However, in the context of more complex applications, RIAs in particular, but also just about every application developed specifically for a PC, too, I believe UX Design will need to encompass the best of what a particular form factor, &#8220;screen&#8221; or whatever you prefer to call it, has to offer, be it a <a href="http://en.wikipedia.org/wiki/Personal_computer" target="_blank">PC</a>, <a href="http://en.wikipedia.org/wiki/Smartphone" target="_blank">smartphone</a>, <a href="http://en.wikipedia.org/wiki/Tablet_device" target="_blank">tablet</a> or <a href="http://en.wikipedia.org/wiki/Internet_television" target="_blank">TV</a>. </p>
<p>For example, it is extremely rare that a UX Design intended for users of a PC will translate directly to a Mobile or Tablet User Experience. The interactions of a traditional physical keyboard and mouse do not equate to those of <a href="http://www.mobiledia.com/glossary/228.html" target="_blank">soft keys</a>, <a href="http://en.m.wikipedia.org/wiki/Virtual_keyboard" target="_blank">virtual keyboards</a> and <a href="http://www.lukew.com/touch/TouchGestureGuide.pdf" target="_blank">touch gesture</a> interactions. Moreover, the navigation and transitions between different views and even certain concepts and metaphors are completely different. In simplest terms; it&#8217;s not &#8220;Apples to Apples&#8221;, as the expression goes.</p>
<p>With this in mind, UX Design should remain at the forefront of Software Design, and in order for that to happen UX Design will not only need to continue to reflect the needs of users, but also by leverage the capabilities of the particular devices and screens on which an application will run. This is necessary as it better serves the needs of users in new and useful ways. Likewise, UX Design will need to account for the limitations (resources in particular) of those same form factors.</p>
<h3>Second, Architecture</h3>
<p>Mulitiscreen design obviously poses some new challenges considering the growing number of form factors which will need to be taken into account. The good news is most existing well designed software architectures have been designed with this in mind all along. That is, the key factor in managing this complexity I believe will be code reuse. A common theme amongst many of my posts, code reuse has many obvious benefits, and in the context of Multiscreen concerns it will allow for different screen specific applications to leverage general, well defined and well tested APIs. Code reuse will certainly be of tremendous value when considering the complexities encountered with Multiscreen design. Such shared APIs can be reused across applications which are designed for particular screens or extended to provide screen / device specific implementations.</p>
<p>For example, the Architectures I have worked on are designed such that each is broken out into specific modules (libraries) which, on a high level, are typically as follows:</p>
<ul>
<li><strong>unittesting-support</strong>: Provides convenience extensions of unit testing and mock frameworks.</li>
<li><strong>commons:</strong> Provides all generic, reusable APIs which have no dependencies outside of those of the Flex Framework and Flash Player API. </li>
<li><strong>framework-support:</strong> Provides reusable extensions of a particular framework. There can be multiple framework-support libraries, each of which would be specific to an individual framework; e.g. parsley-support, swiz-support, robotlegs-support, cairngorm-support, springactionscript-support etc.</li>
<li><strong>business:</strong> Provides domain dependent, business specific reusable APIs which are common amongst all projects within the business domain. This includes domain models, shared services, Presentation Models, UI components and anything else which is specific to the business domain. While all of the previously listed libraries could be used with any AS3 / Flex project, the business library is intentionally coupled to the domain.</li>
</ul>
<p>All of the above projects are used by the different business applications, allowing for significantly reduced complexity of each individual application. Moreover, each library provides isolated test coverage which allows for a greater sense of confidence when building applications which are dependent on them. This type of structure also lends itself well with common SCM and build conventions, allowing for simplified branching and versioning.</p>
<p>Architectures designed similar to what I have described above I would consider to be &#8220;multiscreen ready&#8221; (provided they are optimized and efficient) in that much of the underlying implementation has already been completed, tested and proven. What&#8217;s left is the mobile, tablet or TV application designs which should be mainly concerned with UX, particularly interactions, navigation and device capabilities. From these screen specific UX Designs the application architecture is mainly focused around view concerns specific to those devices; leveraging the existing APIs as needed. This is where the <a href="http://www.martinfowler.com/eaaDev/PresentationModel.html" target="_blank">Presentation Model Pattern</a> (which I have been recommending for years) or similar patterns will be of great value. </p>
<p>I also anticipate additional libraries being abstracted in addition to those I have listed above as a result of these device specific projects being developed. For example, I could easily imagine &#8220;device-support&#8221;, &#8220;mobile-support&#8221; and &#8220;tablet-support&#8221; projects which would provide reusable APIs specific for those screens so as to be leveraged across applications. In fact, I am working on libraries such as these at the moment.</p>
<p>Reusable libraries are nothing new; however, their role now is perhaps even more important as it is quite likely that multiple implementations of the same application will be needed for the various form factors and contexts. Existing reusable libraries may also need to be further optimized to provide the best performance against the slowest devices in order to be considered suitable for devices with the most limited resources. A natural side effect of such optimizations is that implementations of an application targeting the fastest form factors (typically, PCs) will benefit greatly.</p>
<h3>Some Concluding Thoughts</h3>
<p>In short, I believe both users and developers alike will be best served by providing unique User Experiences for specific screens as opposed to attempting to adapt the same application across multiple screens. One of the easiest ways of managing the complexity of multiscreen design and development will inevitably be code reuse. </p>
<p>I also believe the main point of focus should be on the medium and small form factors; i.e. Tablets and Smart phones. Not only for the more <a href="http://www.lukew.com/ff/entry.asp?933" target="_blank">common reasons</a> but, also because I believe PCs and Laptops will eventually be used almost exclusively for developing the applications which run on the other form factors. In fact, I can say this from my own experiences already.</p>
<p>While there is still much to learn in the area of Multiscreen Design, I feel the ideas I&#8217;ve expressed here will remain relevant. Over the course of the coming months I plan to dedicate much of my time towards further exploration of this topic and will certainly continue to share my findings.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2011/03/06/multiscreen-software-design/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Practices of an Agile Developer</title>
		<link>http://www.ericfeminella.com/blog/2011/02/10/practices-of-an-agile-developer/</link>
		<comments>http://www.ericfeminella.com/blog/2011/02/10/practices-of-an-agile-developer/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 22:24:04 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Object Oriented Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=1753</guid>
		<description><![CDATA[Of the many software engineering books I have read over the years, Practices of an Agile Developer in particular continues to be one book I find myself turning to time and time again for inspiration. Written by two of my favorite technical authors, Andy Hunt and Venkat Subramaniam, and published as part of the Pragmatic [...]]]></description>
			<content:encoded><![CDATA[<p>Of the many software engineering books I have read over the years, <a href="http://pragprog.com/titles/pad/practices-of-an-agile-developer" target="_blank">Practices of an Agile Developer</a> in particular continues to be one book I find myself turning to time and time again for inspiration.</p>
<p>Written by two of my favorite technical authors, <a href="http://blog.toolshed.com/" target="_blank">Andy Hunt</a> and <a href="http://www.agiledeveloper.com/aboutus.html" target="_blank">Venkat Subramaniam</a>, and published as part of the <a href="http://pragprog.com/" target="_blank">Pragmatic Bookshelf</a>, Practices of an Agile Developer provides invaluable, practical and highly inspirational solutions to the most common challenges we as software engineers face project after project.</p>
<p>What makes Practices of an Agile Developer something truly special is the simplicity and easy to digest format in which it is written; readers can jump in at any chapter, or practically any page for that matter, and easily learn something new and useful in a matter of minutes. </p>
<p>While covering many of the most common subjects on software development, as well as many particularly unique subjects, it is the manner in which the subjects are presented that makes the book itself quite unique. The chapters are formatted such that each provides an &#8220;<em>Angel vs. Devil on your shoulders</em>&#8221; perspective of each topic. This is quite useful as one can briefly reference any topic to take away something useful by simply reading the chapters title and the &#8220;Angel vs. Devil&#8221; advice, and from that come to a quick understanding of the solution. Moreover, each chapter also provides tips on &#8220;<em>How it Feels</em>&#8221; when following one of the prescribed approaches. The &#8220;How it feels&#8221; approach is very powerful in that it instantly draws readers in for more detailed explanations. Complimentary to this is the &#8220;<em>Keeping your balance</em>&#8221; suggestions which provide useful insights to many of the challenges one might face when trying to apply the learnings of a particular subject. &#8220;Keeping your Balance&#8221; tips answer questions which would otherwise be left to the reader to figure out.</p>
<p>I first read Practices of an Agile Developer almost 4 years ago, and to this day I regularly find myself returning to it time and time again for inspiration. A seminal text by all means, I highly recommend it as a must read for Software Developers of all levels and disciplines.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2011/02/10/practices-of-an-agile-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Domain Models and Value Objects</title>
		<link>http://www.ericfeminella.com/blog/2010/12/05/domain-models-and-value-objects/</link>
		<comments>http://www.ericfeminella.com/blog/2010/12/05/domain-models-and-value-objects/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 20:19:10 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Object Oriented Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=1658</guid>
		<description><![CDATA[The other day a friend asked me what the difference between a VO and a Domain Model was, and when I would suggest using one over the other? Since I actually get asked this very same question quite often, I thought it would be useful to provide a brief definition in the context of the [...]]]></description>
			<content:encoded><![CDATA[<p>The other day a friend asked me what the difference between a VO and a Domain Model was, and when I would suggest using one over the other? Since I actually get asked this very same question quite often, I thought it would be useful to provide a brief definition in the context of the Flex idiom which could serve as a point of reference for others moving forward.</p>
<p>In general, it is much easier to understand what a <strong>VO</strong> <em>is not</em> by first understanding what a <strong>Domain Model</strong> <em>is</em>; therefore, I will begin by providing a general definition of a Domain Model.</p>
<h3>Domain Models</h3>
<p>A Domain Model is anything of significance which represents a specific business concept within a problem domain. Domain Models are simply classes which represents such concepts by defining all of the state, behavior, constraints and relationships to other Domain Models needed to do so. Essentially, a Domain Model <em>models</em> a domain concept, such as a Product, a User, or anything which could be defined within the problem domain outside the context of code. Domain Models promote reuse and eliminate redundancy by defining specific classes which encapsulate business logic, state and relationships. As the domain concepts change, so to do the implementations of the Domain Models. </p>
<h3>Value Objects (VOs)</h3>
<p>As the name implies, a Value Object, more commonly referred to as a VO, is an object which simply provides values. VOs are entirely immutable; that is, all properties of a VO are read-only and assignments to those properties are specified only during object construction; after which, the properties of the VO can not be modified and, by design, should not require changes.</p>
<p>VOs are typically used to provide an aggregation of conceptually related properties whose values describe the state of the object when instantiated and do not require any real concept of identity or uniqueness. While there are some edge cases (such as validation), more commonly than not, VOs do not implement any specific behavior. Conceptually, think of a VO as being nothing more than an object which holds a value or series of related values which describe something about the object when created. A typical example of a VO could be a UserLogin object which simply holds the values of the specified username and password when created. It is important to make the distinction between a VO and a Domain Model as, a VO is not a Model, but rather, a VO is nothing more than an object which holds values and could be used to describe any context.  </p>
<h3>And that&#8217;s it</h3>
<p>Hopefully the above descriptions of both Domain Models and Value Objects will clear up any confusion surrounding the two concepts; ideally, making it easier to understand when to use each. </p>
<p>The point to keep in mind is that <b>Domain Models</b> simply <em>model</em> the domain, while <b>VOs</b> simply describe a contextual state.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2010/12/05/domain-models-and-value-objects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Guiding Design with Behavior Verification and Mock Objects</title>
		<link>http://www.ericfeminella.com/blog/2010/11/24/guiding-design-with-behavior-verification-and-mock-objects/</link>
		<comments>http://www.ericfeminella.com/blog/2010/11/24/guiding-design-with-behavior-verification-and-mock-objects/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 13:00:43 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Object Oriented Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=1246</guid>
		<description><![CDATA[At some point every developer who has disciplined themselves in the ritualistic like art and science of Test Driven Development soon discovers that the collaborators on which a class under test depend introduce an additional layer of complexity to consider when writing your tests &#8211; and designing your APIs. For example, consider a simple test [...]]]></description>
			<content:encoded><![CDATA[<p>At some point every developer who has disciplined themselves in the ritualistic like art and science of <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">Test Driven Development</a> soon discovers that the collaborators on which a class under test depend introduce an additional layer of complexity to consider when writing your tests &#8211; and designing your APIs.</p>
<p>For example, consider a simple test against a class <code>Car</code> which has an instance of class <code>Engine</code>. <code>Car</code> implements a <code>start</code> method which, when invoked, calls the <code>Engine</code> object&#8217;s <code>run</code> method. The challenge here lies in testing the dependency <code>Car</code> has on <code>Engine</code>, specifically, how one verifies that an invocation of <code>Car.start</code> results in the <code>Engine</code> object&#8217;s <code>run</code> method being called.</p>
<p>There are two ways of testing the above example of <code>Car</code>, which in unit testing nomenclature is called the <a href="http://xunitpatterns.com/SUT.html" target="_blank">System Under Test</a> (SUT), and it&#8217;s <code>Engine</code> instance which is <code>Car's</code> <a href="http://xunitpatterns.com/DOC.html" target="_blank">Depended-on Component</a> (DOC). The most common approach is to define assertions based on the state of both the SUT and it&#8217;s DOC after being exercised. This style of testing is commonly referred to as <a href="http://xunitpatterns.com/State%20Verification.html" target="_blank">State Verification</a>, and is typically the approach most developers initially use when writing tests.</p>
<p>Using the above Car example, a typical State Verification test would be implemented as follows:<br />
</p>
<div class="dean_ch" style="white-space: wrap;">
<p><span class="kw3">public</span> <span class="kw2">class</span> CarTest<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">var</span> _car:Car = <span class="kw2">null</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Before<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">function</span> setUp<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_car = <span class="kw2">new</span> Car<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Test<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">function</span> testStart<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_car.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;assertTrue<span class="br0">&#40;</span> _car.<span class="me1">isStarted</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;assertTrue<span class="br0">&#40;</span> _car.<span class="me1">engine</span>.<span class="me1">isRunning</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>After<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">function</span> tearDown<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_car = <span class="kw2">null</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p><strong><em>Figure 1</em></strong>. CarTest, State Verification.</p>
<p>From a requirements perspective and therefore a testing and implementation perspective as well, the expectation of calling <code>start</code> on <code>Car</code> is that it will A.) change it&#8217;s running state to true, and B.) invoke <code>run</code> on it&#8217;s <code>Engine</code> instance. As you can see in <em>Figure 1</em>, in order to test the start method on <code>Car</code> the <code>Engine</code> object must also be tested. In the example, using the State Verification style of testing, <code>Car</code> exposes the <code>Engine</code> instance in order to allow the state of <code>Engine</code> to be verified. This has lead to a less than ideal design as it breaks encapsulation and violates <a href="http://www.ericfeminella.com/blog/?s=Principle+of+Least+Knowledge&#038;x=0&#038;y=0" target="_blank">Principle of Least Knowledge</a>. Obviously, a better design of <code>Car.isStarted</code> could be implemented such that it determines if it&#8217;s <code>Engine</code> instance is also in a running state; however, realistically, <code>Engine.run</code> will likely need to do more than just set its running state to true; conceivable, it could need to do much, much more. More importantly, while testing <code>Car</code> one should only be concerned with the state and behavior of <code>Car</code> &#8211; and not that of its dependencies. As such, it soon becomes apparent that what really needs to be tested with regards to <code>Engine</code> in <code>Car.start</code> is that <code>Engine.run</code> is invoked, and nothing more.</p>
<p>With this in mind, the implementation details of <code>Engine.run</code> are decidedly of less concern when testing <code>Car</code>; in fact, a &#8220;real&#8221; concrete implementation of <code>Engine</code> need not even exist in order to test <code>Car</code>; only the contract between <code>Car</code> and <code>Engine</code> should be of concern. Therefore, State Verification alone is not sufficient for testing <code>Car.start</code> as, at best, this approach unnecessarily requires a real <code>Engine</code> implementation or, at worst, as illustrated in <em>Figure 1</em>, can negatively guide design as it would require exposing the DOC in order to verify its state; effectively breaking encapsulation and unnecessarily complicating implementation. To reiterate an important point: State Verification requires an implementation of <code>Engine</code> and, assuming <a href="http://www.extremeprogramming.org/rules/testfirst.html" target="_blank">Test First</a> is being followed (ideally, it is), the concern when testing <code>Car</code> should be focused exclusively on <code>Car</code> and it&#8217;s interactions with its DOC; not on their specific implementations. And this is where the second style of testing &#8211; <strong>Behavior Verification</strong> &#8211; plays an important role in TDD.</p>
<p>The <a href="http://xunitpatterns.com/Behavior%20Verification.html" target="_blank">Behavior Verification</a> style of testing relies on the use of <a href="http://www.mockobjects.com/" target="_blank">Mock Objects</a> in order to test the expectations of an SUT; that is, that the expected methods are called on it&#8217;s DOC with the expected parameters. Behavior Verification is most useful where State Verification alone would otherwise negatively influence design by requiring the implementation of needless state if only for the purpose of providing a more convenient means of testing. For example, many times an object may not need to be stateful or the behavior of an object may not always require a change in it&#8217;s state after exercising the SUT. In such cases, Behavior Verification with Mock Objects will lead to a simpler, more cohesive design as it requires careful design considerations of the SUT and it&#8217;s interactions with its DOC. A rather natural side-effect of this is promoting the use of interfaces over implementations as well as maintaining encapsulation.</p>
<p>For testing with Behavior Verification in Flex, there are numerous <a href="http://en.wikipedia.org/wiki/List_of_mock_object_frameworks" target="_blank">Mock Object frameworks</a> available, all of which are quite good in their own right and more or less provide different implementations of the same fundamental concepts. To name just a few, in no particular order, there are <a href="http://asmock.sourceforge.net/" target="_blank">asMock</a>, <a href="http://bitbucket.org/loomis/mockito-flex/wiki/Home" target="_blank">mockito-flex</a>, <a href="http://mockolate.org/" target="_blank">mockolate</a> and <a href="http://code.google.com/p/mock4as/" target="_blank">mock4as</a>.</p>
<p>While any of the above Mock Testing Frameworks will do, for the sake of simplicity I will demonstrate re-writing the <code>Car</code>test using Behavior Verification based on mock4as &#8211; if for nothing other than the fact that it requires implementing the actual Mock, which helps illustrate how everything comes together. Moreover, the goal of this essay is to help developers understand the design concepts surrounding TDD with Behavior Verification and Mock Objects by focusing on the basic design concepts; not the implementation specifics of any individual Mock Framework.</p>
<p></p>
<div class="dean_ch" style="white-space: wrap;">
<p><span class="kw3">public</span> <span class="kw2">class</span> CarTest<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">var</span> _car:Car = <span class="kw2">null</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">private</span> <span class="kw2">var</span> _mock:MockEngine = <span class="kw2">null</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Before<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">function</span> setUp<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_mock = <span class="kw2">new</span> MockEngine<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_car &nbsp;= <span class="kw2">new</span> Car<span class="br0">&#40;</span> _mock <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Test<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">function</span> testStartChangesState<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_car.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;assertTrue<span class="br0">&#40;</span> _car.<span class="me1">isRunning</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>Test<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">function</span> testStartInvokesEngineRun<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_mock.<span class="me1">expects</span><span class="br0">&#40;</span> <span class="st0">&quot;run&quot;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_car.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;assertTrue<span class="br0">&#40;</span>_mock.<span class="me1">errorMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_mock.<span class="me1">success</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>After<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">function</span> tearDown<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_mock = <span class="kw2">null</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_car &nbsp;= <span class="kw2">null</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p><strong><em>Figure 2</em></strong>. CarTest, Behavior Verification approach.</p>
<p>Let&#8217;s go through what has changed in <code>CarTest</code> now that it leverages Behavior Verification. First, <code>Car's</code> constructor has been refactored to require an <code>Engine</code> object, which now implements an <code>IEngine</code> interface, which is defined as follows.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw3">public</span> <span class="kw3">interface</span> IEngine<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span>;<br />
<span class="br0">&#125;</span></div>
<p><strong><em>Figure 3</em></strong>. IEngine interface.</p>
<p>Note <code>Engine.isRunning</code> is no longer tested, or even defined as, it is simply not needed when testing <code>Car</code>: only the call to <code>Engine.run</code> is to be verified in the context of calling <code>Car.start</code>. Since focus is exclusively on the SUT, only the interactions between <code>Car</code> and <code>Engine</code> are of importance and should be defined. The goal is to focus on the testing of the SUT and not be distracted with design or implementation details of it&#8217;s DOC outside of that which is needed by the SUT.</p>
<p><code>MockEngine</code> provides the actual implementation of <code>IEngine</code>, and, as you may have guessed, is the actual Mock object implementation of <code>IEngine</code>. <code>MockEngine</code> simply serves to provide a means of verifing that when <code>Car.start</code> is exercised it successfully invokes <code>Engine.run</code>; effectively satisfiying the contract between <code>Car</code> and <code>Engine</code>. <code>MockEngine</code> is implemented as follows:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw3">import</span> org.<span class="me1">mock4as</span>.<span class="me1">Mock</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">class</span> MockEngine <span class="kw3">extends</span> Mock <span class="kw3">implements</span> IEngine<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; record<span class="br0">&#40;</span> <span class="st0">&quot;run&quot;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p><strong><em>Figure 4</em></strong>. MockEngine implementation.</p>
<p><code>MockEngine</code> extends <code>org.mock4as.Mock</code> from which it inherits all of the functionality needed to &#8220;Mock&#8221; an object, in this case, an <code>IEngine</code> implementation. You&#8217;ll notice that <code>MockEngine.run</code> does not implement any &#8220;real&#8221; functionality, but rather it simply invokes the inherited <code>record</code> method, passing in the method name to record for verification when called. This is the mechanism which allows a <code>MockEngine</code> instance to be verified once <code>run</code> is invoked.</p>
<p><code>CarTest</code> has been refactored to now provide two distinct tests against <code>Car.start</code>. The first, <code>testStartChangesState()</code>, provides the State Verification test of <code>Car</code>; which tests the expected state of <code>Car</code> after being exercised. The second test, <code>testStartInvokesEngineRun()</code>, provides the actual Behavior Verification test which defines the expectations of the SUT and verification of those expectations on the DOC; that is, Behavior Verification tests are implemented such that they first define expectations, then exercise the SUT, and finally, verify that the expectations have been met. In effect, this verifies that the contract between an SUT and its DOC has been satisfied.</p>
<p>Breaking down the <code>testStartInvokesEngineRun()</code> test, it is quite easy to follow the steps used when writing a Behavior Verification test.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="br0">&#91;</span>Test<span class="br0">&#93;</span><br />
<span class="kw3">public</span> <span class="kw2">function</span> testStartInvokesEngineStart<span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">void</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">// Set expectations on the mock; essentially, what</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">// method the SUT is expected to invoke on it&#8217;s DOC</span><br />
&nbsp; &nbsp; &nbsp; _mock.<span class="me1">expects</span><span class="br0">&#40;</span> <span class="st0">&quot;run&quot;</span> <span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span class="co1">// Exercise the SUT</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;_car.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span class="co1">// Verify expectations have been met</span><br />
&nbsp; &nbsp; &nbsp; assertTrue<span class="br0">&#40;</span>_mock.<span class="me1">errorMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, mock.<span class="me1">success</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>And that&#8217;s basically it. While much more can be accomplished with the many Mock Testing frameworks available for Flex, and plenty of information is available on the specifics of the subject, this essay quite necessarily aims to focus on the design benefits of testing with Behavior Verification; that is, the design considerations one must make while doing so. </p>
<p>With Behavior Verification and Mock Objects, design can be guided into existence based on necessity rather than pushed into existence based on implementation.</p>
<p>The example can be downloaded <a href="http://code.ericfeminella.com/downloads/MockObjectsExample.fxp" target="_blank">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2010/11/24/guiding-design-with-behavior-verification-and-mock-objects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bindable Map</title>
		<link>http://www.ericfeminella.com/blog/2010/10/18/bindable-map/</link>
		<comments>http://www.ericfeminella.com/blog/2010/10/18/bindable-map/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 14:00:48 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Object Oriented Design]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=1117</guid>
		<description><![CDATA[Recently I was going through some old drafts I had pending when I happened to notice I had never published this one, so I am finally doing so now&#8230; Since first publishing an AS3 HashMap implementation back in December of 2006, much to my surprise the original post through which I released the API still [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I was going through some old drafts I had pending when I happened to notice I had never published this one, so I am finally doing so now&#8230;</p>
<p>Since first publishing an AS3 <a href="http://code.ericfeminella.com/classes/as3/HashMap.as.html" target="_blank">HashMap</a> implementation back in <a href="http://www.ericfeminella.com/blog/2006/12/" target="_blank">December of 2006</a>, much to my surprise the <a href="http://www.ericfeminella.com/blog/2006/12/05/as3-hashmap-for-flex/" target="_blank">original post</a> through which I released the API still yields a good amount of feedback each month.</p>
<p>In the time since I have extended the functionality of the HashMap to include a <a href="http://www.ericfeminella.com/blog/2008/03/09/localpersistence-map/" target="_blank">LocalPersistenceMap</a> and <a href="http://www.ericfeminella.com/blog/2008/02/08/as3-resourcemap-api/" target="_blank">ResourceMap</a> in addition to the original HashMap; all of which implement the <a href="http://code.ericfeminella.com/classes/as3/IMap.as.html" target="_blank">IMap</a> interface and can be used interchangeably by client code.</p>
<p>The single most requested feature I have received has by far been to provide a <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_8.html" target="_blank">Bindable</a> HashMap implementation, and, just recently, I decided to implement one and share it with the community. </p>
<p>The implementation of the <a href="http://code.ericfeminella.com/classes/as3/BindableMap.as.html" target="_blank">BindableMap</a> is quite straightforward as it simply provides an API which wraps an IMap implementation in order to facilitate data binding capabilities to all read methods of the underlying Map. </p>
<p>Using the various IMap implementations with BindableMap yields some interesting possibilities; specifically when using BindableMap with LocalPersistenceMap as it essentially provides a bindable implementation of a LocalSharedObject, as can be seen in the following example  (e.g. add some values and refresh the page):</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_BindableHashMapExample_1452241838"
			class="flashmovie"
			width="400"
			height="400">
	<param name="movie" value="http://www.ericfeminella.com/blog/resources/flex/BindableHashMapExample/BindableHashMapExample.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.ericfeminella.com/blog/resources/flex/BindableHashMapExample/BindableHashMapExample.swf"
			name="fm_BindableHashMapExample_1452241838"
			width="400"
			height="400">
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>You can download the source, binary and example <a href="http://code.ericfeminella.com/opensource/flex/apis/as3-hashmap.zip" target="_blank">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2010/10/18/bindable-map/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Misplaced Code</title>
		<link>http://www.ericfeminella.com/blog/2010/05/31/misplaced-code/</link>
		<comments>http://www.ericfeminella.com/blog/2010/05/31/misplaced-code/#comments</comments>
		<pubDate>Mon, 31 May 2010 14:05:55 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Code Review]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Object Oriented Design]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=802</guid>
		<description><![CDATA[Often I come across what I like to call &#8220;Misplaced Code&#8221;, that is, code which should be refactored to a specific, independent concern rather than mistakenly being defined in an incorrect context. For instance, consider the following example to get a better idea of what I mean: var url:String = Application.application.url; if &#40; url.indexOf&#40; &#34;localhost&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>Often I come across what I like to call &#8220;Misplaced Code&#8221;, that is, code which should be refactored to a specific, independent concern rather than mistakenly being defined in an incorrect context. </p>
<p>For instance, consider the following example to get a better idea of what I mean:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">var</span> <span class="kw3">url</span>:<span class="kw3">String</span> = Application.<span class="me1">application</span>.<span class="kw3">url</span>;</p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">url</span>.<span class="kw3">indexOf</span><span class="br0">&#40;</span> <span class="st0">&quot;localhost&quot;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&#8230;<br />
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">url</span>.<span class="kw3">indexOf</span><span class="br0">&#40;</span> <span class="st0">&quot;dev&quot;</span> <span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&#8230;<br />
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">url</span>.<span class="kw3">indexOf</span><span class="br0">&#40;</span> <span class="st0">&quot;staging&quot;</span> <span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&#8230;<br />
<span class="br0">&#125;</span><br />
etc&#8230;</div>
<p>Taking the above example into a broader context, it is quite common to see code such as this scattered throughout a codebase; particularly in the context of view concerns. At best this could become hard to maintain and, at worst, it will result in unexpected bugs down the road. In most cases (as in the above example) the actual code itself is not necessarily bad, however it is the context in which it is placed which is what I would like to highlight as it will almost certainly cause <a href="http://www.martinfowler.com/bliki/TechnicalDebt.html" target="_blank">technical debt</a> to some extent.</p>
<p>Considering the above example, should code such as this become redundantly implemented throughout a codebase it is quite easy to see how it can become a maintenance issue as, something as simple as a change to a hostname would require multiple refactorings. A much more appropriate solution would be to encapsulate this logic within a specific class whose purpose is to provide a facility from which this information can be determined. In this manner unnecessary redundancy would be eliminated (as well as risk) and valuable development time would be regained as the code would need only be tested and written once &#8211; in one place. </p>
<p>So again, using the above example, this could be refactored to a specific API and client code would leverage the API as in the following:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">switch</span><span class="br0">&#40;</span> DeploymentContext.<span class="me1">host</span> <span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> DeploymentContext.<span class="me1">LOCAL_HOST</span> :<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8230;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> DeploymentContext.<span class="me1">DEV</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8230;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> DeploymentContext.<span class="me1">STAGING</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8230;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">break</span>;<br />
<span class="br0">&#125;</span></div>
<p>This may appear quite straightforward, however, I have seen examples (this one in particular) in numerous projects over the years and it is worth pointing out. Always take the context to which code is placed into consideration and you will reap the maintenance benefits in the long run.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2010/05/31/misplaced-code/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thoughts on Cairngorm 3</title>
		<link>http://www.ericfeminella.com/blog/2009/10/18/thoughts-on-cairngorm-3/</link>
		<comments>http://www.ericfeminella.com/blog/2009/10/18/thoughts-on-cairngorm-3/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 02:28:06 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.ericfeminella.com/blog/?p=439</guid>
		<description><![CDATA[A week or so prior to MAX, the Cairngorm committee had a rather interesting discussion, during which Alex outlined what the team at Adobe Technical Services had been considering for Cairngorm 3. The meeting was focused on providing everyone with an overview of the collective ideas which Adobe had been gathering internally for some time [...]]]></description>
			<content:encoded><![CDATA[<p>A week or so prior to MAX, the <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm" target="_blank">Cairngorm</a> committee had a rather interesting discussion, during which <a href="http://blogs.adobe.com/auhlmann/" target="_blank">Alex</a>  outlined what the team at Adobe Technical Services had been considering for <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm+3" target="_blank">Cairngorm 3</a>. The meeting was focused on providing everyone with an overview of the collective ideas which Adobe had been gathering internally for some time now, and to also inquire feedback prior to the public announcement of Cairngorm 3.</p>
<p>Prior to the meeting I had anticipated the discussion would be based around a few new patterns and best practices which are currently being advocated, and possibly some additional libraries which help to address recent challenges in RIA development. However, what we discussed was actually quite different &#8211; in a good way.</p>
<p>As you are probably aware by now, Cairngorm 3 is focused around tried and tested best practices and guidelines which aid Flex developers in providing solutions to their day to day RIA challenges. These guidelines are primarily based upon that which has been realized by Adobe Technical Services, and also from the Flex community at large. Teams can leverage these guidelines where applicable to help deliver successful RIAs using frameworks of their choosing. While there may be specific frameworks and libraries recommended in Cairngorm 3, these are just that &#8211; recommendations. There is generally a framework agnostic approach which I must emphasize is highly preferable to that of suggesting one framework over another. This is precisely what I think is needed in the Flex community, for there is rarely a one size fits all approach to software architecture, especially in terms of specific framework implementations. This is a pretty easy concept to comprehend, as, what works for one team, in one context, may not always be appropriate for another team, or in another context.</p>
<p>Cairngorm 3 is a step forward towards what (IMHO) should be a general consensus in the Flex community at large; there are many existing frameworks out there which help address specific problems, with each providing unique qualities and solutions in their own right. This is the kind of thought leadership which helps a community progress and grow; it should be encouraged, as allowing for the shared knowledge of fundamental design principles and guidelines is something which provides value to all Flex developers, regardless of which framework they happen to prefer.</p>
<p>If there is one suggestion I would propose, it would be to have an entirely new name for these collections of best practices, guidelines and general Flex specific solutions. Personally, I would like to see the name Cairngorm (which, after all these years, I still pronounce as Care-in-gorm) refer to the original MVC framework, i.e. the framework implementation itself, as keeping the name the same while undergoing a different direction is bound to cause confusion to some extent. Whatever the new name would be is insignificant as long as the original name of Cairngorm applied to that of the actual framework implementation. This would perhaps be more intuitive as it would allow for the name Cairngorm to be used to describe a concrete framework as a potential solution, just as one could describe other frameworks; e.g. <a href="http://www.springactionscript.org/" target="_blank">Spring ActionScript</a>, <a href="http://mate.asfusion.com/" target="_blank">Mate</a>, <a href="http://swizframework.org/">Swiz</a>, <a href="http://www.spicefactory.org/parsley/">Parsley</a>, <a href="http://www.flexpasta.com/index.php/category/penne-framework/" target="_blank">Penne</a>, <a href="http://www.model-glue.com/flex.cfm" target="_blank">Model-Glue</a>, <a href="http://puremvc.org/" target="_blank">PureMVC</a>, <a href="http://sourceforge.net/projects/flicc/" target="_blank">Flicc</a> etc.</p>
<p>Most importantly, however, is the prospect of choice, as choice is always a good thing. Moreover, an initiative being lead by Adobe in this area sends a very good message to the Flex community as a whole. I happen to leverage a number of different frameworks and patterns which address different problems. As new problems arise, I employ new solutions where existing solutions may not suffice, or develop custom solutions where none are currently available; never blindly choosing one solution over another. However, in every case, there are typically some basic, fundamental guidelines which hold true and can be followed to help drive a design in the right direction. Regular readers of this blog have probably noticed that the basis of the majority of my posts are heavily rooted within these fundamental design principles, as it is from these fundamental design principles and guidelines that developers can utilize the frameworks which work best for them in order to and meet their specific challenges.</p>
<p>Essentially, Software Architecture is all about managing complexity, and there are many fundamental patterns and guidelines which can help developers mange this complexity. The specific framework implementations are of less concern, for it is the understanding of these patterns and principles &#8211; and more importantly, when to apply them, which will ultimately drive the decisions to leverage a one framework over another. In my experience, I have found that the only constant in software architecture is that a pragmatic approach should be taken whenever possible, whereby context is always key, and simplicity is favored as much as possible. Cairngorm 3, I feel, is a nice illustration of this principle. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ericfeminella.com/blog/2009/10/18/thoughts-on-cairngorm-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

