Refactoring Day 21 : Collapse Hierarchy
Todays refactoring comes from Martin Fowlers catalog of patterns. You can find this refactoring in his catalog here
Yesterday we looked at extracting a subclass for moving responsibilities down if they are not needed across the board. A Collapse Hierarchy refactoring would be applied when you realize you no longer need a subclass. When this happens it doesn’t really make sense to keep your subclass around if it’s properties can be merged into the base class and used strictly from there.
1: public class Website
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 2:</span> {</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 3:</span> <span class="kwrd">public</span> <span class="kwrd">string</span> Title { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 4:</span> <span class="kwrd">public</span> <span class="kwrd">string</span> Description { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 5:</span> <span class="kwrd">public</span> IEnumerable<Webpage> Pages { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 6:</span> }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 7:</span> </pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 8:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> StudentWebsite : Website</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 9:</span> {</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 10:</span> <span class="kwrd">public</span> <span class="kwrd">bool</span> IsActive { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 11:</span> }</pre>
<p>
<!--CRLF--></div> </div>
<p>
Here we have a subclass that isn’t doing too much. It just has one property to denote if the site is active or not. At this point maybe we realize that determing if a site is active is something we can use across the board so we can collapse the hierarchy back into only a Website and eliminate the StudentWebsite type.
</p>
<div class="csharpcode-wrapper">
<div class="csharpcode">
<pre><span class="lnum"> 1:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> Website</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 2:</span> {</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 3:</span> <span class="kwrd">public</span> <span class="kwrd">string</span> Title { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 4:</span> <span class="kwrd">public</span> <span class="kwrd">string</span> Description { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 5:</span> <span class="kwrd">public</span> IEnumerable<Webpage> Pages { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 6:</span> <span class="kwrd">public</span> <span class="kwrd">bool</span> IsActive { get; set; }</pre>
<p>
<!--CRLF-->
</p>
<pre><span class="lnum"> 7:</span> }</pre>
<p>
<!--CRLF--></div> </div>
<p>
<em><span style="font-size: xx-small">This is part of the 31 Days of Refactoring series. For a full list of Refactorings please see the <a target="_blank" href="/blogs/sean_chambers/archive/2009/08/01/31-days-of-refactoring.aspx">original introductory post</a>.</span></em>
</p>
