Refactoring Day 9 : Extract Interface


Today we look at an often overlooked refactoring. Extract Interface. When you notice more than one class using a similar subset of methods on a class, it is useful to break the dependency and introduce an interface that the consumers to use. It’s easy to implement and has benefits from loose coupling.

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

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

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

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

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

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

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

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

<pre><span class="lnum">  10:</span>         <span class="rem">// class transfer code</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">decimal</span> Total { get; <span class="kwrd">private</span> set; }</pre>

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

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

<pre><span class="lnum">  16:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> RegistrationProcessor</pre>

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

<pre><span class="lnum">  18:</span>     <span class="kwrd">public</span> <span class="kwrd">decimal</span> ProcessRegistration(ClassRegistration registration)</pre>

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

<pre><span class="lnum">  20:</span>         registration.Create();</pre>

<pre><span class="lnum">  21:</span>         <span class="kwrd">return</span> registration.Total;</pre>

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

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

In the after example, you can see we extracted the methods that both consumers use and placed them in an interface. Now the consumers don’t care/know about the class that is implementing these methods. We have decoupled our consumer from the actual implementation and depend only on the contract that we have created.

   1: public interface IClassRegistration
<pre><span class="lnum">   2:</span> {</pre>

<pre><span class="lnum">   3:</span>     <span class="kwrd">void</span> Create();</pre>

<pre><span class="lnum">   4:</span>     <span class="kwrd">decimal</span> Total { get; }</pre>

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

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

<pre><span class="lnum">   7:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> ClassRegistration : IClassRegistration</pre>

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

<pre><span class="lnum">   9:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> Create()</pre>

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

<pre><span class="lnum">  11:</span>         <span class="rem">// create registration code</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">void</span> Transfer()</pre>

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

<pre><span class="lnum">  16:</span>         <span class="rem">// class transfer code</span></pre>

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

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

<pre><span class="lnum">  19:</span>     <span class="kwrd">public</span> <span class="kwrd">decimal</span> Total { get; <span class="kwrd">private</span> set; }</pre>

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

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

<pre><span class="lnum">  22:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> RegistrationProcessor</pre>

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

<pre><span class="lnum">  24:</span>     <span class="kwrd">public</span> <span class="kwrd">decimal</span> ProcessRegistration(IClassRegistration registration)</pre>

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

<pre><span class="lnum">  26:</span>         registration.Create();</pre>

<pre><span class="lnum">  27:</span>         <span class="kwrd">return</span> registration.Total;</pre>

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

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

This refactoring was first published by Martin Fowler and can be found in his list of refactorings here.

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

← Refactoring Day 8 : Replace Inheritance with Delegation
Refactoring Day 10 : Extract Method →