dcsimg
Login | Register   
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX

By submitting your information, you agree that devx.com may send you DevX offers via email, phone and text message, as well as email offers about other products and services that DevX believes may be of interest to you. DevX will process your information in accordance with the Quinstreet Privacy Policy.


advertisement
 

eXtreme.NET Iteration One: Refactoring with Resharper : Page 2

This article follows a team of developers learning to use XP (eXtreme Programming) techniques to improve the way they deliver software. Follow this team as they learn about Resharper, a tool that may help them refactor their code.


advertisement

WEBINAR:

On-Demand

Application Security Testing: An Integral Part of DevOps


Exploring Resharper
Deepak and Pete take one look at Pete's desk and decide to work at Deepak' s desk instead. They load up the CourseCosts library.

Here's a version of the library that includes all of the code examined in this article.

You can download a trial version of Resharper from JetBrains at http://www.jetbrains.com/resharper/.

Deepak: I've already installed Resharper on this machine.

Pete: I guessed that is why you have the extra Resharper menu on your Visual Studio menu bar.

Deepak: Sue is right, You can be a smart ass sometimes!

Pete grins but remains silent.

Deepak: So let's see what this project consists of.

Pete: The files we'd be interested in are probably the CourseCost and CostItems classes.

Deepak: Oh! You do know something about this project, don't you?

Pete: Like I said, kind of…

Deepak: Hey, there is even a test class in here with a whole test in it!

Pete: Yes it uses that text.xml file, I remember this. We have to copy that file to the root of our C: drive to get the test to work.

Deepak: And what exactly is the reason for that?

Pete: The CourseCost class works out the cost of a course for each attendee using the figures in the XML file. Open it up and I'll explain it to you.

Deepak opens the text.xml file shown below.

<?xml version="1.0" encoding="utf-8" ?> <Courses> <London> <Venue>3000</Venue> <Catering>30</Catering> <Equipment>2500</Equipment> <Speaker>2000</Speaker> <MaxAttendees>30</MaxAttendees> </London> </Courses>

Pete: So the idea is there will be an entry for each location the company runs courses. Here we have only created one for the test: London. Then the cost items are listed as children of that entry. The MaxAttendees and Catering are kind of special cases.

Deepak: How so?

Pete: Well, the other costs are fixed costs for the course, The Catering is a cost per attendee. The MaxAttendees is not a cost at all, but the maximum number of attendees that venue can cater for.

Deepak: OK, makes sense so far. Let's look at the code.

Deepak opens the CourseCost.cs file as shown in Listing 1.

Deepak: Yes, this is what I was talking about! This is a real mess.

Pete: PANIC!

Eddie: Is everything OK with you guys?

Deepak: Yeah we're just looking at the messy code and…

Pete: PANIC!

Deepak: I'm sure we can fix it!

Pete: (Sounding a bit doubtful.) OK, show me what we can do.

Deepak: OK, let's start with those public member variables. Do they really need to be public?

Pete: What, the costItems and the attendees?

Deepak: Yes, Resharper can show us where they are being used.

Pete: That's cool! How do we do that?

Deepak: Move the mouse over the costItems variable name and right-click. Do you see the "Find Usages" item in the popup menu?

Pete: Yep.

Deepak: Click on it.

Pete does this and a dialog appears showing the places the variable is used (see Figure 1).

 
Figure 1. Find Usages Dialog: The figure shows the results of using the Find Usages dialog to find all occurrences of a variable.
Deepak: As I thought, it is not used outside of this class. Let's change it to a private variable. Check the attendees as well.

Pete: The same, I'll change both of them.

Deepak: Great, now let's look at that nasty big function GetCost.

Pete: OK, what's wrong with it?

Deepak: I think it smells. It seems too large and is doing too much. We should take some of the functionality out into smaller methods.

Pete: OK, but don't we pay the cost of method invocation? Isn't that going to slow the code down?

Deepak: Is speed an issue for this component?

Pete: I don't know. It might be.

Deepak: I think until we know it is an issue, I'd rather not worry about it.

Pete: OK, What shall we do about this big method then?

Deepak: We can start by extracting the code that calculates the total cost into its own method. Select the foreach loop that goes through the costItems, and right-click. Do you see the Refactor menu item at the bottom of the popup menu?

 
Figure 2. Extract Method: The figure shows the Extract Method dialog.
Pete: Yes.

Deepak: Select that and then select Extract Method.

Pete does this and the Extract Method dialog box appears as shown in Figure 2.

Pete: OK, now what?

Deepak: How about changing the return value so it returns the totalcost and we'll call the method…

Pete: TotalCost?

Deepak: Yes, that should do it. You can see the signature preview at the bottom of the dialog. I like that! Click OK.

The dialog before Pete clicks OK is shown in Figure 3.

 
Figure 3. Extract Method Dialog: The figure shows the Extract dialog used to extract the TotalCost method.
Pete: Hey cool! It took the code out of the big function and made the call to it and everything!

Deepak: It's nice huh?

Pete: Sure is, what's next?

Deepak: Let's do the same with the other foreach loop that extracts the cost items from the XML nodes.

Pete: OK, what shall we call this function?

Deepak: How about ExtractCostItems?

Pete: Great, look at that! A few clicks of the mouse and the code is starting to look like proper object-oriented code!

Pete grins, guessing this is just the tip of the iceberg. The code that Pete and Deepak are now looking at is shown in Listing 2.

Eddie: How are you guys doing?

Pete: Really good. It's so easy to change the code using this Resharper tool.

Eddie: That's good to hear but are you thinking about why you are changing the code? What is the task at hand?

Deepak: Oh!

Pete: Um... we have just been playing with what's there. I haven't really been thinking about the task. Um… what is the task?

Deepak: Something to do with handling a sponsor paying for some of the costs.

Eddie: Chris, can you help these guys understand what the CourseCosts library does?



Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date