Refactoring Day 3 : Pull Up Method


The Pull Up Method refactoring is the process of taking a method and “Pulling” it up in the inheritance chain. This is used when a method needs to be used by multiple implementers.

   1: public abstract class Vehicle
<pre><span class="lnum">   2:</span> {</pre>

<pre><span class="lnum">   3:</span>     <span class="rem">// other methods</span></pre>

<pre><span class="lnum">   4:</span> }</pre>

<pre><span class="lnum">   5:</span>&nbsp; </pre>

<pre><span class="lnum">   6:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> Car : Vehicle</pre>

<pre><span class="lnum">   7:</span> {</pre>

<pre><span class="lnum">   8:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> Turn(Direction direction)</pre>

<pre><span class="lnum">   9:</span>     {</pre>

<pre><span class="lnum">  10:</span>         <span class="rem">// code here</span></pre>

<pre><span class="lnum">  11:</span>     }</pre>

<pre><span class="lnum">  12:</span> }</pre>

<pre><span class="lnum">  13:</span>&nbsp; </pre>

<pre><span class="lnum">  14:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> Motorcycle : Vehicle</pre>

<pre><span class="lnum">  15:</span> {</pre>

<pre><span class="lnum">  16:</span> }</pre>

<pre><span class="lnum">  17:</span>&nbsp; </pre>

<pre><span class="lnum">  18:</span> <span class="kwrd">public</span> <span class="kwrd">enum</span> Direction</pre>

<pre><span class="lnum">  19:</span> {</pre>

<pre><span class="lnum">  20:</span>     Left,</pre>

<pre><span class="lnum">  21:</span>     Right</pre>

<pre><span class="lnum">  22:</span> }</pre>

As you can see, our Turn method is currently only available to the car class, we also want to use it in the motorcycle class so we create a base class if one doesn’t already exist and “pull up” the method into the base class making it available to both. The only drawback is we have increased surface area of the base class adding to it’s complexity so use wisely. Only place methods that need to be used by more that one derived class. Once you start overusing inheritance it breaks down pretty quickly and you should start to lean towards composition over inheritance. Here is the code after the refactoring:

   1: public abstract class Vehicle
<pre><span class="lnum">   2:</span> {</pre>

<pre><span class="lnum">   3:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> Turn(Direction direction)</pre>

<pre><span class="lnum">   4:</span>     {</pre>

<pre><span class="lnum">   5:</span>         <span class="rem">// code here</span></pre>

<pre><span class="lnum">   6:</span>     }</pre>

<pre><span class="lnum">   7:</span> }</pre>

<pre><span class="lnum">   8:</span>&nbsp; </pre>

<pre><span class="lnum">   9:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> Car : Vehicle</pre>

<pre><span class="lnum">  10:</span> {</pre>

<pre><span class="lnum">  11:</span> }</pre>

<pre><span class="lnum">  12:</span>&nbsp; </pre>

<pre><span class="lnum">  13:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> Motorcycle : Vehicle</pre>

<pre><span class="lnum">  14:</span> {</pre>

<pre><span class="lnum">  15:</span> }</pre>

<pre><span class="lnum">  16:</span>&nbsp; </pre>

<pre><span class="lnum">  17:</span> <span class="kwrd">public</span> <span class="kwrd">enum</span> Direction</pre>

<pre><span class="lnum">  18:</span> {</pre>

<pre><span class="lnum">  19:</span>     Left,</pre>

<pre><span class="lnum">  20:</span>     Right</pre>

<pre><span class="lnum">  21:</span> }</pre>

 

This is part of the 31 Days of Refactoring series. For a full list of Refactorings please see the original introductory post.

← Refactoring Day 2 : Move Method
Refactoring Day 4 : Push Down Method →