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> </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> </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> </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<<span class="kwrd">decimal</span>> LateFees { get; set; }</pre>
<pre><span class="lnum"> 21:</span> <span class="kwrd">public</span> IList<Video> 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> </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<<span class="kwrd">decimal</span>> LateFees { get; set; }</pre>
<pre><span class="lnum"> 12:</span> <span class="kwrd">public</span> IList<Video> Videos { get; set; }</pre>
<pre><span class="lnum"> 13:</span> </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> </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.
