Refactoring Day 14 : Break Responsibilities


When breaking apart responsibilities on a class this is enforcing Single Responsiblity Principle from SOLID. It’s an easy approach to apply this refactoring although it’s often disputed as what consitutes a “responsibility”. While I won’t be answering that here, I will show a clear cut example of a class that can be broken into several classes with specific responsibilities.

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

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

<pre><span class="lnum">   4:</span>     {</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">void</span> RentVideo(Video video, Customer customer)</pre>

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

<pre><span class="lnum">   9:</span>         customer.Videos.Add(video);</pre>

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

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

<pre><span class="lnum">  12:</span>     <span class="kwrd">public</span> <span class="kwrd">decimal</span> CalculateBalance(Customer customer)</pre>

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

<pre><span class="lnum">  14:</span>         <span class="kwrd">return</span> customer.LateFees.Sum();</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">class</span> Customer</pre>

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

<pre><span class="lnum">  20:</span>     <span class="kwrd">public</span> IList&lt;<span class="kwrd">decimal</span>&gt; LateFees { get; set; }</pre>

<pre><span class="lnum">  21:</span>     <span class="kwrd">public</span> IList&lt;Video&gt; Videos { get; set; }</pre>

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

As you can see here, the Video class has two responsibilities, once for handling video rentals, and another for managing how many rentals a customer has. We can break out the customer logic into it’s own class to help seperate the responsibilities.

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

<pre><span class="lnum">   3:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> RentVideo(Video video, Customer customer)</pre>

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

<pre><span class="lnum">   5:</span>         customer.Videos.Add(video);</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> Customer</pre>

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

<pre><span class="lnum">  11:</span>     <span class="kwrd">public</span> IList&lt;<span class="kwrd">decimal</span>&gt; LateFees { get; set; }</pre>

<pre><span class="lnum">  12:</span>     <span class="kwrd">public</span> IList&lt;Video&gt; Videos { get; set; }</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> PayFee(<span class="kwrd">decimal</span> fee)</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">decimal</span> CalculateBalance(Customer customer)</pre>

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

<pre><span class="lnum">  20:</span>         <span class="kwrd">return</span> customer.LateFees.Sum();</pre>

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

<pre><span class="lnum">  22:</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 13 : Extract Method Object
Refactoring Day 15 : Remove Duplication →