<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Rob Dodson talks internets]]></title>
  <link href="http://robdodson.me/atom.xml" rel="self"/>
  <link href="http://robdodson.me/"/>
  <updated>2013-03-28T09:08:51-07:00</updated>
  <id>http://robdodson.me/</id>
  <author>
    <name><![CDATA[Rob Dodson]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[RequireJS -- Embracing the Awesomness of AMD Modules]]></title>
    <link href="http://robdodson.me/blog/2013/03/21/requirejs-embracing-the-awesomness-of-amd-modules/"/>
    <updated>2013-03-21T21:57:00-07:00</updated>
    <id>http://robdodson.me/blog/2013/03/21/requirejs-embracing-the-awesomness-of-amd-modules</id>
    <content type="html"><![CDATA[<p>Over the past few weeks I put together this talk for my team at GE to help get everyone on the same page with AMD modules. I figured it&#8217;d be cool if I removed any GE specific stuff and open sourced the presentation, so here it is!</p>

<p>The video is around 35 minutes long and there&#8217;s a slide deck available on Github that has clickable links and whatnot. Enjoy!</p>

<iframe width="420" height="315" src="http://www.youtube.com/embed/vWGuaZOTR4U" frameborder="0" allowfullscreen></iframe>


<p><a href="https://github.com/robdodson/requirejs-presentation">Slidedeck on Github</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introduction to Custom Elements]]></title>
    <link href="http://robdodson.me/blog/2013/03/19/custom-elements-intro/"/>
    <updated>2013-03-19T01:21:00-07:00</updated>
    <id>http://robdodson.me/blog/2013/03/19/custom-elements-intro</id>
    <content type="html"><![CDATA[<p><a href="http://robdodson.me/blog/2013/03/17/why-web-components/">In yesterday&#8217;s post</a> I made the case for Web Components so today let&#8217;s dive back in and look at Custom Elements.</p>

<!--more-->


<h2>So, what are Custom Elements?</h2>

<p>The <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html">W3C Introduction to Web Components</a> defines Custom Elements as follows:</p>

<blockquote><p>custom elements let authors define their own elements, including new presentation and API, that can be used in HTML documents</p></blockquote>

<p>To translate that a little bit, consider that every HTML tag inherits from <a href="https://developer.mozilla.org/en-US/docs/DOM/HTMLElement">HTMLElement</a>. Often in the W3C specs they&#8217;ll shorthand that and refer to items in the DOM as just &#8220;element&#8221; or &#8220;elements&#8221;. So what this is basically saying is that the custom elements spec lets you define <em>new</em> HTMLElements, which is kind of like saying you get to define new HTML tags. Technically it has always been possible to create your own HTML tags by shimming the browser, this is in fact how <a href="need%20link">HTML5shim</a> makes legacy browsers recognize HTML5 tags, but these tags weren&#8217;t really first class citizens. Which is to say, they <em>could</em> work as containers but if they needed to do anything else like spit out some custom DOM (think the <code>&lt;video&gt;</code> tag or an <code>&lt;input&gt;</code> field) then that wasn&#8217;t going to just magically happen. You&#8217;d have to write some custom javascript for that and somehow trigger it on the page.</p>

<p>Custom elements solves these issues by letting you define new markup which can then have a whole lifecycle of events, unique styles that are only scope to the element and additional (hidden) HTML markup.</p>

<h2>Defining a new Custom Element</h2>

<p>It&#8217;s probably easier to grok all of this if you just see some example code. Let&#8217;s look at the proposed markup for defining a new custom element.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;x-dropdown-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  …
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The W3C definition of this is painfully muddled:</p>

<p>&#8220;The element element defines a custom element. It specifies the type of element it&#8217;s a refinement of using the extends attribute.&#8221;</p>

<p>To translate, you create an element tag, give it a unique identifier with <code>name</code> and specify which tag you&#8217;re extending. All custom elements <em>must</em> extend an existing tag and ideally it should be a tag that they closely relate to. In this case we&#8217;re creating a new custom element called <code>x-dropdown-button</code> which extends <code>&lt;button&gt;</code>. The docs suggest that if you don&#8217;t have a closely related tag that you should just extend <code>&lt;div&gt;</code> or <code>&lt;span&gt;</code> since (at a minimum) you know that your element is related to a container of some sort. As a fallback legacy browsers will then use the original tag and at least render something that is close to your intent. Maybe IE8 won&#8217;t get a <code>x-dropdown-button</code> but at least it&#8217;ll get a <code>button</code>.</p>

<h2>Defining Custom Elements with Templates</h2>

<p>If you recall I said that Custom Elements can define additional markup, similar to the <code>&lt;video&gt;</code> tag or an <code>&lt;input&gt;</code> field. This markup is specified through the use of a <code>&lt;template&gt;</code> tag. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;x-dropdown-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;template&gt;</span>
</span><span class='line'>    <span class="nt">&lt;content&gt;&lt;/content&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;dropdown&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;dropdown-menu&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Another action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Something else here<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/template&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If a custom element includes a template then it will be cloned into that element&#8217;s <strong>shadow DOM</strong> when the browser parses the tag. We haven&#8217;t talked much about shadow DOM yet but for now just think of it as markup that&#8217;s <em>rendered</em> on the page but not inspectable by the client.</p>

<p>Any content that would normally live inside of the extended tag ends up inside of the <code>&lt;content&gt;</code> tag in the template. For instance if we extended <code>&lt;button&gt;Hello World&lt;/button&gt;</code> then &#8220;Hello World&#8221; would end up in the <code>&lt;content&gt;</code> tag.</p>

<p>In addition to markup the template can include styles that are scoped only to the custom element. Here&#8217;s the same example from above with the addition of a scoped style tag.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;x-dropdown-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;template&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style </span><span class="na">scoped</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nc">.dropdown-menu</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">font-size</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>        <span class="k">color</span><span class="o">:</span> <span class="m">#CCC</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>    <span class="nt">&lt;content&gt;&lt;/content&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;dropdown&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;dropdown-menu&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Another action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Something else here<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/template&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The CSS used in the scoped style tag will not affect anything else on the page so you can have your own <code>.dropdown-menu</code> classes and they won&#8217;t conflict with the component. The component author <em>can</em> expose style hooks for the consumer to alter the appearance of the element through the use of the new <code>pseudo</code> attribute.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;x-dropdown-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;template&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style </span><span class="na">scoped</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nc">.dropdown-menu</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">font-size</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>        <span class="k">color</span><span class="o">:</span> <span class="m">#CCC</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>    <span class="nt">&lt;content&gt;&lt;/content&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;dropdown&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;dropdown-menu&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li</span> <span class="na">pseudo=</span><span class="s">&quot;x-dropdown-item&quot;</span><span class="nt">&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li</span> <span class="na">pseudo=</span><span class="s">&quot;x-dropdown-item&quot;</span><span class="nt">&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Another action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li</span> <span class="na">pseudo=</span><span class="s">&quot;x-dropdown-item&quot;</span><span class="nt">&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Something else here<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/template&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>elsewhere in a style.css you could say:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nt">x-dropdown-button</span><span class="o">:</span><span class="nd">:x-dropdown-item</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">background-color</span><span class="o">:</span> <span class="nb">blue</span><span class="p">;</span>
</span><span class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">40px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Using Custom Elements in Markup</h2>

<p>Using a custom element is really straightforward thanks to the new <code>is</code> attribute. To use our new dropdown-button from above would just be:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;button</span> <span class="na">is=</span><span class="s">&quot;x-dropdown-button&quot;</span><span class="nt">&gt;</span>Hey I&#39;m a dropdown!<span class="nt">&lt;/button&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Easy, right?</p>

<p>You can also create custom element in script like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">btn</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;x-dropdown-button&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">alert</span><span class="p">(</span><span class="nx">btn</span><span class="p">.</span><span class="nx">outerHTML</span><span class="p">);</span> <span class="c1">// will display &#39;&lt;button is=&quot;x-dropdown-button&quot;&gt;&lt;/button&gt;&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also you can specify a <code>constructor</code> attribute and then use it to create new instances of your element.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;x-dropdown-button&quot;</span> <span class="na">constructor=</span><span class="s">&quot;DropdownButton&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  …
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span><span class='line'>
</span><span class='line'>var btn = new DropdownButton();
</span><span class='line'>document.body.appendChild(b);
</span></code></pre></td></tr></table></div></figure>


<p>Additionally you can add methods and properties to this constructor and call them later:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;x-dropdown-button&quot;</span> <span class="na">constructor=</span><span class="s">&quot;DropdownButton&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script&gt;</span>
</span><span class='line'>  <span class="nx">DropdownButton</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">open</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="s2">&quot;Hey I&#39;m open!&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="nx">DropdownButton</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">close</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="s2">&quot;Aw dang I&#39;m closed...&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span><span class='line'>
</span><span class='line'>…
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">btn</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">DropdownButton</span><span class="p">();</span>
</span><span class='line'>    <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">btn</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">b</span><span class="p">.</span><span class="nx">open</span><span class="p">();</span> <span class="c1">// alerts &quot;Hey I&#39;m open!&quot;</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Constructors are attached to the <code>window</code> object, but if you don&#8217;t want to pollute that scope you can use the <code>generatedConstructor</code> property:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;table&quot;</span> <span class="na">name=</span><span class="s">&quot;x-chart&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="c1">// …</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">DropdownButton</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">generatedConstructor</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">DropdownButton</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">open</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span>
</span><span class='line'>    <span class="c1">// …</span>
</span><span class='line'>  <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Support</h2>

<p>Unfortunately, at least to my knowledge, custom elements are not currently supported in any major browsers. However Chrome has added support for 2 of the 4 Web Components standards in their last two releases so I can&#8217;t help but think that custom elements are right around the corner. One thing I didn&#8217;t touch on very much in this post was shadow DOM which currently <strong>is</strong> supported in Chrome so tomorrow I&#8217;ll talk about that technology. Till then!</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why Web Components?]]></title>
    <link href="http://robdodson.me/blog/2013/03/17/why-web-components/"/>
    <updated>2013-03-17T17:48:00-07:00</updated>
    <id>http://robdodson.me/blog/2013/03/17/why-web-components</id>
    <content type="html"><![CDATA[<p>Yesterday I did a post on the HTML5 <code>&lt;template&gt;</code> tag which is part of the new <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html#custom-element-section">Web Components standard.</a> I didn&#8217;t go into a ton of explanation as to why I&#8217;m so interested with this spec and I think jumping right to the <code>&lt;template&gt;</code> tag was probably pretty confusing for folks who don&#8217;t have the same needs as me. I want to back up a bit and present a high level overview of Web Components and then illustrate why this is such an important concept.</p>

<!--more-->


<h2>So, what are Web Components?</h2>

<p>Web Components are actually a group of standards which all fall under the same umbrella. The W3C does a good job of giving a high level overview in their <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html">Introduction to Web Components</a> article. Here&#8217;s a quote from the introduction (emphasis is mine):</p>

<p style="text-align: center;">**</p>


<p>&#8220;The component model for the Web (also known as Web Components) consists of four pieces designed to be used together <strong>to let web application authors define widgets with a level of visual richness not possible with CSS alone, and ease of composition and reuse not possible with script libraries today.</strong></p>

<p>These pieces are:</p>

<ul>
<li><p><strong>templates</strong>, which define chunks of markup that are inert but can be activated for use later;</p></li>
<li><p><strong>decorators</strong>, which apply templates to let CSS affect rich visual and behavioral changes to documents;</p></li>
<li><p><strong>custom elements</strong>, which let authors define their own elements, including new presentation and API, that can be used in HTML documents; and</p></li>
<li><p><strong>shadow DOM</strong> which defines how presentation and behavior of decorators and custom elements fit together in the DOM tree.</p></li>
</ul>


<p>Both decorators and custom elements are called <strong>components.</strong>&#8221;</p>

<p>&#8211; <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html#custom-element-section">Introduction to Web Components</a></p>

<p style="text-align: center;">**</p>


<p>In summary there are two kinds of &#8220;components&#8221;: <strong>custom elements</strong> and <strong>decorators</strong>.</p>

<p><strong>Custom elements</strong> let you define new <a href="https://developer.mozilla.org/en-US/docs/DOM/HTMLElement">HTMLElements</a>, kind of like creating new tags, and <strong>decorators</strong> let you augment existing tags by injecting additional markup and styles via CSS selectors. Both custom elements and decorators leverage <strong>templates</strong> and <strong>shadow DOM</strong> to encapsulate their markup and styles.</p>

<p>To visualize this process think about the iframe that holds a Facebook Like button. The Like button encapsulates all of its markup and styles inside the iframe so it doesn&#8217;t mess up anything on your page. Unfortunately there are a few downsides to this approach. For starters you have to make an http request to load the content of the iframe, so you would never want to build your entire site out of iframe&#8217;d components. Also, the Like button doesn&#8217;t expose much of an API for you to change its appearance. While that&#8217;s not a huge deal for a Facebook Like button, it is if you&#8217;re using a more generic component like a slider or dropdown.</p>

<p>In an ideal world you could have a <em>framework</em> of components which hide their markup but expose an API to alter their appearance. Imagine if this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="c">&lt;!-- Bootstrap Dropdown --&gt;</span>
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;dropdown&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;dropdown-menu&quot;</span> <span class="na">role=</span><span class="s">&quot;menu&quot;</span> <span class="na">aria-labelledby=</span><span class="s">&quot;dLabel&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Another action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">tabindex=</span><span class="s">&quot;-1&quot;</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Something else here<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>was just this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">is=</span><span class="s">&quot;x-dropdown&quot;</span> <span class="na">class=</span><span class="s">&quot;fancy&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>and you&#8217;re most of the way there.</p>

<h2>It&#8217;s (probably) not for apps. It&#8217;s for frameworks.</h2>

<p>Unless you&#8217;re trying to write a UI Framework like the next Bootstrap, you can probably ignore the underpinnings of how Web Components are produced. At present we have the <code>&lt;video&gt;</code> tag which basically uses all of the technologies listed above. Do you care what its template and shadow DOM look like? Not really. You just want to say:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;video</span> <span class="na">autoplay=</span><span class="s">&quot;true&quot;</span> <span class="na">controls</span> <span class="na">src=</span><span class="s">&quot;path/to/video&quot;</span><span class="nt">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>to spit out your awesome player. Think of the cognitive load that you could unburden yourself of if <em>all</em> UI Frameworks had the same abilities as <code>&lt;video&gt;</code>!</p>

<p>A page might look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;nav</span> <span class="na">is=</span><span class="s">&quot;x-bootstrap-navbar&quot;</span> <span class="na">sticky</span><span class="nt">&gt;&lt;/nav&gt;</span>
</span><span class='line'><span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span> <span class="na">role=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="c">&lt;!-- mixing Foundation and Bootstrap! --&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">is=</span><span class="s">&quot;x-foundation-alert&quot;</span> <span class="na">class=</span><span class="s">&quot;success&quot;</span><span class="nt">&gt;</span>Hey you succeeded!<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;table</span> <span class="na">is=</span><span class="s">&quot;x-datatables&quot;</span> <span class="na">ascending</span> <span class="na">src=</span><span class="s">&quot;path/to/data.json&quot;</span><span class="nt">&gt;&lt;/table&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">is=</span><span class="s">&quot;x-bootstrap-pagination&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/section&gt;</span>
</span><span class='line'><span class="nt">&lt;footer</span> <span class="na">is=</span><span class="s">&quot;x-bootstrap-footer&quot;</span><span class="nt">&gt;&lt;/footer&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>instead of hundreds of lines of markup rubber stamped over and over again. Even if you take the repetative markup and place it inside a template engine like handlebars you still can&#8217;t mix and match UI Frameworks like Bootstrap and Foundation without running into some serious risks. Web Components hope to solve both of these problems and open up a much more declarative authoring process.</p>

<p>Hopefully tomorrow I can dig into Custom Elements more and provide some concrete examples knitting all of these concepts together. Thanks for reading!</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HTML5 Template Tag: Introduction]]></title>
    <link href="http://robdodson.me/blog/2013/03/16/html5-template-tag-introduction/"/>
    <updated>2013-03-16T09:51:00-07:00</updated>
    <id>http://robdodson.me/blog/2013/03/16/html5-template-tag-introduction</id>
    <content type="html"><![CDATA[<p>If you&#8217;ve been following the Google Chrome release announcements you may have noticed some interesting terms popping up as of late. Phrases like &#8220;Shadow DOM&#8221;, &#8220;Custom Elements&#8221; and &#8220;Template&#8221;. These are all part of a new standard referred to as Web Components and the latest versions of Chrome are starting to implement them. Basically a Web Component is an encapsulated bit of markup, styles and script that allow you to reuse widgets across your page without worrying about accidental collisions. For a practical example consider Twitter Bootstrap and its myriad of buttons, dropdowns and badges. Bootstrap comes with <em>a lot</em> of CSS which means, right out of the gate, there are a ton of class names which you probably shouldn&#8217;t use for your own elements. Want to define a class of <code>.container</code>? Too bad, Bootstrap already uses that name. Want to upgrade Bootstrap in a few months? OK, but you need to double check that none of their new classes conflict with any of yours. Kind of a pain, right? Wouldn&#8217;t it be awesome if you could use all the little widgets from Bootstrap and not worry at all about possible collisions? Well, that&#8217;s what Web Components are trying to solve and so today I want to look at one part of the Web Components standard: The Template Tag.</p>

<!--more-->


<h2>Feature Detection</h2>

<p>The &lt;template&gt; tag is currently only supported in Chrome 26 so you&#8217;ll need to either run these examples in Chrome Canary or (if it&#8217;s the future) a version of Chrome/FF/Whatever that supports &lt;template&gt;. Here&#8217;s a little feature dection script I stole from the <a href="http://www.html5rocks.com/en/tutorials/webcomponents/template/">HTML5Rocks article</a> on <code>&lt;template&gt;</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;h3</span> <span class="na">class=</span><span class="s">&quot;template-detection&quot;</span><span class="nt">&gt;</span>Does your browser support <span class="ni">&amp;lt;</span>template<span class="ni">&amp;gt;</span>: <span class="nt">&lt;/h3&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">supportsTemplate</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s1">&#39;content&#39;</span> <span class="k">in</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;template&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.template-detection&#39;</span><span class="p">).</span><span class="nx">append</span><span class="p">(</span><span class="nx">supportsTemplate</span><span class="p">().</span><span class="nx">toString</span><span class="p">().</span><span class="nx">toUpperCase</span><span class="p">());</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<h3 class="template-detection">Does your browser support &lt;template&gt;: </h3>




<script>
  function supportsTemplate() {
    return 'content' in document.createElement('template');
  }

  $('.template-detection').append(supportsTemplate().toString().toUpperCase());
</script>


<h2>Our first template</h2>

<p>There&#8217;s a great <a href="http://www.html5rocks.com/en/tutorials/webcomponents/template/">HTML5Rocks article</a> on the subject of the <code>template</code> tag and I&#8217;m going to steal some of their examples.
Let&#8217;s start by making a template for an image placeholder. We&#8217;re going to use the <a href="http://hhhhold.com/">hhhhold</a> image service which will load in a random image from <a href="http://ffffound.com">ffffound.com</a>. The markup for our template will be pretty simple:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;template</span> <span class="na">id=</span><span class="s">&quot;hhhhold-template&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">&quot;&quot;</span> <span class="na">alt=</span><span class="s">&quot;random hhhhold image&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h3</span> <span class="na">class=</span><span class="s">&quot;title&quot;</span><span class="nt">&gt;&lt;/h3&gt;</span>
</span><span class='line'><span class="nt">&lt;/template&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#hhhhold-template&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">template</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;img&#39;</span><span class="p">).</span><span class="nx">src</span> <span class="o">=</span> <span class="s1">&#39;http://hhhhold.com/350x200&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">template</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;.title&#39;</span><span class="p">).</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s1">&#39;Random image from hhhhold.com&#39;</span>
</span><span class='line'>  <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">cloneNode</span><span class="p">(</span><span class="kc">true</span><span class="p">));</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which would render something like this (remember to view in a browser that supports template):</p>

<div id="hhhold-container"></div>


<p><template id="hhhhold-template">
  <img src="" alt="random hhhhold image">
  <h3 class="title"></h3>
</template></p>

<script>
  var template = document.querySelector('#hhhhold-template');
  template.content.querySelector('img').src = 'http://hhhhold.com/350x200';
  template.content.querySelector('.title').textContent = 'Random image from hhhhold.com'
  document.querySelector('#hhhold-container').appendChild(template.content.cloneNode(true));
</script>


<p>If you&#8217;ve worked with client-side template libraries like underscore or handelbars the above should look familiar to you. Where underscore and handelbars take advantage of putting their templates inside of <code>&lt;script&gt;</code> tags and changing the <code>type</code> to something like <code>text/x-handlebars-template</code>, the <code>&lt;template&gt;</code> tag doesn&#8217;t need to because it&#8217;s actually part of the HTML5 spec. There are pros and cons to this approach.</p>

<h3>Pros</h3>

<ul>
<li>The content of the template is inert, scripts won&#8217;t run, images won&#8217;t load, audio won&#8217;t play, etc. This means you can have <code>&lt;img&gt;</code> and <code>&lt;script&gt;</code> tags whose <code>src</code> attributes haven&#8217;t been defined yet.</li>
<li>The child nodes of a template are hidden from selectors like <code>document.getElementById()</code> and <code>querySelector()</code> so you won&#8217;t accidentally select them.</li>
<li>You can place the <code>&lt;template&gt;</code> pretty much anywhere on the page and grab it later.</li>
</ul>


<h3>Cons</h3>

<ul>
<li>You can&#8217;t precompile the template into a JS function like you can with other libraries like handlebars.</li>
<li>You can&#8217;t preload the assets referenced by a template (images, sounds, css, js).</li>
<li>You can&#8217;t nest templates inside of one another and have it automagically work. If a template contains another template you&#8217;ll have to activate the child, then activate the parent.</li>
<li>Very little browser support (only Chrome 26 at the time of this writing).</li>
</ul>


<p>Given that list of cons you might say &#8220;Well why would I ever bother with the <code>&lt;template&gt;</code> tag if something like handlebars gives me way more power?&#8221; That&#8217;s a great question because by itself the <code>&lt;template&gt;</code> tag isn&#8217;t so impressive. Its saving grace lies in the fact that it is intended to be used <em>along side</em> the Shadow DOM and Custom Elements to generate a Web Component.</p>

<p>Think back to the story about Bootstrap that I told at the beginning of this post. If all the markup for a Bootstrap button lived inside a template tag then we&#8217;d be one step closer to having a nice encapsulated widget. The next step would be to isolate the styles associated with the button. But I&#8217;ll save that for tomorrow&#8217;s post :)</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[hubot rdio player]]></title>
    <link href="http://robdodson.me/blog/2013/02/10/hubot-rdio-player/"/>
    <updated>2013-02-10T15:24:00-08:00</updated>
    <id>http://robdodson.me/blog/2013/02/10/hubot-rdio-player</id>
    <content type="html"><![CDATA[<p>hubot. How on Earth did we exist without you? Really I feel like I can demarcate my life into two phases: the time before hubot, and all the awesomeness after. For those not in the know, <a href="http://hubot.github.com/">hubot is an amazing chatbot created by the team at Github.</a> Out of the box he has a ton of cool features but once you start digging into <a href="http://hubot-script-catalog.herokuapp.com/">the hubot scripts catalog</a> things get WAY more interesting.</p>

<p>One of the most exciting projects is <a href="http://zachholman.com/talk/play/">play</a>, a combination iTunes remote and streaming music player. Play lets you broadcast music to everyone on your team and allows anyone in the chatroom to dictate what goes into the queue. Personally, I don&#8217;t use iTunes all that much, opting instead to use <a href="http://www.rdio.com/">rdio</a> for all my music needs. I figured, wouldn&#8217;t it be cool if hubot could do all the same stuff he does for play&#8230;but with rdio! So that&#8217;s what I set out to build.</p>

<!--more-->


<h2>A call for help!</h2>

<p>Let me start by saying that this project is <strong>extremely</strong> rough. I didn&#8217;t intend to release it in this state but I figure the best (and fastest) way to improve it is by opening it up for others to use. The Backbone code is grizzly, the Express code is gnarly, and the things I&#8217;m doing with OAuth might be downright illegal (I&#8217;m an OAuth newb). But—and this is extremely important—it is <strong>super</strong> stable (much to my amazement). My team and I have run it for about 2 weeks and never once managed to crash it. Never needed a reboot or any kind of reset. So while the code might make your face melt, just think of it kinda like the walking dead. The unstoppable, bloodthirsty walking dead. You can hit it with a shovel, poke it in the eye, whatever! It&#8217;ll keep on truckin&#8217;</p>

<h2>Grab the project</h2>

<p>OK let&#8217;s get started. This is going to be a bulleted list kind of thing cuz I&#8217;m sleepy and there&#8217;s about a million steps. Brevity, people!</p>

<ul>
<li><a href="https://github.com/robdodson/hubot-rdio">Find the project here.</a></li>
<li><code>git clone https://github.com/robdodson/hubot-rdio.git</code></li>
</ul>


<h2>Register with rdio</h2>

<ul>
<li>Go <a href="http://developer.rdio.com/docs/read/rest/oauth">here</a></li>
<li>Register</li>
<li>Get a consumer key and consumer secret</li>
<li>Add the secret and key to <code>app.js</code></li>
<li>Go <a href="https://github.com/rdio/hello-web-playback/blob/master/token.js">here</a></li>
<li>Read the instructions</li>
<li>Use <a href="https://github.com/rdio/rdio-python">rdio-python</a> to generate a playback token (I&#8217;ve found this to be a little flaky. If it doesn&#8217;t work for you let me know).</li>
<li>Add playback token to <code>public/js/modules/rdio.js</code> in the <code>flashvars</code> object.</li>
</ul>


<h2>Create your site on Heroku</h2>

<ul>
<li>Follow <a href="https://devcenter.heroku.com/articles/quickstart">the Heroku quickstart</a> if you&#8217;ve never used Heroku before.</li>
<li>Create a new site on Heroku with <code>heroku create</code></li>
<li>Copy the path to your new heroku site, it will look like: zen-jargon-1234.herokuapp.com</li>
<li>Add the path to your site in <code>app.js</code> where it says HEROKU_URL</li>
<li>Add just the domain to <code>public/js/modules/rdio.js</code> in the <code>flashvars</code> object.</li>
<li>Push your site up to Heroku <code>git push heroku master</code></li>
<li>Scale the process <code>heroku ps:scale web=1</code></li>
</ul>


<h2>Add the script to hubot</h2>

<ul>
<li>Copy the <code>hubot/scripts/rdio.coffee</code> file into your hubot&#8217;s <code>scripts</code> folder. Normally you would just install the script from the catalog but I haven&#8217;t submitted yet because it&#8217;s still very rough.</li>
<li>You&#8217;ll need to add 3 environment variables to your hubot

<ul>
<li>HUBOT_RDIO_URL</li>
<li>HUBOT_RDIO_TOKEN</li>
<li>HUBOT_RDIO_SECRET</li>
</ul>
</li>
<li>HUBOT_RDIO_URL is just the path address of your app on heroku (http://zen-jargon-1234.herokuapp.com)</li>
<li>HUBOT_RDIO_TOKEN and HUBOT_RDIO_SECRET are the two parts of your OAuth token. I&#8217;ve left two <code>console.logs</code> for you in <code>app.js</code> at lines 341 and 342. If you go to your app on Heroku and login the console should spit out your OAuth token and secret. Add those to hubot and then remove the <code>logs</code> from <code>app.js</code>.</li>
<li>Push everything to your hubot server</li>
</ul>


<p>To test that everything is working open up your heroku app in Chrome and login. You should see an empty player. From Campfire, tell hubot: <code>hubot play artist deadmau5</code>. Wait a few seconds and the player should fire up. If not, check your terminal or your browser console to see if there are any errors.</p>

<h2>Fire up Nicecast</h2>

<ul>
<li>You&#8217;ll need to purchase Nicecast in order to stream, you can <a href="http://www.rogueamoeba.com/nicecast/">buy it here.</a></li>
<li>Click on <code>Source</code> and choose Chrome or whatever browser you&#8217;re running.</li>
<li>Depending on your machine you&#8217;ll probably want to click on <code>Quality</code> and turn it down. On my Macbook Air I have it set to the 3rd lowest tick.</li>
<li>Click <code>Start Broadcast</code> and Nicecast will tell you it has to restart your browser (lame). Restart the browser, login again and instruct hubot to start playing some music.</li>
<li>Click the <code>Share</code> tab</li>
<li>Copy the link to the .m3u file.</li>
<li>Pass around the .m3u link to your officemates. The easiest way to tune in is with iTunes. Just do File > Open Stream or Advanced > Open Stream and paste in the link.</li>
<li>Dance</li>
</ul>


<p>Holy shit that&#8217;s a lot of steps! Hopefully it all worked, if not <em>please</em> log an issue. kthnxbye</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Debug LESS with Chrome Developer Tools]]></title>
    <link href="http://robdodson.me/blog/2012/12/28/debug-less-with-chrome-developer-tools/"/>
    <updated>2012-12-28T08:32:00-08:00</updated>
    <id>http://robdodson.me/blog/2012/12/28/debug-less-with-chrome-developer-tools</id>
    <content type="html"><![CDATA[<p>If you&#8217;ve spent much time with preprocessors like LESS, SASS/SCSS or Stylus you&#8217;ve probably discovered their one rather crippling flaw: debugging. With thousands of lines of LESS code suddenly turning into even more thousands of lines of CSS it can become nearly impossible to tell where a particular style comes from. Inspecting CSS used to be the domain of the Chrome Developer Tools and Firebug but now that our CSS is machine generated there&#8217;s no longer a link between the style at line 2137 and the LESS file that generated it. Thankfully the Chrome team is addressing this problem but their current focus is on SASS. Today I&#8217;ll teach you how to rework your LESS processor so it plays nice with Chrome and reunites you with your old friend, the CSS inspector.</p>

<!--more-->


<p>Just to whet your appetite here&#8217;s a teaser shot of what we&#8217;re going to accomplish.</p>

<p><img class="center" src="https://s3.amazonaws.com/robdodson/images/less-preview.png" title="'A preview of the Inspector showing LESS debugging'" ></p>

<p>You&#8217;ll notice over on the right instead of your typical <code>style.css: 7</code> it says <code>modules.less: 7</code>. That&#8217;s right, the developer tools are looking at the generated CSS and source mapping it back to the LESS files.</p>

<p><img class="center" src="https://s3.amazonaws.com/robdodson/images/less-preview2.png" title="'The inspector revealing the actual LESS file'" ></p>

<p>Clicking on the line number will actual dive into the LESS file where we can see the nesting, variables and mixins.</p>

<p>&#8220;Awesome!&#8221; you say, but how do we do it?</p>

<p>Well SASS has a debugging feature which will output media-queries above each style. It looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="k">@media</span> <span class="nt">-sass-debug-info</span><span class="p">{</span><span class="nt">filename</span><span class="p">{</span><span class="k">font-family</span><span class="o">:</span><span class="n">file</span><span class="err">\</span><span class="o">:</span><span class="err">\</span><span class="o">/</span><span class="err">\</span><span class="o">/</span><span class="err">\</span><span class="o">/</span><span class="n">Users</span><span class="err">\</span><span class="o">/</span><span class="n">Rob</span><span class="err">\</span><span class="o">/</span><span class="n">Desktop</span><span class="err">\</span><span class="o">/</span><span class="n">less</span><span class="o">-</span><span class="n">debug</span><span class="err">\</span><span class="o">/</span><span class="n">less</span><span class="err">\</span><span class="o">/</span><span class="n">base</span><span class="err">\</span><span class="o">.</span><span class="n">less</span><span class="p">}</span><span class="nt">line</span><span class="p">{</span><span class="k">font-family</span><span class="o">:</span><span class="err">\</span><span class="m">000035</span><span class="p">}}</span>
</span><span class='line'><span class="nt">h1</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">color</span><span class="o">:</span> <span class="m">#999999</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is known as a <strong>source map</strong> and it basically tells a debugging tool how to find its way from the generated output back to the correct source file. Thankfully the current version of Chrome (26, as of this writing) supports source maps for SASS and the current version of LESS (1.3.3, as of this writing) outputs source maps that <em>look</em> like SASS source maps to take advantage of this.</p>

<p><em>Important: If you use less.js to compile your LESS in the browser the techniques we&#8217;ll be covering will not work for you. Unfortunately less.js generates all its output in a big style block at the top of the page and that seems to confuse the dev tools. I wanted to point that out before you spend too much time setting things up.</em></p>

<h2>Setting Up Chrome</h2>

<p>Before we begin make sure you&#8217;re running a version of Chrome that&#8217;s 24 or above. <strong>At present Chrome Canary 28 does not work with this technique so you need to use regular Chrome 24 - 26. I&#8217;m pinging the Chrome dev team to see what&#8217;s up.</strong>.</p>

<p>In the address bar type <code>chrome://flags/</code> and hit enter. You should be transported to a magical place.</p>

<p><img class="center" src="https://s3.amazonaws.com/robdodson/images/chrome-flags.png" title="'The Chrome experiments section'" ></p>

<p>Here we&#8217;ll search for &#8220;Enable Developer Tools experiments&#8221;. When you find it click &#8220;Enable&#8221;. Then <strong>restart Chrome</strong>. Don&#8217;t just close the window, actually quit the program and restart it. Once it&#8217;s reopened fire up the developer tools and click the gear in the bottom right.</p>

<p><img class="center" src="https://s3.amazonaws.com/robdodson/images/chrome-options.png" title="'Chrome Developer tools options'" ></p>

<p>In the left hand sidebar click General. Scroll down to where it says Sources and click &#8220;Enable source maps&#8221;. Again in the sidebar click Experiments, scroll down and enable &#8220;Support for Sass&#8221;.</p>

<p>Now if you&#8217;re just working with SASS then all you have to do is make sure your SASS files generate the proper source maps and you&#8217;re done. <a href="http://bricss.net/post/33788072565/using-sass-source-maps-in-webkit-inspector">Here&#8217;s a great article to walk you through the last couple of steps.</a> But if you&#8217;re like me and your codebase is in LESS there is more work to be done. Onward!</p>

<h2>Processors</h2>

<p>There are a quite a few ways to convert your LESS into properly source mapped CSS code. You can use the lessc command line tool, a GUI such as <a href="http://incident57.com/codekit/">CodeKit</a> or have the server do it with something like <a href="https://github.com/emberfeather/less.js-middleware">less-middleware</a> for <a href="http://www.senchalabs.org/connect/">connect</a>/<a href="http://expressjs.com/">express.</a> As I mentioned previously, you can also compile less on the client-side using less.js but unfortunately our debugging technique does not seem to work with that approach so you&#8217;ll need to use an alternative.</p>

<p>One quick warning, which I&#8217;ll emphasize again later, <strong>make sure you turn off all minification</strong> otherwise it will break our source maps!</p>

<h3>lessc</h3>

<p>If you&#8217;ve installed LESS using npm check that you&#8217;ve got the latest version.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>lessc --version
</span><span class='line'>lessc 1.3.3 <span class="o">(</span>LESS Compiler<span class="o">)</span> <span class="o">[</span>JavaScript<span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>If your version is not 1.3.3 or greater you should run <code>npm install -g less</code> to update to the latest version.</p>

<p>To compile your less with baked in source maps pass the <code>--line-numbers</code> flag a value of <code>mediaquery</code>. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>lessc --line-numbers<span class="o">=</span>mediaquery theme.less theme.css
</span></code></pre></td></tr></table></div></figure>


<p>Your generated LESS should now be inspectable in Chrome. Yay! Make sure you&#8217;re not running any kind of minification step further along in your build or it will break the source maps.</p>

<h3>CodeKit</h3>

<p>In CodeKit use the <strong>Debug Info in CSS</strong> dropdown and set it to <strong>Media Query at Top of CSS File</strong>. Make sure you set <strong>Output Style</strong> to <strong>Regular</strong> otherwise the minification will break our source maps.</p>

<p>After that you should be good to go :)</p>

<h3>less-middleware</h3>

<p>You might need to update your version of the middleware to whatever&#8217;s the latest, which looks like 0.1.9 as of this writing.</p>

<p>In your app you&#8217;ll need to add the <code>dumpLineNumbers</code> options to the middleware&#8217;s config.</p>

<figure class='code'><figcaption><span>app.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">lessMiddleware</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">src</span><span class="o">:</span> <span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;path/to/src&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">dest</span><span class="o">:</span> <span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;path/to/dest&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">dumpLineNumbers</span><span class="o">:</span> <span class="s1">&#39;mediaquery&#39;</span>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>After that you should be all set. Make sure any minification is turned off or it will screw up the source maps.</p>

<h2>Warnings</h2>

<p>The above techniques work for regular Chrome 24 - 26 but <strong>appear to be broken in Chrome Canary 28</strong>.</p>

<p><strong>Minification of any kind seems to screw up the source maps</strong> so make sure your code is not minified or YUI compressed. Remember this is for debugging your code so it&#8217;s ok if it&#8217;s not minified.</p>

<p>One more thing, make sure before you send your code into production that you remember to <strong>turn off debugging</strong> otherwise you&#8217;ll be needlessly bloating your CSS files by quite a lot.</p>

<h2>Conclusion</h2>

<p>Personally I&#8217;ve found this trick <em>extremely</em> useful when working with large LESS codebases. I&#8217;ve seen some chatter that Stylus might also support this trick so if you have first-hand experience debugging Stylus with Chrome please drop me a comment. Otherwise I might do a follow up showing how to achieve similar results in that language.</p>

<p>Any questions or comments hit me up in the discussion area below.</p>

<p>&#8211; Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Asynchronous Grunt Tasks]]></title>
    <link href="http://robdodson.me/blog/2012/11/29/asynchronous-grunt-tasks/"/>
    <updated>2012-11-29T08:15:00-08:00</updated>
    <id>http://robdodson.me/blog/2012/11/29/asynchronous-grunt-tasks</id>
    <content type="html"><![CDATA[<p>After my last post <a href="https://twitter.com/stevensacks">@stevensacks</a> tweeted at me that he was having issues getting node FileSystem commands to work in grunt. After a bit of poking around I noticed that there was no call to grunt&#8217;s <code>async</code> method, which was probably preventing the process from finishing properly. So today&#8217;s post is a primer on async grunt processes, and how to make sure your node and grunt syntax is setup correctly.</p>

<!--more-->


<h2><a href="https://github.com/robdodson/async-grunt-tasks">Grab the Example Source</a></h2>

<p>I&#8217;ve provided a simple grunt project at the link above. Take a look at the <code>tasks</code> folder and you should see two custom tasks, <code>grunt-read-write-local.js</code> and <code>grunt-read-write-web.js</code>. The former will read a local file and write its contents to a new file. The latter will request a webpage and write its contents to a static file.</p>

<p>There are two asynchronous APIs at play here (Node&#8217;s and Grunt&#8217;s) and it&#8217;s important to understand both.</p>

<p>In Node an async operation will usually provide a callback, such is the case for <a href="http://nodejs.org/api/fs.html#fs_fs_readfile_filename_encoding_callback">fs.readFile</a>, or it will use an event dispatch, for instance in an http request we listen for the <a href="http://nodejs.org/api/http.html#http_event_data">data event.</a></p>

<p>Grunt, on the other hand, uses a token or a kind of promise. You grab a reference to grunt&#8217;s <code>done</code> function and you wait till your node process has finished before calling it. If you take a look at <code>grunt-read-write-local.js</code> you can see that we first call the async method to let grunt know it needs to wait:</p>

<figure class='code'><figcaption><span>tasks/grunt-read-write-local.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">done</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">async</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>and as we finish writing our file we tell grunt that everything completed succesfully and it&#8217;s ok to carry on:</p>

<figure class='code'><figcaption><span>tasks/grunt-read-write-local.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Write the contents of the target file to the new location</span>
</span><span class='line'><span class="nx">fs</span><span class="p">.</span><span class="nx">writeFile</span><span class="p">(</span><span class="nx">pathToWrite</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pathToWrite</span> <span class="o">+</span> <span class="s1">&#39; saved!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Tell grunt the async task is complete</span>
</span><span class='line'>  <span class="nx">done</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>We do something similar in our <code>grunt-read-write-web</code> task but this time we work with <a href="http://nodejs.org/api/stream.html#stream_stream">Stream events.</a></p>

<figure class='code'><figcaption><span>tasks/grunt-read-write-web.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Tell grunt this task is asynchronous.</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">done</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">async</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">pathToRead</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Pipe the data from the response stream to</span>
</span><span class='line'>  <span class="c1">// a static file.</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">createWriteStream</span><span class="p">(</span><span class="nx">pathToWrite</span><span class="p">));</span>
</span><span class='line'>  <span class="c1">// Tell grunt the async task is complete</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;end&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pathToWrite</span> <span class="o">+</span> <span class="s1">&#39; saved!&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">done</span><span class="p">();</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Got error: &quot;</span> <span class="o">+</span> <span class="nx">e</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Tell grunt the async task failed</span>
</span><span class='line'>  <span class="nx">done</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The response returned by an http request implements the <a href="http://nodejs.org/api/stream.html#stream_readable_stream">ReadableStream</a> interface so it will emit <code>data</code> and <code>end</code> events. Node Streams have a great feature called <a href="http://nodejs.org/api/stream.html#stream_stream_pipe_destination_options">pipes</a> which handle the work of consuming data events and writing them to a destination. Sexy :) We still listen for the <code>end</code> event coming from our request so we can notify grunt that the process has finished and it can move on.</p>

<h2><a href="https://github.com/robdodson/async-grunt-tasks">Grab the Example Source</a></h2>

<p>If you want to test it all out make sure you run <code>npm install</code> first to pull down any dependencies. Then kick things off by running <code>grunt</code>. I&#8217;m thinking my next post might be all about <a href="http://nodejs.org/api/stream.html#stream_stream">Streams</a> in node since they&#8217;re such a cool concept. Thanks to <a href="https://twitter.com/maxogden">@maxogden</a> and <a href="https://twitter.com/dominictarr">@dominictarr</a> for their great posts on the subject of streams.</p>

<ul>
<li><a href="http://maxogden.com/node-streams.html">Node Streams: How do they work? &#8211; Max Ogden</a></li>
<li><a href="https://gist.github.com/2401787">High Level Style in JavaScript &#8211; Dominic Tarr</a></li>
</ul>


<p>Any questions or comments hit me up in the discussion area below.</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A Require.js multi-page shimmed site: How-To]]></title>
    <link href="http://robdodson.me/blog/2012/11/18/a-require-dot-js-multipage-shimmed-site-how-to/"/>
    <updated>2012-11-18T13:05:00-08:00</updated>
    <id>http://robdodson.me/blog/2012/11/18/a-require-dot-js-multipage-shimmed-site-how-to</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been working with require.js a lot lately and found it really improves the way I manage my code. I had previous experience with require in the context of some of my Backbone posts but I&#8217;d never used it on a more traditional multi-page site before. The workflow to setup require on a multi-page site can be a little confusing at first so I&#8217;ll try to walk you through the specifics.</p>

<!--more-->


<h2>Overview</h2>

<p><em>Note: This tutorial assumes you&#8217;re already familiar with require.js and its configuration options. If not I recommend you <a href="http://requirejs.org/">checkout the docs</a> before proceeding &#8211; Rob</em></p>

<h2><a href="https://github.com/robdodson/requirejs-multipage-shim-tutorial">Grab the Example Source</a></h2>

<p>Typically when you work with require.js you&#8217;re building a single-page app. You usually have one main file which kicks off the app and pulls in dependencies as needed. When you&#8217;re developing you leave these dependencies in separate files but when you move to production you need to combine them. In a production setting you want to cut down the number of http requests to the bare minimum. To assist you, require.js provides a build tool called r.js which minifies and concatenates all of your dependencies into one file.</p>

<p>When working with a multi-page site compiling everything into one file is probably not a good idea because you have no guarantee that the user will visit every page. Thus the ideal scenario is one in which each page has its own <code>main</code> file that contains page-specific instructions and then a separate (hopefully cached) file which contains all of the commonly used js libs. For example if you have a page called <strong>About</strong> and a page called <strong>Contact</strong> you would have <code>main-about.js</code> and <code>main-contact.js</code>. Let&#8217;s say <code>main-about.js</code> and <code>main-contact.js</code> both require <code>'jquery'</code> and <code>'underscore'</code>. We wouldn&#8217;t want to compile <code>jquery</code> and <code>underscore</code> into each <code>main</code> file because then we&#8217;re creating unnecessary bloat. Instead we should create a <code>common.js</code> file which contains <code>jquery</code> and <code>underscore</code> and we&#8217;ll make sure that this file loads before any of our <code>main</code> files. Take a look at this diagram to help it sink in:</p>

<p><strong>BEFORE OPTIMIZATION</strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>About
</span><span class='line'>----------------
</span><span class='line'>js/vendor/jquery.js
</span><span class='line'>js/vendor/underscore.js
</span><span class='line'>js/app/main-about.js
</span><span class='line'>
</span><span class='line'>Contact
</span><span class='line'>----------------
</span><span class='line'>js/vendor/jquery.js
</span><span class='line'>js/vendor/underscore.js
</span><span class='line'>js/app/main-contact.js</span></code></pre></td></tr></table></div></figure>


<p><strong>AFTER OPTIMIZATION</strong></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>common.js
</span><span class='line'>----------------
</span><span class='line'>js/vendor/jquery.js
</span><span class='line'>js/vendor/underscore.js
</span><span class='line'>
</span><span class='line'>About
</span><span class='line'>----------------
</span><span class='line'>js/common.js
</span><span class='line'>js/app/main-about.js
</span><span class='line'>
</span><span class='line'>Contact
</span><span class='line'>----------------
</span><span class='line'>js/common.js
</span><span class='line'>js/app/main-contact.js</span></code></pre></td></tr></table></div></figure>


<p>By compiling all of those libaries into <code>common.js</code> we&#8217;re reducing the number of http requests per page. Also, after the first page has loaded, <code>common.js</code> should be available from the browser&#8217;s cache. Now that you get the general concept let&#8217;s take a look at an example.</p>

<h2>Examples!</h2>

<p><a href="https://twitter.com/jrburke">James Burke</a>, author of require.js, has done a great job putting together some example projects which show how to effectively structure your project so it can be run through the r.js optimization tool when you&#8217;re ready to deploy. The one I typically refer to is the <a href="https://github.com/requirejs/example-multipage-shim">example-multipage-shim.</a> There&#8217;s also an <a href="https://github.com/requirejs/example-multipage">example-multipage</a> but I tend to use the shim version because it seems like there&#8217;s always a few non-AMD scripts that end up in a project.</p>

<p>I&#8217;ve put together my own boilerplate which you guys are free to grab <a href="https://github.com/robdodson/requirejs-multipage-shim-tutorial">here.</a> The rest of this post will walk through this boilerplate.</p>

<h2>Learn you a boilerplate!</h2>

<p>If you&#8217;ve worked with require.js on a single page site you&#8217;re probably used to defining a script tag that looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="c">&lt;!--This sets the baseUrl to the &quot;scripts&quot; directory, and</span>
</span><span class='line'><span class="c">    loads a script that will have a module ID of &#39;main&#39;--&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">data-main=</span><span class="s">&quot;scripts/main.js&quot;</span> <span class="na">src=</span><span class="s">&quot;scripts/require.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>data-main</code> attribute is a convenience feature of require.js which sets require&#8217;s <a href="http://requirejs.org/docs/api.html#config-baseUrl">baseUrl property.</a> You usually put some configuration options in the <code>main</code> file as well, for instance, if you&#8217;re loading a 3rd party library you might create a <a href="http://requirejs.org/docs/api.html#config-paths">path</a> so you can easily reference it. Since our boilerplate has different <code>main</code> files for each page we&#8217;re going to put that configuration data into our <code>common.js</code> file instead.</p>

<p><em>Hold on, I thought you said common.js was where we were going to compile all of our libraries?</em></p>

<p>Indeed you are correct astute reader. But since <code>common.js</code> is going to be loaded before any other required modules, why not put our configuration options in it as well? Here&#8217;s what the <code>common.js</code> file from our boilerplate looks like:</p>

<figure class='code'><figcaption><span>common.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//The build will inline common dependencies into this file.</span>
</span><span class='line'>
</span><span class='line'><span class="nx">requirejs</span><span class="p">.</span><span class="nx">config</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s1">&#39;./js&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">paths</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;jquery&#39;</span><span class="o">:</span> <span class="s1">&#39;vendor/require-jquery&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;bootstrap&#39;</span><span class="o">:</span> <span class="s1">&#39;vendor/bootstrap&#39;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">shim</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s1">&#39;bootstrap&#39;</span><span class="o">:</span> <span class="p">[</span> <span class="s1">&#39;jquery&#39;</span> <span class="p">]</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>To smooth over possible weird module shimming situations I tend to use the combined jQuery-require.js bundle available <a href="http://requirejs.org/docs/jquery.html">here.</a> Then in my paths option I map <code>jquery</code> to this file. The file will already be loaded on the page so it doesn&#8217;t actually request anything new, it just makes sure that <code>$</code> is available in my modules.</p>

<p>You&#8217;ll also note that we&#8217;re using <a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a> which is not AMD compliant out of the box so we have to shim it. In this case it depends on <code>jquery</code> so we list that as its only dependency and we&#8217;re good.</p>

<p>Aside from <code>common.js</code> you should probably take a look in the <code>app/models</code> directory. I&#8217;ve created two models which extend a base model in order to illustrate that the <code>common.js</code> file isn&#8217;t only for 3rd party code, it&#8217;s really for any code that&#8217;s going to be used over and over on your site. We&#8217;ll toss the basicModel into common.js during the build process.</p>

<h2>Just hit build already&#8230;</h2>

<p>OK ok. I can tell you&#8217;re ready to see some fireworks. Before we hit build I want to point out the <code>options.js</code> file. This is where we tell r.js which modules to compile and what each module should include or exclude.</p>

<figure class='code'><figcaption><span>options.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">appDir</span><span class="o">:</span> <span class="s1">&#39;www&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">baseUrl</span><span class="o">:</span> <span class="s1">&#39;js/&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">mainConfigFile</span><span class="o">:</span> <span class="s1">&#39;www/js/common.js&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">dir</span><span class="o">:</span> <span class="s1">&#39;www-release&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">modules</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;common&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">include</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="s1">&#39;app/models/basicModel&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="s1">&#39;bootstrap&#39;</span>
</span><span class='line'>      <span class="p">],</span>
</span><span class='line'>      <span class="nx">exclude</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;jquery&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;app/main-about&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">exclude</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;common&#39;</span><span class="p">,</span> <span class="s1">&#39;jquery&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;app/main-contact&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">exclude</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;common&#39;</span><span class="p">,</span> <span class="s1">&#39;jquery&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">]</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>You&#8217;ll note that first we put together our common module, then we tell the subsequent modules to exclude it. When you tell r.js to exclude a module it will find all of the nested dependencies in that module and exclude those as well. This is why we don&#8217;t need to tell about and contact to exclude bootstrap. It sees that bootstrap is already in common so it knows to exclude it.</p>

<p>If you haven&#8217;t already now is a good time to do an <code>npm install</code>. That should pull down all of the grunt dependencies. Speaking of grunt, you&#8217;ll need to install that as well if you&#8217;ve never used it <code>npm install -g grunt</code>. You might noticed in our gruntfile, <code>grunt.js</code>, we are using a number of tasks from the <a href="https://github.com/gruntjs/grunt-contrib">grunt-contrib</a> library. Grunt-contrib is a great resource for and I encourage you to spend some time looking through all of the tasks that fall under its umbrella.</p>

<p>OK. Ready to rock. Just type <code>grunt</code> to build, or <code>grunt.cmd</code> if you&#8217;re on Windows (thanks <a href="http://twitter.com/stevensacks">@stevensacks</a>). When you&#8217;re finished you should have a new folder called <code>www-release</code>. Take a look at the <code>build.txt</code> file to see where everything ended up.</p>

<figure class='code'><figcaption><span>options.js</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">css</span><span class="o">/</span><span class="nx">bootstrap</span><span class="o">-</span><span class="nx">responsive</span><span class="p">.</span><span class="nx">css</span>
</span><span class='line'><span class="o">----------------</span>
</span><span class='line'><span class="nx">css</span><span class="o">/</span><span class="nx">bootstrap</span><span class="o">-</span><span class="nx">responsive</span><span class="p">.</span><span class="nx">css</span>
</span><span class='line'>
</span><span class='line'><span class="nx">css</span><span class="o">/</span><span class="nx">bootstrap</span><span class="p">.</span><span class="nx">css</span>
</span><span class='line'><span class="o">----------------</span>
</span><span class='line'><span class="nx">css</span><span class="o">/</span><span class="nx">bootstrap</span><span class="p">.</span><span class="nx">css</span>
</span><span class='line'>
</span><span class='line'><span class="nx">css</span><span class="o">/</span><span class="nx">style</span><span class="p">.</span><span class="nx">css</span>
</span><span class='line'><span class="o">----------------</span>
</span><span class='line'><span class="nx">css</span><span class="o">/</span><span class="nx">style</span><span class="p">.</span><span class="nx">css</span>
</span><span class='line'>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">common</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="o">----------------</span>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">common</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">app</span><span class="o">/</span><span class="nx">models</span><span class="o">/</span><span class="nx">basicModel</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">vendor</span><span class="o">/</span><span class="nx">bootstrap</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">app</span><span class="o">/</span><span class="nx">main</span><span class="o">-</span><span class="nx">about</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="o">----------------</span>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">app</span><span class="o">/</span><span class="nx">models</span><span class="o">/</span><span class="nx">aboutModel</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">app</span><span class="o">/</span><span class="nx">main</span><span class="o">-</span><span class="nx">about</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">app</span><span class="o">/</span><span class="nx">main</span><span class="o">-</span><span class="nx">contact</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="o">----------------</span>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">app</span><span class="o">/</span><span class="nx">models</span><span class="o">/</span><span class="nx">contactModel</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="nx">js</span><span class="o">/</span><span class="nx">app</span><span class="o">/</span><span class="nx">main</span><span class="o">-</span><span class="nx">contact</span><span class="p">.</span><span class="nx">js</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you take a look at the <code>common.js</code> file in <code>www-release</code> it should look like a big blob of minified code. That&#8217;s what we want to see. In this case it contains our basicModel, twitter bootstrap and our original configuration code. If you refer to about.html you can see how we control the load order:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;./js/vendor/require-jquery.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="c1">// Load common code that includes config,</span>
</span><span class='line'><span class="c1">// then load the app logic for this page.</span>
</span><span class='line'><span class="nx">require</span><span class="p">([</span><span class="s1">&#39;./js/common&#39;</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">common</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// ./js/common.js sets the baseUrl to be ./js/</span>
</span><span class='line'>  <span class="c1">// You can ask for &#39;app/main-about&#39; here instead</span>
</span><span class='line'>  <span class="c1">// of &#39;./js/app/main-about&#39;</span>
</span><span class='line'>  <span class="nx">require</span><span class="p">([</span><span class="s1">&#39;app/main-about&#39;</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>First we bring in our combined require.js/jquery script. Then we load <code>common.js</code> and only <em>after</em> <code>common.js</code> is loaded do we load the page specific code in <code>main-about</code>. If you stick to this structure you should be able to layer your code so it&#8217;s easy to manage throughout your site.</p>

<h2><a href="https://github.com/robdodson/requirejs-multipage-shim-tutorial">Grab the Example Source</a></h2>

<p>Hope you learned something new today. Feedback and suggestions always welcome in the comments below. Thanks!</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Virtual Host in Mountain Lion with Apache]]></title>
    <link href="http://robdodson.me/blog/2012/10/02/virtual-host-in-mountain-lion-with-apache/"/>
    <updated>2012-10-02T23:16:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/10/02/virtual-host-in-mountain-lion-with-apache</id>
    <content type="html"><![CDATA[<p>If you&#8217;re using Mountain Lion and have the need to setup a vhost it can be a little tricky to get the ball rolling. I&#8217;m going to do my best to detail the process that I use to set everything up. Hopefully you can use these same steps to square aware your system.</p>

<!--more-->


<h2>Command Line Fu!</h2>

<p>Ok we&#8217;re going to pretty much do everything in Terminal so if that scares you now might be a good time to install <a href="http://www.mamp.info/en/index.html">MAMP</a> instead ;)</p>

<h2>Step 1: Enable httpd-vhosts.conf</h2>

<p>OK first thing to do is navigate to your apache installation and open it up in your text editor of choice.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /etc/apache2
</span><span class='line'>mate httpd.conf // you can use anything to open it up: vim, nano, etc.</span></code></pre></td></tr></table></div></figure>


<p>You&#8217;re looking for the line:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#Include /private/etc/apache2/extra/httpd-vhosts.conf</span></code></pre></td></tr></table></div></figure>


<p>Remove the <code>#</code> to uncomment it.</p>

<p>It might be wrapped in a block that looks like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;IfDefine WEBSHARING_ON&gt;
</span><span class='line'>...
</span><span class='line'>&lt;/IfDefine&gt;</span></code></pre></td></tr></table></div></figure>


<p>Comment out those lines using <code>#</code>. We want our httpd-vhosts file to always be loaded. It should look kind of like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#&lt;IfDefine WEBSHARING_ON&gt;
</span><span class='line'>
</span><span class='line'>... a bunch of stuff ...
</span><span class='line'>
</span><span class='line'>Include /private/etc/apache2/extra/httpd-vhosts.conf
</span><span class='line'>
</span><span class='line'>... a buncha other stuff ...
</span><span class='line'>
</span><span class='line'>#&lt;/IfDefine&gt;</span></code></pre></td></tr></table></div></figure>


<h2>Step 2: Enable PHP</h2>

<p>In the <code>httpd.conf</code> file search for this line:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#LoadModule php5_module libexec/apache2/libphp5.so</span></code></pre></td></tr></table></div></figure>


<p>Remove the <code>#</code> so PHP will be enabled.</p>

<h2>Step 3: Add a vhost</h2>

<p>OK let&#8217;s add our first vhost.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mate /etc/apache2/extra/httpd-vhosts.conf</span></code></pre></td></tr></table></div></figure>


<p>This is your list of virtual hosts. There should be some example vhosts in here. Let&#8217;s create a new one:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;VirtualHost *:80&gt;
</span><span class='line'>    ServerName mysite.dev
</span><span class='line'>    DocumentRoot "/Users/Rob/Developer/mysite"
</span><span class='line'>    &lt;Directory "/Users/Rob/Developer/mysite"&gt;
</span><span class='line'>        DirectoryIndex index.php index.html
</span><span class='line'>        AllowOverride all
</span><span class='line'>        Options -MultiViews
</span><span class='line'>        Order allow,deny
</span><span class='line'>        Allow from all
</span><span class='line'>    &lt;/Directory&gt;
</span><span class='line'>&lt;/VirtualHost&gt;</span></code></pre></td></tr></table></div></figure>


<p>There are a few other options you can use but I&#8217;m ignoring them for now. <code>ServerName</code> is what we&#8217;ll be typing into our browser address bar. <code>DocumentRoot</code> and <code>Directory</code> point to the location of the project files on our hard drive. Note that <code>DirectoryIndex</code> will check for index.php first and then check for index.html. If you want to just use .html you can remove the bit about index.php</p>

<h2>Step 4: Add the vhost to your hosts file</h2>

<p>Next let&#8217;s add our new host to our hosts file.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mate /etc/hosts</span></code></pre></td></tr></table></div></figure>


<p>You should see a line that looks like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>127.0.0.1 localhost</span></code></pre></td></tr></table></div></figure>


<p>Add this line underneath so it looks like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>127.0.0.1 localhost
</span><span class='line'>127.0.0.1 mysite.dev</span></code></pre></td></tr></table></div></figure>


<h2>Step 5: Restart Apache</h2>

<p>OK let&#8217;s reboot apache!</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo apachectl restart</span></code></pre></td></tr></table></div></figure>


<h2>Step 6: Cross your fingers!</h2>

<p>Head over to your browser and try it out. Make sure you use <code>http://</code> at the beginning or it will just try to google your hostname.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>http://mysite.dev</span></code></pre></td></tr></table></div></figure>


<p>With any luck you should see your site! If everything worked go back to terminal and paste in this line:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist</span></code></pre></td></tr></table></div></figure>


<p>That will tell apache to start whenever the system starts. A word of warning: Whenever you change anything in httpd.conf, httpd-vhosts.conf or your hosts file you&#8217;ll have to restart apache with <code>sudo apachectl restart</code> otherwise your changes won&#8217;t show up in the browser.</p>

<p>Good Luck!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Factory]]></title>
    <link href="http://robdodson.me/blog/2012/09/03/javascript-design-patterns-factory/"/>
    <updated>2012-09-03T12:40:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/09/03/javascript-design-patterns-factory</id>
    <content type="html"><![CDATA[<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<p>Factories encapsulate and separate object creation from the rest of your code. In situations where the creation of an object can be complex or subject to change a factory can act as a nice buffer to help keep things tidy. Without proper planning Factories can lead to class explosions; as a result the pattern can be both a blessing and a curse depending on how it&#8217;s used.</p>

<!--more-->


<h2>Formal Definition</h2>

<h4>Factory Method</h4>

<blockquote><p>Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.</p><footer><strong>GoF</strong> <cite>Design Patterns: Elements of Reusable Object-Oriented Software</cite></footer></blockquote>


<h4>Abstract Factory</h4>

<blockquote><p>Provide an interface for creating families of related or dependent objects without specifying their concrete classes.</p><footer><strong>GoF</strong> <cite>Design Patterns: Elements of Reusable Object-Oriented Software</cite></footer></blockquote>


<h3>Also Known As</h3>

<ul>
<li>Virtual Constructor (<strong>Factory Method</strong>)</li>
<li>Kit (<strong>Abstract Factory</strong>)</li>
</ul>


<h2>Simple Factory vs Factory Method vs Abstract Factory</h2>

<p>The phrase &#8220;Factory Pattern&#8221; is rather overloaded so I&#8217;m going to give you a quick crash course in the three main types of factories.</p>

<p>A <strong>simple factory</strong> is an object which encapsulates the creation of another object, shielding that code from the rest of your application.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">UserFactory</span><span class="p">.</span><span class="nx">createUser</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&#8217;s common to parameterize simple factory methods to increase the number of products they&#8217;re able to return.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">admin</span> <span class="o">=</span> <span class="nx">UserFactory</span><span class="p">.</span><span class="nx">createUser</span><span class="p">(</span><span class="s1">&#39;admin&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">customer</span> <span class="o">=</span> <span class="nx">UserFactory</span><span class="p">.</span><span class="nx">createUser</span><span class="p">(</span><span class="s1">&#39;customer&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The actual implementaiton of <code>createUser</code> might look something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">UserFactory</span><span class="p">.</span><span class="nx">createUser</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;admin&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nx">Admin</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;customer&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nx">Customer</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Typically the return value from a factory is known as the <code>Product</code>. In the case of our <code>UserFactory</code> there are two Products: <code>Admin</code> and <code>Customer</code>. It&#8217;s important for these products to maintain a consistent interface so the client can use any product from our factory without needing to do elaborate checks to see if a particular method exists.</p>

<h3>Factory Method</h3>

<p>While the Simple Factory is a nice start and good for many situations it&#8217;s possible to extend this even further through the use of the <strong>Factory Method</strong> pattern.</p>

<blockquote><p>The Factory Method Pattern defines an interface <br/>for creating an object, but lets subclasses decide which <br/>class to instantiate.  Factory Method lets a class defer <br/>instantiation to subclasses.</p><footer><strong>Elisabeth Freeman</strong> <cite>Head First Design Patterns</cite></footer></blockquote>


<p>Factory Method defines one method, <code>createThing</code> for instance, which is overriden by subclasses who decide what to return. The Factories and Products must conform to interfaces for clients to be able to use them.</p>

<p>In <em>Head First Design Patterns</em> a Factory Method pattern is used to allow a PizzaStore to define many subclasses such as ChicagoPizzaStore, CaliforniaPizzaStore, NewYorkPizzaStore. Each subclass overrides <code>createPizza</code> and returns its own particular style of pizza (ie: a ChicagoPizza or a CaliforniaPizza). The main take away is that there is only one method, <code>createPizza</code>, that does anything. By subclassing and overriding this method we can offer aditional flexibility beyond what&#8217;s possible with the Simple Factory.</p>

<h3>Abstract Factory</h3>

<p>Unlike the Factory Method pattern, <strong>Abstract Factory</strong> defines any number of methods which return Products.</p>

<blockquote><p>The Abstract Factory Pattern provides an interface <br/>for creating families of related or dependent objects <br/>without specifying their concrete classes.</p><footer><strong>Elisabeth Freeman</strong> <cite>Head First Design Patterns</cite></footer></blockquote>


<p>Again in <em>Head First Design Patterns</em>, an Abstract Factory pattern is used to provide different Pizza ingredients depending on the type of Pizza. For instance, a ChicagoPizza would be given a ChicagoPizzaIngredients factory with methods like <code>createDough</code>, <code>createSauce</code>, <code>createCheese</code>, etc. A CaliforniaPizzaIngredients factory would also implement <code>createDough</code>, <code>createSauce</code> and <code>createCheese</code>. In this way the factories would be interchangeable.</p>

<p>The authors are keen to point out that the methods of the Abstract Factory (<code>createDough</code>, <code>createSauce</code>, etc) look very similar to the Factory Method (<code>createPizza</code>). One way of thinking about things is that an Abstract Factory can be composed of Factory Methods.</p>

<h2>The Factory Method in JavaScript</h2>

<p>Since I&#8217;ve already shown a basic Simple Factory let&#8217;s take a stab at doing the Factory Method in JS. We&#8217;ll continue with the PizzaStore theme since I&#8217;ve already spelled out how each pattern applies to it. We&#8217;re going to do this without the use of the <code>new</code> keyword and instead we&#8217;ll take advantage of JavaScript&#8217;s prototypes. How you ask?</p>

<h3>The very awesome Object.create</h3>

<p>ECMAScript 5 introduced a new method of the <code>Object</code> prototype called <code>create</code>. You can read up on it in full detail <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create">on MDN.</a> In a nutshell it lets you pass in a prototype and receive a new object which points to that prototype. <code>Object.create</code> is actually a simple Factory Method! Here&#8217;s an example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">firstPizzaStore</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">PizzaStore</span><span class="p">);</span>
</span><span class='line'><span class="nx">firstPizzaStore</span><span class="p">.</span><span class="nx">createPizza</span><span class="p">();</span> <span class="c1">// returns &#39;Generic pizza created&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>One very cool feature of <code>Object.create</code> is that it accepts a properties object which is then mixed in to the returned object. The code can get a little verbose since it uses <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty">defineProperty syntax</a> so instead let&#8217;s steal a function from <a href="http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/">Yehuda Katz</a> which lets us do something very similar.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">fromPrototype</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">prototype</span><span class="p">,</span> <span class="nx">object</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">newObject</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">prototype</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">prop</span> <span class="k">in</span> <span class="nx">object</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">object</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">prop</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">newObject</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">object</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">newObject</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we have that we can continue on our way. One quick caveat though! Some browsers *cough* <strong>IE</strong> *cough* don&#8217;t support <code>Object.create</code> so we need to shim it. Thankfully MDN has got our back:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Polyfill</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Object.create implementation only accepts the first parameter.&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="kd">function</span> <span class="nx">F</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>        <span class="nx">F</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">o</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nx">F</span><span class="p">();</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Drop that into your page and you should be able to use Object.create like we are above. Note that the shim does not support the second properties object. For our purposes that&#8217;s ok but definitely keep it in mind if you&#8217;re thinking of using it.</p>

<h3>Back to the Factory Method</h3>

<p>With <code>Object.create</code> and <code>fromPrototype</code> in hand we&#8217;re ready to tackle our first Factory Method.</p>

<p>Let&#8217;s start by creating a PizzaStore:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Define the Pizza product</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Pizza</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;Plain Generic Pizza&#39;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And the basic PizzaStore</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">PizzaStore</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">createPizza</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;cheese&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Pizza</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;Cheesy, Generic Pizza&#39;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;veggie&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Pizza</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;Veggie, Generic Pizza&#39;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Easy enough. Ok now let&#8217;s extend the PizzaStore so we have two variations: ChicagoPizzaStore and CaliforniaPizzaStore.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">ChicagoPizzaStore</span> <span class="o">=</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">PizzaStore</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">createPizza</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;cheese&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Pizza</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;Cheesy, Deep-dish Chicago Pizza&#39;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;veggie&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Pizza</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;Veggie, Deep-dish Chicago Pizza&#39;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">CaliforniaPizzaStore</span> <span class="o">=</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">PizzaStore</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">createPizza</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;cheese&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Pizza</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;Cheesy, Tasty California Pizza&#39;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;veggie&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Pizza</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;Veggie, Tasty California Pizza&#39;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Elsewhere in our app...</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">chicagoStore</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">ChicagoPizzaStore</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">pizza</span> <span class="o">=</span> <span class="nx">chicagoStore</span><span class="p">.</span><span class="nx">createPizza</span><span class="p">(</span><span class="s1">&#39;veggie&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pizza</span><span class="p">.</span><span class="nx">description</span><span class="p">);</span> <span class="c1">// returns &#39;Veggie, Deep-dish Chicago Pizza&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>The Abstract Factory in JavaScript</h2>

<p>Since we have a variety of pizza styles we might also have a variety of ingredients. Let&#8217;s see if we can accomodate all the different kinds.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Ingredients</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">createDough</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;generic dough&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">createSauce</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;generic sauce&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">createCrust</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;generic crust&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Ingredients</span><span class="p">.</span><span class="nx">createChicagoStyle</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Ingredients</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">createDough</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;thick, heavy dough&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">createSauce</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;rich marinara&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">createCrust</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;deep-dish&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Ingredients</span><span class="p">.</span><span class="nx">createCaliforniaStyle</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">fromPrototype</span><span class="p">(</span><span class="nx">Ingredients</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">createDough</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;light, fluffy dough&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">createSauce</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;tangy red sauce&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="nx">createCrust</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;thin and crispy&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above example <code>Ingredients</code> is our Abstract Factory. We know that for every
different kind of pizza we&#8217;ll need different ingredients and therefore a new Factory Method. We also know that we have different styles of pizza so we&#8217;ll need Chicago style ingredients and California style ingredients. When a client wishes to grab some ingredients for a particular kind of pizza they just say:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">californiaIngredients</span> <span class="o">=</span> <span class="nx">Ingredients</span><span class="p">.</span><span class="nx">createCaliforniaStyle</span><span class="p">();</span>
</span><span class='line'><span class="nx">californiaIngredients</span><span class="p">.</span><span class="nx">createCrust</span><span class="p">();</span> <span class="c1">// returns &#39;thin and crispy&#39;;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The object that is returned by the call <code>createCaliforniaStyle</code> is the concrete implementation of our Abstract Ingredients object. In other words, if <code>Ingredients</code> is the Abstract Factory, then the object returned by <code>createCaliforniaStyle</code> could also be thought of as a <code>CaliforniaIngredients</code> object. It is a <em>subclass</em> of <code>Ingredients</code> if you want to think of it that way. The returned object extends <code>Ingredients</code> and overrides its Factory Methods with its own methods. In so doing we provide a lot of additional flexibility to our app. If we want to add a Hawaiian style ingredients we just add a <code>createHawaiianStyle</code> method.</p>

<p>If you recall from <a href="http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/">the previous article on Decorators</a> we talked about the <strong>Open-Closed Principle</strong> which states that &#8220;classes should be open for extension but closed for modification.&#8221; You&#8217;ll notice that adding a <code>createHawaiianStyle</code> method would actually violate this principle so it should be noted that when using an Abstract Factory approach you&#8217;ll probably have to reopen the class/object a few times to modify it. Not ideal but depending on your use case this might not be such  big deal and you might prefer the flexibility and organization that the factory offers.</p>

<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/factory/">Grab the Example Source</a></h2>

<h2>Related Patterns</h2>

<ul>
<li>Template Methods: Factory Methods are usually called within Template Methods.</li>
<li><a href="http://robdodson.me/blog/2012/08/08/javascript-design-patterns-singleton/">Singleton</a>: A concrete factory is often a singleton.</li>
</ul>


<p><small><cite style="color:#AAA;">Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</cite></small></p>

<hr>


<br>


<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<br>


<p>Thanks for reading! If you have questions or feedback please leave a comment below. - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Decorator Update]]></title>
    <link href="http://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2/"/>
    <updated>2012-08-30T18:07:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2</id>
    <content type="html"><![CDATA[<p><a href="http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/">Yesterday&#8217;s post</a> drew a lot of traffic from Reddit and with it came some really good feedback. If you haven&#8217;t read the <a href="http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/">previous post</a> please do so first and then come back here.</p>

<p>I want to go through some of what was said so I can refine my examples and also clear up any confusion.</p>

<!--more-->


<h2>That prototype example sucked!</h2>

<p>OK let me start off by apologizing for even including that second example (the <code>Sale</code> decorators). It was meant as a kind of fun academic exercise but I tried to make it clear that I wasn&#8217;t suggesting anyone actually implement it. Redditor gizmo490 pointed out that for the pattern to actually work you would have to overwrite all the methods of the <code>Sale</code> object or risk working in the wrong context. You can see our full discussion <a href="http://www.reddit.com/r/javascript/comments/z0z2j/decorators_in_javascript_hope_you_enjoy/c60qb0c">here.</a></p>

<p>So I&#8217;ll just say if you&#8217;re considering that second example: Stop. Just don&#8217;t do it. It is way too much code.</p>

<h2>We don&#8217;t necessarily need all those objects</h2>

<p>Another Redditor, Draders, pointed out that the decorator objects aren&#8217;t really necessary since we can just put functions directly into the decoratorsList.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// This is presuming that `add` pushes a function into the</span>
</span><span class='line'><span class="c1">// list of decorators</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s1">&#39;zipcode&#39;</span><span class="p">,</span> <span class="nx">validateZipCodeFunction</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you want <code>validateZipCodeFunction</code> to be reusable you&#8217;ll have to define it somewhere and attaching it to the Validator object is probably a fine choice. In the end it&#8217;s a bit less code so definitely something to think about.</p>

<h2>Finally, the power of CLOSURES!</h2>

<p>Finally, and this is really the reason why I wanted to write this update, Redditor emehrkay pointed out that my examples are basically ignoring the power of JS functions and closures. <a href="http://www.reddit.com/r/javascript/comments/z0z2j/decorators_in_javascript_hope_you_enjoy/c60rl7x">In his quick and dirty example</a> he shows how to achieve a similar goal with much less code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">test</span><span class="p">(</span><span class="nx">arg</span><span class="p">){</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">arg</span> <span class="o">+</span> <span class="nx">arg</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">testDecorator</span><span class="p">(</span><span class="nx">fn</span><span class="p">,</span> <span class="nx">args</span><span class="p">){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">arg</span> <span class="o">=</span> <span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">fn</span><span class="p">(</span><span class="nx">arg</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">decorate</span><span class="p">(</span><span class="nx">dec</span><span class="p">,</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">args</span><span class="p">){</span>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">dec</span><span class="p">(</span><span class="nx">fn</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">x</span> <span class="o">=</span> <span class="nx">decorate</span><span class="p">(</span><span class="nx">testDecorator</span><span class="p">,</span> <span class="nx">test</span><span class="p">,</span> <span class="p">[</span><span class="mi">2</span><span class="p">])();</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>So here&#8217;s my attempt to recreate the <code>Sale</code> example but using more of emehrkay&#8217;s approach:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">Sale</span><span class="p">(</span><span class="nx">price</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">price</span> <span class="o">=</span> <span class="nx">price</span> <span class="o">||</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">getPrice</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">price</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">setPrice</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">price</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">price</span> <span class="o">=</span> <span class="nx">price</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">usd</span><span class="p">(</span><span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">price</span> <span class="o">=</span> <span class="nx">fn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">context</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="s2">&quot;$&quot;</span> <span class="o">+</span> <span class="nx">price</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">decorate</span><span class="p">(</span><span class="nx">dec</span><span class="p">,</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">dec</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">context</span><span class="p">,</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Let&#39;s run it!</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">sale</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Sale</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Decorate our getPrice method. We&#39;ll just add</span>
</span><span class='line'><span class="c1">// some extra dollar signs to the output.</span>
</span><span class='line'><span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span> <span class="o">=</span> <span class="nx">decorate</span><span class="p">(</span><span class="nx">usd</span><span class="p">,</span> <span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">,</span> <span class="nx">sale</span><span class="p">);</span>
</span><span class='line'><span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span> <span class="o">=</span> <span class="nx">decorate</span><span class="p">(</span><span class="nx">usd</span><span class="p">,</span> <span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">,</span> <span class="nx">sale</span><span class="p">);</span>
</span><span class='line'><span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span> <span class="o">=</span> <span class="nx">decorate</span><span class="p">(</span><span class="nx">usd</span><span class="p">,</span> <span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">,</span> <span class="nx">sale</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">());</span> <span class="c1">// output: $$$50</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Test to make sure other methods can still</span>
</span><span class='line'><span class="c1">// access the price in the correct context</span>
</span><span class='line'><span class="nx">sale</span><span class="p">.</span><span class="nx">setPrice</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">());</span> <span class="c1">// output: $$$100</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since we&#8217;re kind of mixing OO and functional style here the one caveat is that you have to pass the context to your decorators so when they call <code>getPrice</code> they know which instance they&#8217;re referring to. So the code is a little funky but still interesting and if anyone can think of a way to write it cleaner I&#8217;m all ears!</p>

<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/decorator/">Grab the Example Source</a></h2>

<p>Thanks for reading! If you have questions or feedback please leave a comment below. - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Decorator]]></title>
    <link href="http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/"/>
    <updated>2012-08-27T09:59:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator</id>
    <content type="html"><![CDATA[<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<p><a href="http://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2/">Update: Part 2 has been posted!</a></p>

<p>A Decorator is an object which adds functionality to another object dynamically. It can be used to enhance the behavior of an object without requiring the author to reopen its class. While Decorators might feel a little weird to implement in static languages they&#8217;re extremely simple in JavaScript due to the ease with which JS passes around functions and handles dynamic types.</p>

<!--more-->


<h2>Formal Definition</h2>

<blockquote><p>Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.</p><footer><strong>GoF</strong> <cite>Design Patterns: Elements of Reusable Object-Oriented Software</cite></footer></blockquote>


<h3>Also Known As</h3>

<ul>
<li>Wrapper</li>
</ul>


<h2>When to use it</h2>

<ul>
<li><p>When you&#8217;d like to add responsibilities to individual objects dynamically (i.e. without subclassing/inheritence).</p></li>
<li><p>When you&#8217;d like to be able to remove the functionality at a later time. An <code>undecorate</code> method, for instance.</p></li>
<li><p>When extension by subclassing would be unmanageable or lead to a class explosion. For instance, if a <code>Vehicle</code> class is subclassed by 30 other vehicle objects with only minor differences.</p></li>
</ul>


<h2>Pros and Cons</h2>

<ul>
<li><p><strong>Pro</strong>: More flexible than inheritance.</p></li>
<li><p><strong>Pro</strong>: Avoids feature-laden classes high up in the hierarchy.</p></li>
<li><p><strong>Con</strong>: A decorator and its component aren’t identical.</p></li>
<li><p><strong>Con</strong>: Lots of little objects.</p></li>
</ul>


<h2>A Brief Explanation</h2>

<p>The Decorator pattern is very similar to one we&#8217;ve addressed earlier, called <a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns-strategy/">Strategy.</a> The differences between the two can be subtle but usually a decorator <em>enhances</em>, layers upon or &#8220;decorates&#8221; the object or method it&#8217;s wrapping. In contrast, a strategy will replace a method&#8217;s algorithm completely.</p>

<p>The primary benefit of the Decorator pattern is that you can take a rather vanilla object and wrap it in more advanced behaviors. For instance a view which renders a plain window can have decorators to add different backgrounds, scroll bars, borders, etc. The underlying code, or guts, of the window object remains the same while the decorators provide a new <em>skin.</em></p>

<p>Decorators are not limited to visual components. In fact much of the <code>java.io</code> package is composed of Decorators which add additional functionality such as buffering file streams and adding line numbers. A similar application to JavaScript might involve decorating I/O in Node.js. For instance, incoming data might need to be converted to ASCII and then compressed in some way. It might not <em>always</em> need to be converted to ASCII and it might not <em>always</em> need to be compressed. In this scenario we can apply or remove I/O decorators at runtime changing the behavior of our object instead of writing a big class with a bunch of cross-cutting concerns.</p>

<h2>Enough Talk! COOOOODE!!!</h2>

<p>Ok so let&#8217;s do an example. We&#8217;re going to create a <code>Validator</code> class which looks at the contents of a form and adds error messages to an array if anything in the form is not correct. We want our <code>Validator</code> to be really simple so it&#8217;ll just have two methods: <code>validate</code> and <code>decorate</code>. As the name implies <code>validate</code> will tell our validator to compare the form against its internal rules. We&#8217;ll use <code>decorate</code> to specify those rules. The <code>decorate</code> method will accept a String, such as &#8216;hasAge&#8217; or &#8216;hasZipCode&#8217; which corresponds to an actual function. We&#8217;ll collect these functions in a list and compare the contents of the form to each item in the list.</p>

<p>We&#8217;ll start with the constructor and <code>decorate</code> method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">Validator</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">errors</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">decorate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>We&#8217;ll collect any error messages in the <code>errors</code> array. We could write a method like <code>validator.hasErrors()</code> to check the length and contents of the array but for now I&#8217;ll leave that unspecified. Just know that if we do come across an error we&#8217;ll toss it in there.</p>

<p>The <code>decoratorsList</code> will hold all of our decorator functions. This is not how the Gang of Four does things, or how you will see the Decorator pattern presented in languages like Java or C++, but that&#8217;s because they&#8217;re using static languages which don&#8217;t do well with functions being passed around. In our case since JavaScript functions are objects we can pass our decorators into a collection to have them called sequentially. This is the easier approach recommended by <a href="https://twitter.com/stoyanstefanov">Stoyan Stefanov</a> in <a href="http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns.</a> A little later I&#8217;ll show you the &#8220;hard&#8221; approach and you can decide which you prefer ;)</p>

<p>OK moving on&#8230; Let&#8217;s define some decorator functions. We&#8217;ll add an object to our constructor called <code>decorators</code> and we&#8217;ll attach our functions to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">hasName</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Code to verify presence of name...</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// If no name found...</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;no name!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">hasAge</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Code to verify presence of age...</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// If no age found...</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;no age!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">hasZipCode</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Code to verify presence of zip code...</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// If no zip found...</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;no zip!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Each decorator is actually an object which implements the same interface as our <code>Validator</code> object. When we have all of our decorators added to our <code>decoratorsList</code> we&#8217;ll be able to loop through and call <code>validate</code> on each one.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">validate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">max</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">form</span> <span class="o">=</span> <span class="nx">form</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">max</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">max</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">name</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</span><span class='line'>      <span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">[</span><span class="nx">name</span><span class="p">].</span><span class="nx">validate</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">form</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>At last we come to the <code>validate</code> method. It first receives an object containing all of our form data. Next it prepares to loop through our collection of decorators. We use the name of the decorator object as a key and <code>call</code> its <code>validate</code> method, passing in <code>this</code> for our context and also the form object as an argument. This way all of the validators will execute in the context of our <code>Validator</code> instance and they should all have access to the form data.</p>

<p>Let&#8217;s try it out!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">validator</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Validator</span><span class="p">();</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;hasName&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;hasAge&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;hasZipCode&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">validate</span><span class="p">({});</span> <span class="c1">// we&#39;ll just use a blank object in place of real form data</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">validator</span><span class="p">.</span><span class="nx">errors</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>We aren&#8217;t really doing any validation at this point so our <code>console.log</code> at the end should output an array with 3 error messages, one from each of the validator decorators. But there you go, you&#8217;ve now got a fully decorated <code>validate</code> function. What was once rather vanilla can have all sorts of new and interesting validations applied to it!</p>

<h2>What if my Decorators need additional arguments?</h2>

<p>The above example gets us started decorating but it leaves some room for improvement. For starters what if we want to pass additional arguments to our validation functions? Let&#8217;s revamp this thing just a bit so we can get really fancy&#8230;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">Validator</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">errors</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">decorate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">args</span><span class="o">:</span> <span class="nx">args</span> <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">hasName</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Code to verify presence of name...</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;no name!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">hasAge</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Code to verify presence of age...</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;no age!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">hasZipCode</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">validate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Code to verify presence of zip code...</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">errors</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;no zip!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Validator</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">validate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">max</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">temp</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">name</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">args</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">form</span> <span class="o">=</span> <span class="nx">form</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">max</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">max</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">temp</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">decoratorsList</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</span><span class='line'>      <span class="nx">name</span> <span class="o">=</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">args</span> <span class="o">=</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">args</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">Validator</span><span class="p">.</span><span class="nx">decorators</span><span class="p">[</span><span class="nx">name</span><span class="p">].</span><span class="nx">validate</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">form</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>This time we are passing an optional hash to our <code>decorate</code> method which is stored along with its corresponding decorator object. If you&#8217;ve ever used validators in Rails this should feel similar. Time to see it in action!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">validator</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Validator</span><span class="p">();</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;hasName&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">length</span><span class="o">:</span> <span class="mi">5</span> <span class="p">});</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;hasAge&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">minimum</span><span class="o">:</span> <span class="mi">21</span> <span class="p">});</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;hasZipCode&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">validator</span><span class="p">.</span><span class="nx">validate</span><span class="p">({});</span> <span class="c1">// some form data. in this case just an anonymous object</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">validator</span><span class="p">.</span><span class="nx">errors</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Time to do things the hard way&#8230;</h2>

<p>I promised I would show you the more classical example of Decorator and since I am a man of my word I <em>guess</em> you can see it&#8230; I would not recommend using this approach because it can require overwriting all of your methods to make sure you&#8217;re always in the correct context. Still, as a kind of academic observation it&#8217;s a cool example and demonstrates how JS can emulate other languages. I&#8217;m taking this code almost verbatim from <a href="http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns</a> so full credit goes to Stoyan for coming up with it.</p>

<p>In this example we&#8217;re going to format a Sale price so that it can work for both U.S. and Canadian stores. This means applying different tax rates and outputting the text with different currency symbols.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">Sale</span><span class="p">(</span><span class="nx">price</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">price</span> <span class="o">=</span> <span class="nx">price</span> <span class="o">||</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">getPrice</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">price</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Things start off very similar to our last example. Instead of <code>validate</code> the method we&#8217;re interested in this time is <code>getPrice</code>. If you&#8217;ve been paying attention you&#8217;ll notice that in our previous example <code>validate</code> was rather complex. Yet <code>getPrice</code> is so&#8230;simple. Hmm&#8230;</p>

<p>Let&#8217;s move on to the decorators.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">decorators</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">fedtax</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">getPrice</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">price</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_super</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">price</span> <span class="o">+=</span> <span class="nx">price</span> <span class="o">*</span> <span class="mi">5</span> <span class="o">/</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">price</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">quebec</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">getPrice</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">price</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_super</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">price</span> <span class="o">+=</span> <span class="nx">price</span> <span class="o">*</span> <span class="mf">7.5</span> <span class="o">/</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">price</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">usd</span> <span class="o">=</span> <span class="p">{</span> <span class="c1">// U.S. dollars</span>
</span><span class='line'>  <span class="nx">getPrice</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="s2">&quot;$&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_super</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">().</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">decorators</span><span class="p">.</span><span class="nx">cdn</span> <span class="o">=</span> <span class="p">{</span> <span class="c1">// Canadian dollars</span>
</span><span class='line'>  <span class="nx">getPrice</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="s2">&quot;CDN$&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_super</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">().</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>This may look similar to the last example but take note of the use of <code>_super</code>. The <code>_super</code> property is actually a reference to a parent class instance. We&#8217;ll use this reference to travel up the chain of decorators, performing an operation and returning the price at each stop.</p>

<p>This leads us to the <code>decorate</code> method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">decorate</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">decorator</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">F</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{},</span>
</span><span class='line'>  <span class="nx">overrides</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">constructor</span><span class="p">.</span><span class="nx">decorators</span><span class="p">[</span><span class="nx">decorator</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">newobj</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Create prototype chain</span>
</span><span class='line'>  <span class="nx">F</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">newobj</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">F</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">newobj</span><span class="p">.</span><span class="nx">_super</span> <span class="o">=</span> <span class="nx">F</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Mixin properties/methods of our decorator</span>
</span><span class='line'>  <span class="c1">// Overriding the ones from our prototype</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">overrides</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">overrides</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">i</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">newobj</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">overrides</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">newobj</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you&#8217;re unfamiliar with JavaScript prototypes this can look a little daunting. We&#8217;re using a pattern that <a href="http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns</a> refers to as <em>Rented Constructor</em> in order to essentially take a snapshot of our current object, store it in <code>_super</code> and then mixin new decorator methods. Let&#8217;s see it in action to clarify things a bit better.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">sale</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Sale</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
</span><span class='line'><span class="nx">sale</span> <span class="o">=</span> <span class="nx">sale</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;fedtax&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">sale</span> <span class="o">=</span> <span class="nx">sale</span><span class="p">.</span><span class="nx">decorate</span><span class="p">(</span><span class="s1">&#39;cdn&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sale</span><span class="p">.</span><span class="nx">getPrice</span><span class="p">());</span> <span class="c1">// outputs $CDN52.50</span>
</span></code></pre></td></tr></table></div></figure>


<p>You&#8217;ll notice that each time we call <code>decorate</code> we have to re-assign the sale variable to a new instance. Each new instance has a reference to the previous sale object. When we finally call <code>getPrice</code> it walks up this chain of instances and calls <code>getPrice</code> on each stop along the way. In the end we have something which is functionally identical to our first example but potentially a lot harder to understand. In other words, stick with the first approach! Also be sure to <a href="http://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2/">see my update</a> which discusses this example a bit more and points out a few more of its flaws. Again, it&#8217;s a neat idea to mess around with but there are much easier ways.</p>

<h2>The Open-Closed Principle</h2>

<p>I&#8217;m going to go off on a quick tangent here because of something I saw in <a href="http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124">Head First Design Patterns.</a> There&#8217;s a common heuristic in software design known as the <strong>Open-Closed Principle</strong> which states that &#8220;classes should be open for extension but closed for modification.&#8221; Let&#8217;s explore this concept with our Sale object.</p>

<p>Consider the following bit of code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">Sale</span><span class="p">(</span><span class="nx">price</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">price</span> <span class="o">=</span> <span class="nx">price</span> <span class="o">||</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Sale</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">getPrice</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">price</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should be able to look at this snippet of code and say that it&#8217;s almost certainly bug free. Now let&#8217;s pretend we aren&#8217;t using decorators and our boss comes to us and says we need to add US and Canadian taxes and currency symbols.</p>

<p>&#8220;<em>Hm&#8230;I guess that means I&#8217;ll need to pass those parameters into the constructor and then write some booleans or something to check if we&#8217;re Canadian or US&#8230; Or maybe I&#8217;ll put them all in a hash&#8230; Or&#8230;</em>&#8221;</p>

<p>Regardless of what we choose to do, if it involves opening up the class then there&#8217;s a chance that we&#8217;ll compromise our previous snippet of code. The more times we do this the more we increase the likelihood that we&#8217;ll introduce a bug which might go uncaught for a long time. Eventually what started off as extremely simple, bug-free code, can turn into a rat&#8217;s nest.</p>

<p>So, where possible, try to avoid reopening classes and find ways to extend their functionality. This can mean simply subclassing the parent, or using one of the many design patterns we&#8217;ll be covering.</p>

<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/decorator/">Grab the Example Source</a></h2>

<h2>Related Patterns</h2>

<ul>
<li><p>Adapter: A decorator is different from an adapter in that a decorator only changes an object’s responsibilities, not its interface; an adapter will give an object a completely new interface.</p></li>
<li><p>Composite: A decorator can be viewed as a degenerate composite with only one component. However, a decorator adds additional responsibilities—it isn&#8217;t intended for object aggregation.</p></li>
<li><p><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns-strategy/">Strategy:</a> A decorator lets you change the skin of an object; a strategy lets you change the guts. These are two alternative ways of changing an object.</p></li>
</ul>


<p><small><cite style="color:#AAA;">Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</cite></small></p>

<hr>


<br>


<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<br>


<p>Thanks for reading! If you have questions or feedback please leave a comment below. Also be sure to <a href="http://robdodson.me/blog/2012/08/30/javascript-design-patterns-decorator-pt-2/">checkout Part 2 which covers even more ways to do decorators!</a> - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Observer]]></title>
    <link href="http://robdodson.me/blog/2012/08/16/javascript-design-patterns-observer/"/>
    <updated>2012-08-16T13:19:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/08/16/javascript-design-patterns-observer</id>
    <content type="html"><![CDATA[<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<p>Observer is one of the most popular design patterns and chances are you&#8217;re probably already using it. If you&#8217;ve ever written an event listener with <code>addEventListener</code> or used one of jQuery&#8217;s many versions: <code>on</code>, <code>delegate</code>, <code>live</code>, <code>click</code>, etc&#8230; then you should already be comfortable with the concept. In a nutshell the Observer pattern allows a <strong>Subject</strong> to publish updates to a group of <strong>Observers</strong>. The Subject maintains a list of Observers and provides an interface for objects to register as Observers. Otherwise the Subject doesn&#8217;t care who or what is listening to it. In this way the Subject is decoupled from the Observers allowing easy replacement of one Observer for another or even one Subject for another so long as it maintains the same lexicon of events/notifications.</p>

<!--more-->


<h2>Formal Definition</h2>

<blockquote><p>Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.</p><footer><strong>GoF</strong> <cite>Design Patterns: Elements of Reusable Object-Oriented Software</cite></footer></blockquote>


<h3>Also Known As</h3>

<ul>
<li>Dependents</li>
<li>Publish-Subscribe</li>
</ul>


<h2>When to use it</h2>

<ul>
<li><p>When the state or actions of one object depends on the state or actions of another object.</p></li>
<li><p>When changing one object necessitates a change to an unknown number of <em>other</em> objects.</p></li>
<li><p>When an object should be able to notify other objects of changes without knowing anything about these other objects.</p></li>
</ul>


<h2>Pros and Cons</h2>

<ul>
<li><p><strong>Pro:</strong> Very loose coupling between objects.</p></li>
<li><p><strong>Pro:</strong> The ability to broadcast changes and updates.</p></li>
<li><p><strong>Con:</strong> Potentially unexpected updates and sequencing issues.</p></li>
</ul>


<h2>The Many Faces of Observer</h2>

<p>Because of its popularity the Observer pattern often goes by a few different names. The primary objects are the <strong>Subject</strong> and the <strong>Observers</strong> though sometimes they are referred to as <strong>Publisher</strong>/<strong>Subscribers</strong> or <strong>Event Dispatcher</strong>/<strong>Listeners</strong>. Although you can definitely split hairs regarding the actual implementation of this pattern, in essence we&#8217;re usually talking about the same thing. When the Subject&#8217;s state changes it sends out notifications, unaware of who its Observers are. The Observers, in turn, perform some action in response to this update.</p>

<p>I&#8217;m going to heavily quote (*cough* <em>plagiarize</em> *cough*) the wonderful <a href="http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns by Stoyan Stefanov</a> to sum up all the parts of an Observer/Pub-Sub relationship:</p>

<p><em>&#8220;The publisher object needs to have a property <code>subscribers</code> that is an array storing all subscribers. The act of subscription is merely adding to this array. When an event occurs, the publisher loops through the list of subscribers and notifies them. The notification means calling a method of the subscriber object. Therefore, when subscribing, the subscriber provides one of its methods to the publisher’s subscribe() method.</em></p>

<p><em>The publisher can also provide unsubscribe(), which means removing from the array of subscribers. The last important method of the publisher is publish(), which will call the subscribers’ methods.&#8221;</em></p>

<p>Here is Stoyan&#8217;s Pub/Sub implementation. Note that the <code>on</code> function accepts a <code>context</code> argument which allows you to set the handler&#8217;s context and in turn, the value of <code>this</code>. We&#8217;ll discuss this a bit more later.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">publisher</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">subscribers</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">any</span><span class="o">:</span> <span class="p">[]</span> <span class="c1">// event type: subscribers</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">on</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">type</span> <span class="o">=</span> <span class="nx">type</span> <span class="o">||</span> <span class="s1">&#39;any&#39;</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">fn</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">fn</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span> <span class="o">?</span> <span class="nx">fn</span> <span class="o">:</span> <span class="nx">context</span><span class="p">[</span><span class="nx">fn</span><span class="p">];</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="k">this</span><span class="p">.</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">type</span><span class="p">]</span> <span class="o">===</span> <span class="s2">&quot;undefined&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">type</span><span class="p">]</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">type</span><span class="p">].</span><span class="nx">push</span><span class="p">({</span> <span class="nx">fn</span><span class="o">:</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="o">:</span> <span class="nx">context</span> <span class="o">||</span> <span class="k">this</span> <span class="p">});</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">remove</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">visitSubscribers</span><span class="p">(</span><span class="s1">&#39;unsubscribe&#39;</span><span class="p">,</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="p">);</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">fire</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="nx">publication</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">visitSubscribers</span><span class="p">(</span><span class="s1">&#39;publish&#39;</span><span class="p">,</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">publication</span><span class="p">);</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">visitSubscribers</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">arg</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">pubtype</span> <span class="o">=</span> <span class="nx">type</span> <span class="o">||</span> <span class="s1">&#39;any&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">subscribers</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">pubtype</span><span class="p">],</span>
</span><span class='line'>          <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">max</span> <span class="o">=</span> <span class="nx">subscribers</span> <span class="o">?</span> <span class="nx">subscribers</span><span class="p">.</span><span class="nx">length</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">max</span><span class="p">;</span> <span class="nx">i</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">action</span> <span class="o">===</span> <span class="s1">&#39;publish&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="c1">// Call our observers, passing along arguments</span>
</span><span class='line'>              <span class="err"> </span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">fn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">context</span><span class="p">,</span> <span class="nx">arg</span><span class="p">);</span>
</span><span class='line'>          <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">if</span> <span class="p">(</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">fn</span> <span class="o">===</span> <span class="nx">arg</span> <span class="o">&amp;&amp;</span> <span class="nx">subscribers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">context</span> <span class="o">===</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">subscribers</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>In practice using the <code>publisher</code> might look something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">handleLogin</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;we haz a users!&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">publisher</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="s1">&#39;login.complete&#39;</span><span class="p">,</span> <span class="nx">handleLogin</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ... .</span>
</span><span class='line'><span class="c1">// Elaborate user login process...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">publisher</span><span class="p">.</span><span class="nx">publish</span><span class="p">(</span><span class="s1">&#39;login.complete&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Mind the Context</h2>

<p>In JavaScript the keyword <code>this</code> in a function will refer to the context in which the function was called. Sometimes functions are global and sometimes they&#8217;re part of a larger Object. Here&#8217;s a brief example to clarify:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">foobar</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">doWork</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;doing some work...&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">foobar</span><span class="p">.</span><span class="nx">doWork</span><span class="p">();</span> <span class="c1">// `this` will refer to foobar</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">doWorkClone</span> <span class="o">=</span> <span class="nx">foobar</span><span class="p">.</span><span class="nx">doWork</span><span class="p">;</span>
</span><span class='line'><span class="nx">doWorkClone</span><span class="p">();</span> <span class="c1">// `this` will refer to window</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">workClones</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="nx">workClones</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">foobar</span><span class="p">.</span><span class="nx">doWork</span><span class="p">);</span>
</span><span class='line'><span class="nx">workClones</span><span class="p">[</span><span class="mi">0</span><span class="p">]();</span> <span class="c1">// `this` will refer to the workClones Array</span>
</span></code></pre></td></tr></table></div></figure>


<p>The first time we call <code>doWork</code> we do so in the <em>context</em> of the <code>foobar</code> object: <code>foobar.doWork()</code>. As a result the term <code>this</code> inside of the <code>doWork</code> method will refer to <code>foobar</code>.</p>

<p>The second time we call <code>doWork</code> we do so by referencing the method through a variable. We&#8217;re calling <code>doWork</code> using that variable&#8217;s <em>context</em>. But the variable is a global variable, it&#8217;s just hanging out on the page! As a result <code>this</code> will refer to <code>window</code>.</p>

<p>In the third example we&#8217;re stuffing <code>doWork</code> into an array, then referencing it by index, then calling it. In this <em>context</em> <code>doWork</code> is scoped to the <code>workClones</code> Array, since it&#8217;s also an Object. A little confusing I know.</p>

<p>So why do I care?</p>

<p>Well if you go back and look at the <code>publisher</code> example you&#8217;ll notice that we pass a function reference to be called whenever the Subject sends out a notification. In our case it looks like this: <code>publisher.subscribe('login.complete', handleLogin);</code> If <code>handleLogin</code> needs to use <code>this</code> we might be in a world of hurt because <code>publisher</code> is going to call <code>handleLogin</code> using itself as the value of <code>this</code>. Uh oh!</p>

<h2>Preserving Context in Observer</h2>

<p>JavaScript&#8217;s context switching can be really bizarre if you&#8217;ve never had to manage it before. To mitigate this problem we have a handful of useful strategies.</p>

<p>The first one, which is demonstrated in the <code>publisher</code>, is to pass along a <code>context</code> whenever we subscribe a function. This is the third argument to our <code>publisher</code>&#8217;s <code>on</code> method.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">on</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">type</span> <span class="o">=</span> <span class="nx">type</span> <span class="o">||</span> <span class="s1">&#39;any&#39;</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">fn</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">fn</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span> <span class="o">?</span> <span class="nx">fn</span> <span class="o">:</span> <span class="nx">context</span><span class="p">[</span><span class="nx">fn</span><span class="p">];</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="k">this</span><span class="p">.</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">type</span><span class="p">]</span> <span class="o">===</span> <span class="s2">&quot;undefined&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">type</span><span class="p">]</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">type</span><span class="p">].</span><span class="nx">push</span><span class="p">({</span> <span class="nx">fn</span><span class="o">:</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">context</span><span class="o">:</span> <span class="nx">context</span> <span class="o">||</span> <span class="k">this</span> <span class="p">});</span>
</span><span class='line'>  <span class="p">},</span>
</span></code></pre></td></tr></table></div></figure>


<p>By storing the <code>context</code> we ensure that when it&#8217;s time to call our function, we can do so in the correct context with the correct value for <code>this</code>. We do this through the use of JavaScript&#8217;s <code>call</code> method which allows us to define in which context a function should execute.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">subscribers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">fn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">subscribers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">context</span><span class="p">,</span> <span class="nx">arg</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This can be a very powerful feature especially for utility functions. Checkout the MDN docs for a deeper understanding of <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call">call</a> and its cousin <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply">apply.</a></p>

<p>But what if you&#8217;re not using our <code>publisher</code> example? What if you&#8217;re using a slightly more popular library like jQuery to manage your events? Maybe you have some code that looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Substitute `on` for `click` or `delegate` or `live` or</span>
</span><span class='line'><span class="c1">// whatever else you&#39;re using :)</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.login-button&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// tell the app the user is trying to log in!</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well in this case we might have to use a different approach. As anyone who&#8217;s used jQuery knows, the value of <code>this</code> in our handler function is going to refer to the DOM element that jQuery selected. Sometimes that&#8217;s really useful but other times, like in this case, it isn&#8217;t going to do us much good.</p>

<h3>Closures</h3>

<p>Closures are a powerful feature of ECMAScript and they&#8217;re especially useful when passing around functions. The best definition I&#8217;ve found for a closure comes from <a href="http://jibbering.com/faq/notes/closures/">this article:</a></p>

<blockquote><p>The simple explanation of a Closure is that ECMAScript allows inner functions; function definitions and function expressions that are inside the function bodies of other functions. And that those inner functions are allowed access to all of the local variables, parameters and declared inner functions within their outer function(s).</p></blockquote>

<p>So let&#8217;s see that in action.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">loginController</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">init</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.login-button&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">self</span><span class="p">.</span><span class="nx">handleLogin</span><span class="p">();</span> <span class="c1">// use self as a stand in for `this` </span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">handleLogin</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;handling login!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above example the var <code>self</code> exists in a kind of interesting limbo: it is part of <code>loginController's</code> <code>init</code> method and also part of the function registered as the <code>on('click')</code> handler. As a result, when the function is executed, <code>self</code> is still in the context of the <code>loginController</code> object and thus logs <code>handling login!</code></p>

<p>Awesome! We&#8217;ve solved the issue of preserving scope, right? Well, yes but it&#8217;s not our only option. Many people (myself included) find it annoying to sprinkle <code>var self = this</code> all over their app. To mitigate things we also have <code>Function.bind</code>.</p>

<h3>Bindings</h3>

<p>The addition of <code>Function.bind</code> in ECMAScript 5 allows us to specify in which context a function should be called, in other words, <em>binding</em> that function (and the value of <code>this</code>) to a particular context. Let&#8217;s see it in action:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">widget</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;My Awesome Widget!&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">sayName</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">nameFunc</span> <span class="o">=</span> <span class="nx">widget</span><span class="p">.</span><span class="nx">sayName</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">widget</span><span class="p">);</span>
</span><span class='line'><span class="nx">nameFunc</span><span class="p">();</span> <span class="c1">// outputs: &#39;My Awesome Widget!&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Calling <code>Function.bind</code> will actually create a closure preserving whatever scope we&#8217;ve passed in. It returns a clone of our original function but this time it is bound to a particular context. In the above example it&#8217;s bound to the <code>widget</code> object. While it&#8217;s cleaner than our original closure example we&#8217;re still in a dilemma because we want <code>sayName</code> to ALWAYS be called in the context of <code>widget</code>. How about something like this instead: <code>widget.sayName = widget.sayName.bind(widget);</code> Hey, now we&#8217;re talking! By overwriting our function and binding it to our <code>widget</code> object we&#8217;ve gotten very close to how classical languages like Java and Actionscript handle scope! This means it&#8217;s easy to both subscribe and unsubscribe our method, safe in the knowledge that it will always use the proper scope. If you&#8217;re lazy (like me) take some time to research <a href="http://underscorejs.org/">Underscore.js</a> which provides both <a href="http://underscorejs.org/#bind">bind</a> and <a href="http://underscorejs.org/#bindAll">bindAll</a> functions to ease the process of connecting your methods to their parent objects.</p>

<p>I&#8217;ll save you the speech on treating JavaScript like other languages except to say anytime you&#8217;re writing code to make one language act like another you should obviously research whether that&#8217;s the best course of action or not. In my experience I&#8217;ve found that binding observers can make writing event listeners much cleaner but your mileage may vary and comments/feedback are always welcome :D</p>

<p>Also if you want to read more on <code>Function.bind</code> you can do so <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind">here on MDN.</a></p>

<h2>The Push and Pull Model</h2>

<p>Typically when you create a Subject/Observer relationship you&#8217;ll want the Subject to send along additional information during its event dispatch. The amount of information can vary widely. Sometimes you&#8217;ll want to send a lot of information and other times you&#8217;ll want the observers to receive the event and then query for more information. When you&#8217;re sending a lot of information it&#8217;s referred to as the <em>push model</em> and when the Observers should query for more information it&#8217;s referred to as the <em>pull model</em>. The Gang of Four describe the differences between the two:</p>

<blockquote><p>The pull model emphasizes the subject’s ignorance of its observers, whereas the push model assumes subjects know something about their observers’ needs. The push model might make observers less reusable, because Subject classes make assumptions about Observer classes that might not always be true. On the other hand, the pull model may be inefficient, because Observer classes must ascertain what changed without help from the Subject.</p></blockquote>

<p>There&#8217;s no right or wrong approach but it is good to understand the differences between the two.</p>

<h2>PubSub and Observer mixins</h2>

<p>If you want a quick, easy to use event dispatcher the <a href="https://github.com/mroderick/PubSubJS">PubSubJS</a> library does a wonderful job of providing an easy to use event dispatcher. It also includes a jQuery plugin variant if that&#8217;s more your style. If you&#8217;re looking for something a little less global and a bit more OO checkout this utility function from <a href="http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns</a> which mixes-in the <code>publisher</code> to other objects.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">makePublisher</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">i</span><span class="p">;</span><span class="err">   </span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="k">in</span> <span class="nx">publisher</span><span class="p">)</span> <span class="p">{</span><span class="err">     </span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">publisher</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">i</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="k">typeof</span> <span class="nx">publisher</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">===</span> <span class="s2">&quot;function&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">o</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">publisher</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span><span class="err">     </span>
</span><span class='line'>      <span class="p">}</span><span class="err">   </span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">o</span><span class="p">.</span><span class="nx">subscribers</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">any</span><span class="o">:</span> <span class="p">[]</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/observer/">Grab the Example Source</a></h2>

<h2>Related Patterns</h2>

<ul>
<li>Promise: A Promise is an observable token given from one object to another. Promises wrap an operation and notify their observers when the operation either succeeds or fails.</li>
</ul>


<p><small><cite style="color:#AAA;">Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</cite></small></p>

<hr>


<br>


<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<br>


<p>Thanks for reading! If you have questions or feedback please leave a comment below. - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Iterator]]></title>
    <link href="http://robdodson.me/blog/2012/08/10/javascript-design-patterns-iterator/"/>
    <updated>2012-08-10T15:45:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/08/10/javascript-design-patterns-iterator</id>
    <content type="html"><![CDATA[<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<p>If you&#8217;re coming from Ruby or Java you probably think of an Iterator as an object which gives you a consistent interface for traversing a collection of some kind. If you&#8217;re coming from JavaScript or Actionscript you probably just think of an iterator as the <code>i</code> value in a <code>for</code> loop. The term has mixed meanings but in this case we&#8217;re refering to the former, an object which gives us a consistent interface for iterating over a collection of some kind. If you&#8217;ve never used them before that might seem kind of silly. &#8220;If I need to loop over something I&#8217;m just going to loop over it!&#8221; For many use cases that&#8217;s totally fine. Where Iterator objects are useful is in situations where you might need to loop in an async fashion (stopping and restarting) or if you want to preclude an object from knowing too much about the inner workings of a collection.</p>

<!--more-->


<h2>Formal Definition</h2>

<blockquote><p>Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.</p><footer><strong>GoF</strong> <cite>Design Patterns: Elements of Reusable Object-Oriented Software</cite></footer></blockquote>


<h3>Also Known As</h3>

<ul>
<li>Cursor</li>
</ul>


<h2>Example Time</h2>

<p>The code for an Iterator should be pretty easy to grok if you&#8217;ve worked with loops before. Here is a simple example which returns an Iterator for looping over an Array by every third value.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">iterator</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">data</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">10</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">length</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">next</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">element</span><span class="p">;</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">hasNext</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>          <span class="nx">element</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
</span><span class='line'>          <span class="nx">index</span> <span class="o">+=</span> <span class="mi">3</span><span class="p">;</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">hasNext</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">index</span> <span class="o">&lt;</span> <span class="nx">length</span><span class="p">;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">rewind</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">data</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">current</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">data</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}());</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our iterator has a handful of useful operations including <code>next</code>, <code>hasNext</code>, <code>rewind</code> and <code>current</code>.</p>

<p><code>next</code> will return the next value and advance the index by 3.</p>

<p><code>hasNext</code> will check to see if calling <code>next</code> will actually return an item. Good for indicating when we&#8217;ve reached the end of a collection.</p>

<p><code>rewind</code> will reset the index to zero so we can loop over the collection again.</p>

<p><code>current</code> will return the current item at the index without advancing the index.</p>

<p>Let&#8217;s put these into play to see how it works:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="k">while</span><span class="p">(</span><span class="nx">iterator</span><span class="p">.</span><span class="nx">hasNext</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">iterator</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">iterator</span><span class="p">.</span><span class="nx">rewind</span><span class="p">();</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">iterator</span><span class="p">.</span><span class="nx">current</span><span class="p">());</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we ran the above we&#8217;d see the following output in the console.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="mi">1</span>
</span><span class='line'><span class="mi">4</span>
</span><span class='line'><span class="mi">7</span>
</span><span class='line'><span class="mi">10</span>
</span><span class='line'><span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since the iterator is mainting its own state if we need to stop iteration at any point we just don&#8217;t call <code>next</code>. Using exclusively <code>for</code> loops we&#8217;d have to check against a flag of some kind, store our current position and then rebuild the loop starting from that point.</p>

<h2>Not just for Arrays</h2>

<p>As I mentioned before the Iterator gives us a consistent interface for traversing a collection, which means it can iterate over <em>any</em> object. Calendar Dates, Linked Lists, Node Graphs, whatever! Here&#8217;s an example of an iterator that traverses a simple Hash.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">iterator</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">foo</span><span class="o">:</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="nx">bar</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="nx">baz</span><span class="o">:</span> <span class="s1">&#39;baz&#39;</span> <span class="p">},</span>
</span><span class='line'>      <span class="nx">keys</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">data</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">length</span> <span class="o">=</span> <span class="nx">keys</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">next</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">element</span><span class="p">;</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">hasNext</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>          <span class="nx">element</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="nx">keys</span><span class="p">[</span><span class="nx">index</span><span class="p">]];</span>
</span><span class='line'>          <span class="nx">index</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">hasNext</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">index</span> <span class="o">&lt;</span> <span class="nx">length</span><span class="p">;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">rewind</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">data</span><span class="p">[</span><span class="nx">keys</span><span class="p">[</span><span class="nx">index</span><span class="p">]];</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">current</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">data</span><span class="p">[</span><span class="nx">keys</span><span class="p">[</span><span class="nx">index</span><span class="p">]];</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}());</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice how the interface is identical to our previous Iterator? That&#8217;s one of the key aspects to this pattern: Regardless of the <em>type</em> of collection, we can define a consistent interface to loop through it. It also means that the client doesn&#8217;t need to know anything about the implementation of the actual collection, and by wrapping it in a closure we can prevent the client from <em>editing</em> the collection. Personally I like the idea of certain services handing out iterators rather than a wholesale dump of all the data. As always use whichever tool is appropriate for the context.</p>

<p>One quick note regarding Hashes. Previous versions of the ECMA spec did not require that Hash keys be kept in order. While most modern browsers <em>do</em> keep them in order there are some funky inconsistencies. For instance, if you write out the following Hash:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">hash</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">&#39;foo&#39;</span><span class="o">:</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="o">:</span> <span class="s1">&#39;hello&#39;</span><span class="p">,</span> <span class="s1">&#39;2&#39;</span><span class="o">:</span> <span class="s1">&#39;world&#39;</span> <span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Google Chrome will swap the order of the keys such that they appear like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">{</span> <span class="s1">&#39;1&#39;</span><span class="o">:</span> <span class="s1">&#39;hello&#39;</span><span class="p">,</span> <span class="s1">&#39;2&#39;</span><span class="o">:</span> <span class="s1">&#39;world&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="o">:</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span> <span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are some interesting discussions on StackOverflow which cover this topic but it&#8217;s a bit outside the scope of this article. If you&#8217;re interested you can find them here:</p>

<ul>
<li><a href="http://stackoverflow.com/questions/5773950/how-to-keep-an-javascript-object-array-ordered-while-also-maintaining-key-lookup">How to keep an Javascript object/array ordered while also maintaining key lookups?</a></li>
<li><a href="http://stackoverflow.com/questions/3549894/javascript-data-structure-for-fast-lookup-and-ordered-looping">Javascript data structure for fast lookup and ordered looping?</a></li>
</ul>


<h2>JavaScript 1.7</h2>

<p>Although not widely supported yet, JavaScript 1.7 includes a built in Iterator object which can be used to wrap an Array or Hash with just a single line of code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;application/javascript;version=1.7&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">lang</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;JavaScript&#39;</span><span class="p">,</span> <span class="nx">birthYear</span><span class="o">:</span> <span class="mi">1995</span> <span class="p">};</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">it</span> <span class="o">=</span> <span class="nx">Iterator</span><span class="p">(</span><span class="nx">lang</span><span class="p">);</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above script block will not work in Chrome but it should work in the latest version of Firefox. Note the <code>type</code> attribute of the script tag which instructs the interpreter to handle the code as JS 1.7.</p>

<p>For some further reading on the topic checkout the MDN article which covers <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Iterators_and_Generators">Iterators in JavaScript 1.7</a></p>

<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/iterator/">Grab the Example Source</a></h2>

<h2>Related Patterns</h2>

<ul>
<li>Composite: Iterators are often applied to recursive structures such as Composites.</li>
<li>Factory Method: Polymorphic iterators rely on factory methods to instantiate the appropriate Iterator subclass.</li>
<li>Memento: Often used in conjunction with the Iterator pattern. An iterator can use a memento to capture the state of an iteration. The iterator stores the memento internally.</li>
</ul>


<p><small><cite style="color:#AAA;">Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</cite></small></p>

<hr>


<br>


<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<br>


<p>Thanks for reading! If you have questions or feedback please leave a comment below. - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Singleton]]></title>
    <link href="http://robdodson.me/blog/2012/08/08/javascript-design-patterns-singleton/"/>
    <updated>2012-08-08T19:52:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/08/08/javascript-design-patterns-singleton</id>
    <content type="html"><![CDATA[<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<p>Ah yes the Singleton, a pattern whose name lives in infamy. For the uninitiated a little explanation is in order. A Singleton is an object which can only be instantiated one time. Repeated calls to its constructor return the same instance and in this way one can ensure that they don&#8217;t accidentally create, say, two Users in a single User application. Doesn&#8217;t sound too bad, right? Well, if you&#8217;re responsible then it arguably <em>is</em> OK but there are many caveats. Before I get into those though, let&#8217;s throw in the formal definition <em>a la</em> the Gang of Four.</p>

<!--more-->


<h2>Formal Definition</h2>

<blockquote><p>Ensure a class only has one instance, and provide a global point of access to it.</p><footer><strong>GoF</strong> <cite>Design Patterns: Elements of Reusable Object-Oriented Software</cite></footer></blockquote>


<h2>The icky bits</h2>

<p>So I&#8217;m sure some of you are already a little anxious because I used the phrase &#8220;global point of access&#8221; and rightfully you should be. In OO software design <em>global</em> variables and objects are often frowned upon. They break encapsulation and more often than not cause more harm than good. You don&#8217;t want the far flung bits of your app to be able to reach all the way up to the very top and fiddle around with stuff. When that starts to happen, and other objects also rely on those global variables, then any piece of code, anywhere in the project can change something which can in turn break a totally unrelated bit of functionality. Debugging becomes a nightmare because you&#8217;re constantly moving from deeply nested object graphs up to the global scope and then back down again. I one time worked on a <em>major</em> application which I inherited from another developer. It was so riddled with Singletons that any change became a sisyphean ordeal of unintended consiquences and time lost debugging. Needless to say I want to put this warning front and center or else the programming gods would surely smite me.</p>

<h2>Well I&#8217;m done! Fuck this shit&#8230;</h2>

<p>OK before you start running for the hills I want to point out the ways in which Singletons can be useful and then you can make up your mind if they&#8217;re right for you.</p>

<p>Let&#8217;s start with the most obvious one: You&#8217;re probably already using Singletons!</p>

<p>Ever written any code that looks like this?</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">firstName</span><span class="o">:</span> <span class="s1">&#39;John&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">lastName</span><span class="o">:</span> <span class="s1">&#39;Doe&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">sayName</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">firstName</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">lastName</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yep, that&#8217;s a Singleton. Once you create an object literal in JavaScript you&#8217;ve reserved a little piece of memory and no other object will ever be just like that one. Now, depending on the scope you might have only created a local variable but if that <code>user</code> is sitting outside a function then it&#8217;s globally available to anyone who wants to fiddle with it. I guess the most famous Singleton probably looks like this: <code>$</code>. To put it another way, ever notice how you can use jQuery anywhere in your app after you&#8217;ve included it on the page&#8230;? Boom! Singleton!</p>

<p><em>mind blown</em>  &#8230; <em>face off</em> &#8230;</p>

<h2>OK, So they have their uses I guess</h2>

<p>Yes as much as some are probably loathe to admit it, Singletons are quite useful in JavaScript. And as jQuery demonstrates their primary use is to namespace your code.
While other languages like Java or C# have namespaces built in, JavaScript has to emulate them using simple objects.</p>

<p>Consider the following scenario: You have a series of functions hanging out on the page that you frequently use in your program.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">login</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// do some login shtuffs</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">logout</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// do some logout shtuffs</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">addToCart</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// blah, blah blah...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>A few things are going on here&#8230;</p>

<p><em>1. Our functions are polluting the global space.</em>
Since they are just floating around on the page they have to attach to something. With no explicitely declared parent object they get hooked on to the globally available <code>window</code> object.</p>

<p><em>2. They&#8217;re in danger of being overwritten</em>
If we were to accidentally define another global <code>addToCart</code> function or if we brought in a library whose author did the same, it would overwrite the original leading to a really gnarly debugging situation.</p>

<p>Let&#8217;s revise this by creating one (and only one) global object which our code can branch off of.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">NAMESPACE</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">NAMESPACE</span><span class="p">.</span><span class="nx">login</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// do some login shtuffs</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">NAMESPACE</span><span class="p">.</span><span class="nx">logout</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// do some logout shtuffs</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">NAMESPACE</span><span class="p">.</span><span class="nx">addToCart</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// blah, blah blah...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now so long as no one creates an object which also has the name <code>NAMESPACE</code> our code should be safe. From here we can do all sorts of things. We can nest more object literals or we can create constructor functions:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">NAMESPACE</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">NAMESPACE</span><span class="p">.</span><span class="nx">Widget</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">foo</span><span class="p">,</span> <span class="nx">bar</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Some awesome widget code</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">NAMESPACE</span><span class="p">.</span><span class="nx">Widget</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">doSomethingAwesome</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// do something awesome!!!</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">myWidget</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">NAMESPACE</span><span class="p">.</span><span class="nx">Widget</span><span class="p">(</span><span class="s1">&#39;hello&#39;</span><span class="p">,</span> <span class="s1">&#39;world&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Take a look at <a href="https://github.com/mrdoob/three.js/">the Three.js library which</a> relies heavily on this pattern to structure its code.</p>

<h2>But I like constructors!</h2>

<p>OK so maybe object literals aren&#8217;t your thing. That&#8217;s understandable so let me show you a few other ways of writing Singletons.</p>

<p>These first few come from Stoyan Stefanov&#8217;s excellent book <a href="http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752">JavaScript Patterns.</a></p>

<p><strong>Singleton with a cached static property</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">User</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// do we have an existing instance?</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">User</span><span class="p">.</span><span class="nx">instance</span> <span class="o">===</span> <span class="s1">&#39;object&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">User</span><span class="p">.</span><span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// proceed as normal</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">firstName</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">lastName</span> <span class="o">=</span> <span class="s1">&#39;Doe&#39;</span><span class="p">;</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// cache</span>
</span><span class='line'>  <span class="nx">User</span><span class="p">.</span><span class="nx">instance</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1">// implicit return</span>
</span><span class='line'>  <span class="c1">// return this;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The cached static property is publicly available which adds a little danger (someone could say <code>Universe.instance = foo</code>) but this version is very straightforward and doesn&#8217;t require closures and funky prototype work. If you&#8217;re lazy this might be a good approach.</p>

<p><strong>Singleton with a closure</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">User</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// the cached instance</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// rewrite the constructor</span>
</span><span class='line'>  <span class="nx">User</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// carry over the prototype</span>
</span><span class='line'>  <span class="nx">User</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// the instance</span>
</span><span class='line'>  <span class="nx">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// reset the constructor pointer</span>
</span><span class='line'>  <span class="nx">instance</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">=</span> <span class="nx">User</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// all the functionality</span>
</span><span class='line'>  <span class="nx">instance</span><span class="p">.</span><span class="nx">firstName</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">instance</span><span class="p">.</span><span class="nx">lastName</span> <span class="o">=</span> <span class="s1">&#39;Doe&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This version takes a bit of fiddling to get the prototype to work as expected because we rewrite the constructor. The upshot is that <code>instance</code> is now private (being contained within the closure).</p>

<p><strong>Singleton with a self executing function</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">User</span><span class="p">;</span>
</span><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">User</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">User</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">instance</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">instance</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// all the functionality</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">firstName</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</span><span class="p">;</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">lastName</span> <span class="o">=</span> <span class="s1">&#39;Doe&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}());</span>
</span></code></pre></td></tr></table></div></figure>


<p>By wrapping the instance variable in a self executing function we make it private. This version doesn&#8217;t require any prototype or constructor reassignment but it may potentially confuse people who aren&#8217;t comfortable with self executing functions.</p>

<p>Addy Osmani also defines a Singleton pattern in his book <a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript">Essential JavaScript Design Patterns.</a></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">mySingleton</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Instance stores a reference to the Singleton</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">init</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Singleton</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Private methods and variables</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">privateMethod</span><span class="p">(){</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="s2">&quot;I am private&quot;</span> <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">privateVariable</span> <span class="o">=</span> <span class="s2">&quot;Im also private&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Public methods and variables</span>
</span><span class='line'>      <span class="nx">publicMethod</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="s2">&quot;The public can see me!&quot;</span> <span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">publicProperty</span><span class="o">:</span> <span class="s2">&quot;I am also public&quot;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Get the Singleton instance if one exists</span>
</span><span class='line'>    <span class="c1">// or create one if it doesn&#39;t</span>
</span><span class='line'>    <span class="nx">getInstance</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="nx">instance</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">instance</span> <span class="o">=</span> <span class="nx">init</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="nx">instance</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="p">})();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Usage:</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">singleA</span> <span class="o">=</span> <span class="nx">mySingleton</span><span class="p">.</span><span class="nx">getInstance</span><span class="p">();</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">singleB</span> <span class="o">=</span> <span class="nx">mySingleton</span><span class="p">.</span><span class="nx">getInstance</span><span class="p">();</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="nx">singleA</span> <span class="o">===</span> <span class="nx">singleB</span> <span class="p">);</span> <span class="c1">// true</span>
</span></code></pre></td></tr></table></div></figure>


<p>This much more elaborate example allows us to define both private and public methods of our Singleton object at the cost of being a bit more complex than all the others.</p>

<p>As Addy is quick to point out:</p>

<blockquote><p>Whilst the Singleton has valid uses, often when we find ourselves needing it in JavaScript it&#8217;s a sign that we may need to re-evaluate our design.</p>

<p>They&#8217;re often an indication that modules in a system are either tightly coupled or that logic is overly spread across multiple parts of a codebase. Singletons can be more difficult to test due to issues ranging from hidden dependencies, the difficulty in creating multiple instances, difficulty in stubbing dependencies and so on.</p></blockquote>

<p>Definitely read <a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript">his full article</a> on the subject since it contains a handful of links to interesting side topics.</p>

<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/singleton/">Grab the Example Source</a></h2>

<h2>Related Patterns</h2>

<p>Many patterns can be implemented using the Singleton pattern. See Abstract Factory, Builder, and Prototype.</p>

<p><small><cite style="color:#AAA;">Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</cite></small></p>

<hr>


<br>


<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<br>


<p>Thanks for reading! If you have questions or feedback please leave a comment below. - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Strategy]]></title>
    <link href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns-strategy/"/>
    <updated>2012-08-03T15:12:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/08/03/javascript-design-patterns-strategy</id>
    <content type="html"><![CDATA[<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<p>The Strategy pattern is one of my personal favorites and you&#8217;ve probably seen or used it in some fashion without even knowing it. Its primary purpose is to help you separate the parts of an object which are subject to change from the rest of the static bits. Using Strategy objects versus subclasses can often result in much more flexible code since you&#8217;re creating a suite of easily swappable algorithms.</p>

<!--more-->


<h2>Formal Definition</h2>

<blockquote><p>Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.</p><footer><strong>GoF</strong> <cite>Design Patterns: Elements of Reusable Object-Oriented Software</cite></footer></blockquote>


<h3>Also Known As</h3>

<ul>
<li>Policy</li>
</ul>


<h2>Contrived Example Time!</h2>

<p>Let&#8217;s say you&#8217;re making a game and you have a Character class. This game has all sorts of different terrain types so your character can run through open fields, walk slowly through swamps or swim under the ocean. Since you don&#8217;t know what kind of other terrains the game designer is going to think up you decide that it would be a bad idea to give each character <code>run</code>, <code>walk</code>, and <code>swim</code> methods. After all, what if suddenly the character needs to <code>fly</code> or <code>crawl</code>? What if they&#8217;re wounded and they need to <code>limp</code>? This situation could potentially get out of hand very fast&#8230;</p>

<p>There&#8217;s a good chance you&#8217;ve seen or written code like this before:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">move</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">state</span> <span class="o">===</span> <span class="s1">&#39;walking&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// do some walk animation</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">state</span> <span class="o">===</span> <span class="s1">&#39;running&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// do some running animation</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">state</span> <span class="o">===</span> <span class="s1">&#39;swimming&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// do some swimming animation</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>When you see a big conditional like that or a switch statement it&#8217;s time to stop and wonder if there&#8217;s a better way. For instance if we need to subclass our Character we&#8217;re going to have to override that big conditional. What if we only want to replace the <code>swimming</code> bit? We&#8217;ll have to copy and paste the code from the super class for <code>walking</code> and <code>running</code> and then write new code specifically for <code>swimming</code>. And of course if <code>walking</code> and <code>running</code> ever change we&#8217;re totally screwed.</p>

<h3>We need a Strategy to deal with this</h3>

<p>Ok so we know that our character is going to be a real contortionist and need to run and jump and crab-walk all over the place. What if we took the code that made her run and we put it in its own object? How about we just define a Class for movements and we do this for all the different kinds of motion? Then when we need to move our Character we&#8217;ll just tell it to defer to one of these Movement objects.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Movement</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">func</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">move</span> <span class="o">=</span> <span class="nx">func</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Movement</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">execute</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">move</span><span class="p">();</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">running</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Movement</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hey I&#39;m running!&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">walking</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Movement</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Just walking along...&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now when we want to tell our character to move in a different way we&#8217;ll just update which Movement object its currently referencing.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">changeMovementType</span><span class="p">(</span><span class="nx">movement</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">movement</span> <span class="o">=</span> <span class="nx">movement</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">move</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">movement</span><span class="p">.</span><span class="nx">execute</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In practice you might have something that looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">running</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Movement</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hey I&#39;m running!&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">walking</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Movement</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Just walking along...&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create a hero and walk through a peaceful forest...</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">hero</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Character</span><span class="p">();</span>
</span><span class='line'><span class="nx">hero</span><span class="p">.</span><span class="nx">changeMovementType</span><span class="p">(</span><span class="nx">walking</span><span class="p">);</span>
</span><span class='line'><span class="nx">hero</span><span class="p">.</span><span class="nx">move</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ... OH NO MOTHERFUCKIN&#39; DINOSAURS!!!</span>
</span><span class='line'>
</span><span class='line'><span class="nx">hero</span><span class="p">.</span><span class="nx">changeMovementType</span><span class="p">(</span><span class="nx">running</span><span class="p">);</span>
</span><span class='line'><span class="nx">hero</span><span class="p">.</span><span class="nx">move</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now it&#8217;s easy for us to add as many different kinds of motion as our little game designer can dream up. Want to give the character gas-powered robotic legs? No problem!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">robotlegs</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Movement</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Cruisin for oil...Look out humans!&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">hero</span><span class="p">.</span><span class="nx">changeMovementType</span><span class="p">(</span><span class="nx">robotlegs</span><span class="p">);</span>
</span><span class='line'><span class="nx">hero</span><span class="p">.</span><span class="nx">move</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h2>When to use it</h2>

<p>When you have a part of your Class that&#8217;s subject to change frequently or perhaps you have many related subclasses which only differ in behavior it&#8217;s often a good time to consider using a Strategy pattern.</p>

<p>Another benefit of the Strategy pattern is that it can hide complex logic or data that the client doesn&#8217;t need to know about.</p>

<h2>The Painting App</h2>

<p>For a real world example of when to use Strategy objects consider your typical painting program. Often times you will offer a variety of different brush types to your user but you don’t want to have to change the fundamentals of how a mark shows up on screen every time the user decides to switch from a round to a square brush. Why not wrap those specific implementations in their own brush objects and later on when the user clicks to draw something to screen we’ll just defer to one of those brushes.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Grab a reference to the canvas and the drawing context</span>
</span><span class='line'><span class="nx">$canvas</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#painter&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">context</span> <span class="o">=</span> <span class="nx">$canvas</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">getContext</span><span class="p">(</span><span class="s1">&#39;2d&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Define our brush strategy objects</span>
</span><span class='line'><span class="nx">brushes</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">outline</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">draw</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">context</span><span class="p">.</span><span class="nx">strokeRect</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">pageX</span> <span class="o">-</span> <span class="nx">offsetLeft</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">pageY</span> <span class="o">-</span> <span class="nx">offsetTop</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">square</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">draw</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">context</span><span class="p">.</span><span class="nx">fillRect</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">pageX</span> <span class="o">-</span> <span class="nx">offsetLeft</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">pageY</span> <span class="o">-</span> <span class="nx">offsetTop</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">circle</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">draw</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">context</span><span class="p">.</span><span class="nx">arc</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">pageX</span> <span class="o">-</span> <span class="nx">offsetLeft</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">pageY</span> <span class="o">-</span> <span class="nx">offsetTop</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">*</span> <span class="mi">2</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">context</span><span class="p">.</span><span class="nx">fill</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span> <span class="p">.</span>
</span><span class='line'>
</span><span class='line'><span class="nx">brush</span> <span class="o">=</span> <span class="nx">brushes</span><span class="p">.</span><span class="nx">square</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we see that <code>brushes.outline</code>, <code>brushes.square</code>, and <code>brushes.circle</code> each implement a consistent interface for the <code>draw</code> call. However their exact implementation changes from one brush to the next. <code>brushes.outline</code> will only draw the stroke of a rectangle, whereas <code>brushes.square</code> and <code>brushes.circle</code> will fill their respective shapes in. Elsewhere in the program we set our initial brush to a default of brushes.square. When the users presses their mouse and moves it around screen we can defer to whichever Strategy the brush object is currently referencing:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Listen for mouse events on the canvas</span>
</span><span class='line'><span class="nx">$canvas</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;mousedown&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">isDrawing</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;mouseup mouseleave&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">isDrawing</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;mousemove&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">isDrawing</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// Defer drawing to a Strategy object</span>
</span><span class='line'>          <span class="nx">brush</span><span class="p">.</span><span class="nx">draw</span><span class="p">(</span><span class="nx">e</span><span class="p">,</span> <span class="nx">context</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again notice that <code>.on('mousemove')</code> we first check to see if it’s ok to draw something and then defer to whichever Strategy is currently being referenced. Using this approach we can add limitless new brush types to the <code>brushes</code> object and easily change how our program performs at runtime. Be sure to check out the live example and the source for the full application.</p>

<h3><a href="http://robdodson.s3.amazonaws.com/javascript-design-patterns/strategy/painter/index.html">Live Example</a></h3>

<h2><a href="https://github.com/robdodson/JavaScript-Design-Patterns/tree/master/strategy/">Grab the Example Source</a></h2>

<h2>Related Patterns</h2>

<ul>
<li>Flyweight: Strategy objects often make good flyweights.</li>
</ul>


<p><small><cite style="color:#AAA;">Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994-10-31). Design Patterns: Elements of Reusable Object-Oriented Software. Pearson Education (USA).</cite></small></p>

<hr>


<br>


<h4><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/">Table of Contents</a></h4>

<br>


<p>Thanks for reading! If you have questions or feedback please leave a comment below. - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Design Patterns: Table of Contents]]></title>
    <link href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns/"/>
    <updated>2012-08-03T09:39:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/08/03/javascript-design-patterns</id>
    <content type="html"><![CDATA[<h3>Creational</h3>

<ul>
<li>Abstract Factory</li>
<li>Builder</li>
<li>Factory Method</li>
<li>Object Pool</li>
<li>Prototype</li>
<li><a href="http://robdodson.me/blog/2012/08/08/javascript-design-patterns-singleton/">Singleton</a></li>
</ul>


<h3>Structural</h3>

<ul>
<li>Adapter</li>
<li>Bridge</li>
<li>Composite</li>
<li><a href="http://robdodson.me/blog/2012/08/27/javascript-design-patterns-decorator/">Decorator</a></li>
<li>Facade</li>
<li>Flyweight</li>
<li>Private Class Data</li>
<li>Proxy</li>
</ul>


<h3>Behavioral</h3>

<ul>
<li>Chain of Responsibility</li>
<li>Command</li>
<li>Interpreter</li>
<li><a href="http://robdodson.me/blog/2012/08/10/javascript-design-patterns-iterator/">Iterator</a></li>
<li>Mediator</li>
<li>Memento</li>
<li>Null Object</li>
<li><a href="http://robdodson.me/blog/2012/08/16/javascript-design-patterns-observer/">Observer</a></li>
<li>State</li>
<li><a href="http://robdodson.me/blog/2012/08/03/javascript-design-patterns-strategy/">Strategy</a></li>
<li>Template Method</li>
<li>Visitor</li>
<li>Monad Pattern / Promises</li>
</ul>


<p>I&#8217;ve been trying to think up <a href="http://robdodson.me/blog/2012/06/25/ending-my-first-chain/">a new chain</a> since coming back from Europe but nothing was enticing me. Then a few days ago I had a conversation with one of my friends in which we discussed using Promises in JavaScript. And later on we discussed Builders. I was doing my best to explain the two but really wished that I had a resource where I could just show some simple code examples. It occurred to me that I&#8217;ve always wanted to go through the <a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;qid=1344014497&amp;sr=8-1&amp;keywords=design+patterns">Gang of Four book</a> and just write my own interpretation of each pattern. Since I&#8217;m currently working primarily in JavaScript I thought it might be an interesting challenge to convert their examples, often in strongly typed languages, to something as dynamic and loosey-goosey as JS.</p>

<!--more-->


<p>I know there are a lot of people out there who <a href="http://www.codinghorror.com/blog/2005/09/head-first-design-patterns.html">aren&#8217;t too</a> <a href="http://thinkrelevance.com/blog/2007/05/17/design-patterns-are-code-smells">keen on</a> design patterns but that&#8217;s not to say that they shouldn&#8217;t be used or studied. There&#8217;s a lot of code out there that starts with <code>jQuery.click()</code> or <code>addEventListener</code> or <code>.on()</code> and all of them are implementations of the Observer pattern. Finding this reusable approach is the main point of patterns and along with it comes a shared vocabulary that can be passed on to other developers. Rather than saying &#8220;Let&#8217;s defer the methods of our object that are subject to change to well encapsulated algorithms.&#8221; We can just say &#8220;A Strategy pattern might be nice here.&#8221;</p>

<p>Patterns should be used with caution as not everything fits so neatly into their paradigms. It&#8217;s often said that a beginner never met a pattern he didn&#8217;t like. In my experiences I&#8217;ve been burned by pattern overuse and at other times they have legitimately saved my ass. It&#8217;s also true that many patterns don&#8217;t really work or aren&#8217;t appropriate for particular languages. For instance, the GoF book was written <em>primarily for languages which shared features of C++ and SmallTalk</em>. I totally agree with this sentiment but I feel like along the way we&#8217;ll discover what does and doesn&#8217;t make sense in a dynamic language like JS and hopefully we can toss in some new patterns of our own. Already to the list I&#8217;ve added Promises which I use quite frequently and find to be a wonderful alternative to JavaScript&#8217;s oft seen pyramid of callbacks.
Again, this is all about learning and experimenting. In my opinion a good understanding of design patterns is a threshold that needs to be crossed at some point in your career. I’m committed to doing this twice a week for the next several weeks so hopefully by the end of it we’ll have a useful resource that others can benefit from. Stay tuned!</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ending My First Chain]]></title>
    <link href="http://robdodson.me/blog/2012/06/25/ending-my-first-chain/"/>
    <updated>2012-06-25T22:58:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/06/25/ending-my-first-chain</id>
    <content type="html"><![CDATA[<p>On April 28th, <a href="http://www.facebook.com/photo.php?fbid=964312982287&amp;set=a.616835240467.2181266.39601696&amp;type=1">I vowed to write a blog post a day until I had to go to Europe.</a> Of course the real threat was that if I failed to do so I would have to give 500 dollars to the Republican party, most likely to John Boehner. In my original post I said I would write till the 27th but I&#8217;ve moved that date up so I can spend tomorrow night packing and wrapping things up in the city before I head out on my trip. So tonight&#8217;s post will mark the end of my first chain which means it&#8217;s time for a little post-mortem.</p>

<!--more-->


<h2>Why Did I Do It?</h2>

<p>Everything started because of a <a href="http://japhr.blogspot.com/2012/04/366-or-how-i-tricked-myself-into-being.html">blog post written by a fellow named Chris Strom.</a> Chris wrote every single day, for a year, and in that time he managed to self publish 3 books. I think many people would be happy to publish a book in like a couple years. At Chris&#8217; rate he was cranking one out nearly every 3-4 months. Amazing.</p>

<p>I started thinking&#8230; this whole writing thing has got to be like exercise. If you just will yourself to do it, it&#8217;ll be hard at first but after a while <em>surely</em> it becomes a habit. And who doesn&#8217;t want to be in the habit of exercising more?</p>

<p>Writing, self-reflection, discovery&#8230; these are <em>really</em> important. I get by in my career by reading the stuff that other people have been generous enough to put down on the page (or blog, as the case may be). If I have a problem I just type it into the little magical Google box and out pops an answer.</p>

<h1>That&#8217;s fucking incredible!</h1>

<p>But that system doesn&#8217;t exist unless some of us pay back into it. None of this information that we take for granted is being churned out by some machine. It&#8217;s churned out by people! And do you know how hard it is to churn out meaningful, useful information with depth and substance and ethos?</p>

<h1>It&#8217;s fucking hard!</h1>

<p>And because it&#8217;s hard, like exercise, most of us don&#8217;t do it. Well I say, fuck that! We can all be better at what we do, especially if it&#8217;s going to be our life&#8217;s work. For me that means setting aside some time to work a little extra and write about my successes and failures. It means willing myself to push beyond what I normally think I can do and hoping that if I stick with it, eventually pieces will fall into place, doors will unlock, and the heavens will rain cheeseburgers and High West rye whiskey.</p>

<h2>What Did I Learn?</h2>

<p>In the process of writing every day, for 60 days, I learned a ton. My posts were at times very scattershot, Ruby one day, D3.js the next, random Sublime tips after that, etc etc etc. I get frustrated and I need to switch gears. This is something I have to work on.</p>

<p>There was a part of me that didn&#8217;t think I would be able to go all 60 days. I have been a total quitter more times than I&#8217;d like to admit and the older I get the more I realize what a massive disservice that is to one&#8217;s self. Finishing isn&#8217;t the most important thing, it&#8217;s the <em>only</em> thing. It doesn&#8217;t matter if you finish in a fucked up death race mobile covered in sinew and tree branches&#8230; just finish!</p>

<h2>What&#8217;s Next?</h2>

<p>So what now?</p>

<p>Well I&#8217;ve got two ideas kicking around. One is to keep following in Chris&#8217; steps and to self publish a book. I was dead set on this until a very fateful evening when I watched <a href="http://buy.indiegamethemovie.com/">Indie Game: The Movie.</a> Now I can&#8217;t get the idea of self-publishing a <em>very</em> tiny game out of my mind&#8230; Thankfully I have 3 weeks in Europe to think it over :D - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

<ul class="personal-stats">
    <li>Mood: Tired, Relaxed</li>
    <li>Sleep: 6</li>
    <li>Hunger: 8</li>
    <li>Coffee: 1</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sublime Snippet Basics]]></title>
    <link href="http://robdodson.me/blog/2012/06/24/sublime-snippet-basics/"/>
    <updated>2012-06-24T22:48:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/06/24/sublime-snippet-basics</id>
    <content type="html"><![CDATA[<p><a href="http://robdodson.me/blog/2012/06/23/sublime-text-2-tips-and-shortcuts/">Yesterday I covered some tips and tricks</a> I&#8217;ve learned over the past few months of using Sublime. Something I didn&#8217;t touch on is Sublime&#8217;s Snippet architecture.</p>

<!--more-->


<p>Essentially a snippet is a little piece of code that gets executed when you type some characters and hit the <code>tab</code> key. For instance I have a snippet that spits out <code>console.log()</code> whenever I type <code>lg</code> and press <code>tab</code>. One clever feature of snippets is that they can be bound to a keyboard shortcut if the key binding calls the <code>insert_snippet</code> command and passes the path to the snippet file as an argument. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="nt">&quot;keys&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;super+shift+r&quot;</span><span class="p">],</span>
</span><span class='line'>    <span class="nt">&quot;command&quot;</span><span class="p">:</span> <span class="s2">&quot;insert_snippet&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nt">&quot;args&quot;</span><span class="p">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Packages/XML/long-tag.sublime-snippet&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That will tell Sublime that when I press <code>cmd+shift+r</code> it should act as if I triggered the long-tag snippet for XML files. Basically that will let me highlight some text, hit <code>cmd+shift+r</code> and then I can type some HTML or XML tags to wrap my text. Cool. So let&#8217;s go about writing our own snippet to learn a bit more about this process.</p>

<h2>Getting Started</h2>

<p>The previously mentioned snippet is great for wrapping an item in HTML/XML tags but it totally breaks if we need to wrap our selection in anything not existing within brackets: <code>&lt;/&gt;</code>. Since I write a lot of Markdown I&#8217;m always wrapping text in some kind of markdown syntax, <code>*like this*</code>, but there&#8217;s no easy way to do this. The aforementioned snippet is close so we&#8217;re going to copy it and tweak it to do what we need.</p>

<p><a href="http://docs.sublimetext.info/en/latest/reference/snippets.html">The documentation on snippets for Sublime is short and full of good information. I suggest you read it before continuing on.</a></p>

<p>We&#8217;re going to copy the file located at <code>/Library/Application\ Support/Sublime\ Text\ 2/Packages/XML</code> and move it into our <code>/Packages/User</code> directory. I chose to rename the file to <code>wrap-anything.sublime-snippet</code>. The original snippet looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;snippet&gt;</span>
</span><span class='line'>    <span class="nt">&lt;content&gt;</span><span class="cp">&lt;![CDATA[&lt;${1:p}&gt;${2:$SELECTION}&lt;/${1/([^ ]+).*/$1/}&gt;]]&gt;</span><span class="nt">&lt;/content&gt;</span>
</span><span class='line'>    <span class="nt">&lt;tabTrigger&gt;</span><span class="ni">&amp;lt;</span><span class="nt">&lt;/tabTrigger&gt;</span>
</span><span class='line'>    <span class="nt">&lt;scope&gt;</span>text.xml<span class="nt">&lt;/scope&gt;</span>
</span><span class='line'>    <span class="nt">&lt;description&gt;</span>Long Tag<span class="nt">&lt;/description&gt;</span>
</span><span class='line'><span class="nt">&lt;/snippet&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>&lt;content&gt;</code> is where we put everything that&#8217;s going to be spit out by our snippet when it&#8217;s executed. Items are wrapped in a <code>CDATA</code> tag so they don&#8217;t interfere with the rest of the XML.</p>

<p>The first part <code>&lt;${1:p}&gt;</code> outputs a <code>&lt;</code> followed by a variable, <code>$1</code> which has a default value of the letter &#8220;p&#8221; and it closes with a <code>&gt;</code>. If our snippet only contained this bit of code then when we ran it the output would be <code>&lt;p&gt;</code>.</p>

<p>The second part uses one of the environment variables <a href="http://docs.sublimetext.info/en/latest/reference/snippets.html">talked about in the snippet documentation.</a> <code>$SELECTION</code> will take whatever we&#8217;ve highlighted and make it part of the snippet output. You&#8217;ll notice this variable is prefixed with a <code>2:</code> meaning it&#8217;s our second variable and it&#8217;s default output is going to be whatever was highlighted. The 2 also indicates that if the user hits <code>tab</code> this is the second place they&#8217;ll go.</p>

<p>The third part contains a block of regex which, I think, just matches whatever the user types after the snippet has executed. My regex sucks so correct me if I&#8217;m wrong.</p>

<p><code>&lt;tabTrigger&gt;</code> indicates what character should be typed before hitting <code>tab</code> to fire off the snippet. In this case it&#8217;s a <code>&lt;</code></p>

<p><code>&lt;scope&gt;</code> defines where the snippet should run I believe.. But I&#8217;m not entirely sure. The documentation just says &#8220;Scope selector to activate this snippet.&#8221; I didn&#8217;t see a text.xml file anywhere in the <code>Packages/XML/</code> folder and I know this snippet works in non-xml files so&#8230;yeah&#8230;<em>shrug</em></p>

<p><code>&lt;description&gt;</code> lets you describe the thing. duh.</p>

<p>OK let&#8217;s make our own simplified snippet:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;snippet&gt;</span>
</span><span class='line'>    <span class="nt">&lt;content&gt;</span><span class="cp">&lt;![CDATA[${1:`}${2:$SELECTION}${1}]]&gt;</span><span class="nt">&lt;/content&gt;</span>
</span><span class='line'>    <span class="nt">&lt;tabTrigger&gt;&lt;/tabTrigger&gt;</span>
</span><span class='line'>    <span class="nt">&lt;scope&gt;&lt;/scope&gt;</span>
</span><span class='line'>    <span class="nt">&lt;description&gt;</span>Wrap any block of text<span class="nt">&lt;/description&gt;</span>
</span><span class='line'><span class="nt">&lt;/snippet&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our snippet is less sophisticated than the previous one since we&#8217;ve excluded the regex. With the above snippet located in our <code>Packages/User/</code> folder we can tie it to a keyboard shortcut like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span> <span class="nt">&quot;keys&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;super+r&quot;</span><span class="p">],</span> <span class="nt">&quot;command&quot;</span><span class="p">:</span> <span class="s2">&quot;insert_snippet&quot;</span><span class="p">,</span> <span class="nt">&quot;args&quot;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Packages/User/wrap-anything.sublime-snippet&quot;</span> <span class="p">}</span> <span class="p">}</span><span class="err">,</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now when we hit <code>cmd+r</code> it will let us wrap our current selection in whatever we want :)</p>

<p>For good measure here&#8217;s a really useful console.log snippet that&#8217;s triggered by typing <code>lg</code> and then pressing <code>tab</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;snippet&gt;</span>
</span><span class='line'>    <span class="nt">&lt;content&gt;</span><span class="cp">&lt;![CDATA[console.log(${1});]]&gt;</span><span class="nt">&lt;/content&gt;</span>
</span><span class='line'>    <span class="nt">&lt;tabTrigger&gt;</span>lg<span class="nt">&lt;/tabTrigger&gt;</span>
</span><span class='line'>    <span class="nt">&lt;scope&gt;</span>source.js<span class="nt">&lt;/scope&gt;</span>
</span><span class='line'>    <span class="nt">&lt;description&gt;</span>console.log()<span class="nt">&lt;/description&gt;</span>
</span><span class='line'><span class="nt">&lt;/snippet&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>No need to bind this to a keyboard shortcut (unless you want to) because it defines a tab trigger. I know this wasn&#8217;t super in-depth but hopefully it gives you a little bit of a start. <a href="http://docs.sublimetext.info/en/latest/reference/snippets.html">Read the documentation on snippets</a> and tighten up your regex! - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

<ul class="personal-stats">
    <li>Mood: Tired, Lazy</li>
    <li>Sleep: 5</li>
    <li>Hunger: 0</li>
    <li>Coffee: 1</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sublime Text 2 Tips and Shortcuts]]></title>
    <link href="http://robdodson.me/blog/2012/06/23/sublime-text-2-tips-and-shortcuts/"/>
    <updated>2012-06-23T22:28:00-07:00</updated>
    <id>http://robdodson.me/blog/2012/06/23/sublime-text-2-tips-and-shortcuts</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been using Sublime Text 2 for probably two months now and in that time I&#8217;ve discovered tons of useful tricks. I figured I should start writing them down for anyone who might be interested. I&#8217;ll try to explain the bits that seem esoteric because there are a lot of cool commands which only work in certain contexts.</p>

<!--more-->


<h2>Finding your preferences</h2>

<p>One of the first things you want to do with Sublime is to find your User key bindings. They&#8217;re located under <code>Sublime Text 2 &gt; Preferences &gt; Key Bindings - User</code></p>

<p>Sublime Text is very DIY so there isn&#8217;t a fancy GUI to help you change keyboard shortcuts. Instead you use the preference file to override the default shortcuts. Like a lot of things in Sublime, this can at first seem annoying and non-intuitive. That is, until you realize that by doing it this way Sublime has actually given you the power to make <em>extremely</em> awesome key bindings. Take some time to look around in this file. I still only understand a fraction of what all it does but the little bits I learn here and there give me all sorts of ideas for new shortcuts. Just remember, if you want to change a keyboard shortcut you should do it in the User&#8217;s key bindings and not the Default key bindings.</p>

<p><strong>Pro Tip:</strong> If you ever want to change a keyboard shortcut but can&#8217;t figure out what command is currently running open up Sublime&#8217;s built in terminal with <code>ctrl+`</code> then type <code>sublime.log_commands(True)</code>. Now when you execute your command from the menu you should see its name show up in the console. Just remember to turn logging off when you&#8217;re done :)</p>

<h2>Sublime Package Control</h2>

<p>If you only follow one piece of my advice make it this: <a href="http://wbond.net/sublime_packages/package_control">Install Sublime Package Control.</a></p>

<p>Package Control makes it extremely easy to manage your Sublime plugins. It also helps with discovering new ones, which is nice. Just install it if you haven&#8217;t already, it&#8217;s impossible to live without.</p>

<h2>Setting up a command line shortcut</h2>

<p>I highly recommend setting up a symlink so you can easily open things with Sublime. <a href="http://www.sublimetext.com/docs/2/osx_command_line.html">This article details how to go about it on OSX.</a></p>

<p>CLI FTW!</p>

<h2>The Command Palette</h2>

<p>OK, so hopefully you&#8217;ve setup Sublime Package Control. Maybe you&#8217;ve even installed some plugins. It&#8217;s time for you to meet the Command Palette then. <code>cmd+shift+p</code> will open up the window and from here you can execute just about any command either native to Sublime or part of a plugin. It is super useful for all those things you don&#8217;t run often enough to turn into full blown keyboard shortcuts. It&#8217;s also useful if you know the name of a command but can&#8217;t remember what section of the menu it lives under.</p>

<h2>Goto Anything&#8230;</h2>

<p>So you want to fly around your project like a ninja on methamphetamines, eh? Then the shortcut you want is <code>cmd+p</code>. Once you&#8217;ve opened the dialog try typing a filename. Useful right? But wait, there&#8217;s more&#8230;</p>

<p>If you preface what you&#8217;re typing with a <code>@</code> it will look for &#8220;symbols&#8221; in the current file. Ex: <code>@foobar</code>. But just typing <code>@</code> will give you a nice file outline. The definition of what a symbol is depends on the file-type. In a Markdown file, for instance, it will list every header. In a JavaScript or Ruby file it will list every method of an object.</p>

<p>One last trick. If instead of an <code>@</code> you preface things with an <code>:</code> you can type a line number instead and hit enter to jump to that point. Ex: <code>:415</code></p>

<p>There are other keyboard shortcuts for jumping to a line and going to a symbol but why bother when you can just use <code>cmd+p</code> and some easy prefixing.</p>

<h2>Splitting the editor windows</h2>

<p>OK this one is also important and I can&#8217;t recommend it enough. <strong>Learn to split your editor windows.</strong> I never used this feature in previous IDEs and now I wonder how I ever lived without it. Whether you have a unit test in one window and an implementation in the other, or some HTML and CSS, this feature is just always handy.</p>

<p><img class="center" src="https://s3.amazonaws.com/robdodson/images/sublime-split-panes.png" title="'Split windows in Sublime'" ></p>

<p>I <em>live</em> in split panes. They&#8217;ve changed my workflow significantly for the better. Less time switching between files and finding your place is an incredible advantage. You can access them through <code>View &gt; Layouts</code>. It will behoove you to learn these keyboard shortcuts. Also learn the shortcuts for <code>View &gt; Focus Group</code> and <code>View &gt; Move File to Group</code>.</p>

<h2>Selections</h2>

<p>There are some neat selections which come in handy depending on your context. Personally I use Expand Selection to Tag, <code>cmd+shift+a</code> quite frequently when writing HTML. I also use Expand Selection to Line, <code>cmd+L</code> and Expand Selection to Word, <code>cmd+D</code> a lot.</p>

<h2>Selections with Multiple Cursors</h2>

<p>Multiple cursors&#8230; It&#8217;s one of those things you didn&#8217;t realize you needed until suddenly you had it and you were all like &#8220;WHAAAAAAAAT!&#8221;</p>

<p>There are a handful of ways to activate multiple cursors in Sublime. Hitting <code>cmd+D</code> to select multiples of the same word will put us into a multi-cursor context.</p>

<p>Another way to go about it is to highlight a block of text and hit <code>cmd+shift+L</code> which will split each line into its own selection. This is extremely useful when editing HTML where often times you have repeating elements and you want to tweak a class name on all of them.</p>

<p>You can also just hold <code>cmd</code> and click around your file to add more cursors. Or you can hold <code>ctrl+shift</code> and tap either the up or down arrows to add a new cursor in that direction.</p>

<h2>Moving Lines</h2>

<p><code>Edit &gt; Line &gt; Swap Line Up</code></p>

<p><code>Edit &gt; Line &gt; Swap Line Down</code></p>

<p><code>Edit &gt; Line &gt; Duplicate Line</code></p>

<p>Learn em. Love em. I changed my keyboard shortcut for these so I can&#8217;t recall what it is by default. Regardless I think I use these three commands more than any other so I would say if you only learn three shortcuts, make it these three.</p>

<p><strong>Pro Tip:</strong> If you want to duplicate a block of code highlight it and hit <code>cmd+L</code> to select the new line before you hit <code>cmd+shift+D</code>. This way your duplicated block will appear on a new line, rather than next to the previous block of code.</p>

<h2>Wrap your lines</h2>

<p>If you&#8217;ve installed the <a href="https://github.com/SublimeText/Tag">Tag plugin</a> you should have some extra line wrapping methods. I would also recommend you install <a href="https://bitbucket.org/sublimator/sublime-2-zencoding">ZenCoding</a>. I&#8217;m suggesting this for two reasons:</p>

<ol>
<li>You get awesome new features&#8230;</li>
<li>I can&#8217;t remember if what I&#8217;m about to say is native to Sublime or part of a plugin.</li>
</ol>


<p>OK with that out of the way&#8230;</p>

<p>Let&#8217;s say you&#8217;re working on some HTML and you have a block of text that you&#8217;d like to wrap in a <code>p</code> tag. No problemo! Highlight the text and hit <code>ctrl+shift+w</code> or <code>Edit &gt; Tag &gt; Wrap Selection in Tag</code>. There&#8217;s a more advanced versions that comes with the ZenCoding plugin which lets you do really elaborate wrappings. I believe the keyboard shortcut for that is <code>ctrl+alt+w</code>. Personally I dislike using the <code>ctrl</code> key on my Mac laptop so I changed both of those keyboard shortcuts to the following:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>{ "keys": ["super+shift+r"], "command": "insert_snippet", "args": { "name": "Packages/XML/long-tag.sublime-snippet" } },
</span><span class='line'>{ "keys": ["alt+shift+r"], "command": "wrap_zen_as_you_type",
</span><span class='line'>"context": [
</span><span class='line'>    {
</span><span class='line'>      "operand": "text.html, text.xml",
</span><span class='line'>      "operator": "equal",
</span><span class='line'>      "match_all": true,
</span><span class='line'>      "key": "selector"
</span><span class='line'>    }
</span><span class='line'>  ]
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>You&#8217;ll notice that instead of just using a <code>wrap_in_tag</code> command name the first entry actually calls another command, <code>insert_snippet</code> and passes it an argument: <code>Packages/XML/long-tag.sublime.snippet</code> which is the location of a snippet file. Pretty cool trick!</p>

<p>Also note that Sublime uses the term &#8220;super&#8221; to refer to the command key</p>

<h2>Bookmarks!</h2>

<p>If you&#8217;re like me then you lose your place in large files. That&#8217;s where bookmarks can be a big help. <code>cmd+F2</code> will add a new bookmark on the page. The bookmark is tied to the line so if you use the move line up/down commands it will move the bookmark as well (nice). To cycle through your bookmarks just hit F2. The rest of the bookmark commands are located in <code>Goto &gt; Bookmarks</code>. Take note of the one that says <code>Select All Bookmarks</code> which will basically let you do a multi-selection on all of the lines you&#8217;ve already bookmarked.</p>

<h2>Marks</h2>

<p>Marks are very similar to bookmarks but they serve a different purpose. They&#8217;re located in <code>Edit &gt; Mark</code> and their keyboard shortcuts are a little weird because you need to hit <code>cmd+K</code> and then a secondary shortcut like <code>cmd+space</code>. I find myself using Marks a few times a day to do large selections. For instance if you have a big block of HTML it can be very tricky to stay inside the proper scope if you&#8217;re trying to delete all the contents of a very high level container. With Marks you can just put a mark on the opening line of the container, hit <code>cmd+shift+a</code> to select down to the bottom of the tag, and then hit <code>cmd+K, cmd+a</code> to select everything back to your previous mark. Marks can also be used to swap lines of text but I&#8217;ve never needed to do that in practice.</p>

<h2>Hide the Sidebar</h2>

<p>To hide the sidebar hit <code>cmd+K, cmd+B</code>. Since I work on a laptop I often hide the sidebar to give myself that extra 100px of reading space.</p>

<h2>Turn off Minimap</h2>

<p>Do you guys use that minimap thing in the top corner of the editor windows? I find it <em>incredibly</em> distracting and it also takes up screen space. To disable it go to <code>View &gt; Hide Minimap</code>.</p>

<h2>Saving a project</h2>

<p>This one might be obvious for many of you but it wasn&#8217;t something I was really taking advantage of until recently. Once you have a folder open it can be beneficial to save it as a project via the <code>Project &gt; Save Project As...</code> command. Save the project files in the root of your app and then whenever you do <code>Project &gt; Recent Projects...</code> it will open everything up with all your windows just as you left them.</p>

<p>To switch between projects use <code>ctrl+cmd+p</code>.</p>

<h2>Some awesome plugins</h2>

<p>Sublime is all about plugins so here&#8217;s a list of some of my favorites. Once you have Package Control installed you can just hit <code>cmd+shift+p</code> and type <code>discover</code>, then hit enter which will take you to a page listing tons of plugins. Try out some (or all) of the ones below. They&#8217;re great :D</p>

<ul>
<li>AdvancedNewFile</li>
<li>HtmlTidy</li>
<li>Nettuts+ Fetch</li>
<li>Prefixr</li>
<li>RubyTest</li>
<li>Shell Turtlestein</li>
<li>SideBarEnhancements</li>
<li>sublime-github</li>
<li>Sublime-JSHint</li>
<li>SublimeCodeIntel</li>
<li>Tag</li>
<li>ZenCoding</li>
</ul>


<h2>Convert Case</h2>

<p>If you highlight some text you can use <code>cmd+K, cmd+U</code> to uppercase it. Likewise you can use <code>cmd+K, cmd+L</code> to lowercase it.</p>

<h2>Spell Check :)</h2>

<p>Finally I wouldn&#8217;t be much of a blogger if I didn&#8217;t point out the spell check feature. Hit <code>F6</code> to check your current file. Once you&#8217;ve turned it on the spell checker will stay on until you hit <code>F6</code> again.</p>

<h2>Hack the Planet!</h2>

<p>We&#8217;ve only really scratched the surface of what Sublime is capable of. In the future I&#8217;d like to write more about its awesome Macros, Snippets and Plugin architecture. Till then, have fun hacking. - Rob</p>

<p>You should follow me on Twitter <a href="http://twitter.com/rob_dodson">here.</a></p>

<ul class="personal-stats">
    <li>Mood: Tired, Lazy</li>
    <li>Sleep: 5</li>
    <li>Hunger: 5</li>
    <li>Coffee: 1</li>
</ul>

]]></content>
  </entry>
  
</feed>
