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> </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> </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> </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> </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> </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> </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> </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.
