ControlFreak
LANGUAGES:
VB.NET | C#
ASP.NET
VERSIONS: 2.x
Cure Code Bloat
Refactoring in Visual Studio 2005
By Steve C. Orr
Successful software systems grow larger and more complex
over time. Sometimes they grow gracefully; but all too often, they grow in fits
and spurts that result in unsightly code bulges. Perhaps you ve become the
victim of a monster piece of code that s seemingly grown out of control:
functions that contain hundreds of lines of code, poorly named variables, and
classes that have sprouted functions that clearly belong elsewhere.
We like to think of ourselves as good designers who wouldn t
let such a thing happen in the first place, but sometimes business realities
interfere with this vision. Perhaps time constraints didn t allow for a proper
design up front and a hack simply had to get out the door A.S.A.P. Or perhaps
you ve inherited code from another developer and found it to be in less-than-ideal
condition.
No matter how you got there, you re stuck with complicated
code that isn t very maintainable and you ve been assigned to build upon it. Now
what do you do? I know you re tempted to rewrite it; sometimes that is the best
thing to do but not usually. More often than not, refactoring will provide
the best return on your investment of time and effort.
Refactoring 101
Refactoring is the art of reorganizing the internal
structure of code without changing its public behavior. There are many ways one
can go about refactoring code. One of the simplest examples would be to rename
single-character private variables, instead giving them more descriptive
variable names. This increases the code s readability and maintainability
without altering the functionality of the code, or changing its public
interface.
But how? You could find each such variable by manually
looking through the code and changing every variable name one at a time. While
this may work for tiny fragments of code, it becomes time consuming and error
prone for larger blocks of code. You could use a find/replace text tool like
the one that s always been in Visual Studio. This can certainly be useful, but
must be used with caution so that similarly named variables aren t also altered
accidentally.
Refactoring in C#
Gratefully, C# developers have great new refactoring tools
in Visual Studio 2005 under the new Refactor dropdown menu (shown in Figure 1).
Figure 1: Visual Studio provides a
rich set of refactoring tools for C# developers.
Selecting Rename from the Refactor dropdown menu brings up
the dialog box shown in Figure 2. Simply type the new name for the selected
variable and you re one click away from having the variable intelligently
renamed everywhere that s applicable. This is much better than a standard text
search-and-replace, which can cause similar variables to be accidentally
renamed if you re not careful. The rename refactoring process considers the
scope and precise name of the variable and will not rename similarly named
variables anywhere else in the project. In case you don t at first believe it
will perform that perfectly, you have the option of previewing the changes
before they are made. You also have the option to replace any mention of that
variable within code comments or strings instead of only in the executable
code. The rename refactoring process can save time and help ensure all
variables get named consistently throughout a project so code will be higher
quality and more maintainable.
Figure 2: Visual Studio provides
intelligent variable renaming functionality that takes into consideration the
scope of the variable.
Encapsulate Field
Another useful refactoring process from the Refactor dropdown
menu is Encapsulate Field. This will turn a simple variable declaration into a
public property. This can save a significant amount of typing. For example, look
at the following public field declaration:
private string _StatusBar;
After selecting it and choosing Encapsulate Field from the
Refactor menu, the full property syntax is automatically generated for it:
public string StatusBar
{
get { return _StatusBar;
}
set { _StatusBar =
value; }
}
Extract Method
The Extract Method process, also available off the Refactor
dropdown menu shown in Figure 1, is useful for situations when a function has
become too large for its own good. A general rule of thumb that many developers
go by is that if a function is too large to fit entirely on the screen at one
time, it should be broken down into smaller functions. Ah, but that s easier
said than done once a function has turned to spaghetti. Trying to do this manually
involves tracking down variable declarations, ensuring all the proper variables
get passed to the new child functions, and making sure all relevant values that
are modified in the child functions are returned as needed to the parent
function. This is a tedious chore indeed; as such, all too often it is left
undone.
This is why the Extract Method refactoring process is so
valuable. It does all the boring work for you. Simply select the block of code
that you d like to extract into a child method and choose Extract Method from
the Refactor menu. After typing in the name for the new function and clicking
the OK button, the code will be automatically extracted into this new function
(which will appear just below the parent function in the code editor). Any necessary
in and out parameters are automatically created it s as simple as that. Now
you have no excuse for untidy code.
Keep in mind that this (like most refactorings) won t
break any code that references the original method because its original interface
hasn t changed.
Parameter Refactoring
Many functions accept multiple parameters, and their
parameters can grow awkwardly over time. Perhaps you prefer to order the
parameters according to their importance, or perhaps you prefer to order them
alphabetically. No matter what reasoning you have for such matters, it is best
to be consistent. The Reorder Parameters refactoring helps you accomplish this
goal. The dialog box shown in Figure 3 lists the parameters of the selected
method and lets you move their order up and down with the arrow buttons. The
reordering functionality is smart enough to change any calling code within the
solution that references that method so the parameters stay in sync everywhere
throughout the code and nothing breaks.
Figure 3: C# s Reorder Parameters
functionality is intelligent enough to adjust calling code so that parameters
stay in sync everywhere and nothing breaks.
The Remove Parameters refactoring can also be occasionally
useful. This functionality is also smart enough to adjust any code that calls
the method so that the proper parameters are passed to the function. Use this
refactoring more cautiously than the others though, because removing a
parameter upon which the function relies could cause compilation errors.
What about VB?
All that C# refactoring stuff sure looks neat, but what
about all the VB developers out there? Well, there s good news and bad news. The
bad news is that only rename refactoring is included with Visual Studio 2005
for VB developers. No other refactoring capabilities are included by default
for VB. Nobody was more upset at Microsoft about this than me.
But before all you C# developers start getting a big head
about your superior tools, I m happy to say that, in the end, Microsoft came
through for VB developers too, with the help of a company called Developer
Express, Inc. They partnered with Microsoft to develop a free high-quality
refactoring plug-in for VB 2005 developers: Refactor! for Visual Basic 2005
provides refactoring capabilities that are superior to C# s built-in
refactoring features in virtually every way. Most notably, it provides more
refactoring types, a more intuitive user interface, and better performance. While
the standard C# refactoring dialog boxes are solid and utilitarian in nature,
the free refactoring add-in for VB might just leave you in awe when you see how
intuitively things seem to just pop into place at all the right moments. In
fact, you re not likely to see any dialog boxes at all.
To avoid any potential confusion you should know that
Developer Express also has a professional version of Refactor! (which is not
free) that includes even more refactorings, C# support, Visual Studio 2002 and
2003 support, and more.
Figure 4 shows how much flashier VB s refactoring support
is than C# s. Relevant code is highlighted, informative windows pop up
intuitively, and arrows and animations appear to make it clear which blocks of
code will be moved, and where. Solid underline icons appear beneath code that
can be refactored, and interacting with these brings up SmartTags that list all
currently applicable refactoring possibilities. Alternatively, you can right
click on any piece of code to bring up pertinent refactoring options.
Figure 4: VB s refactoring support
is much flashier than C# s and it doesn t rely on utilitarian dialog boxes. Instead,
SmartTags, animations, and other helpful windows pop up intuitively, supplying
instant code improvements.
While Visual Studio 2005 provides C# with six refactoring
capabilities, the free Refactor! for Visual Basic 2005 plug-in includes around
two dozen refactorings, many of which are quite useful and encourage good
programming practices.
Some of the highlights include the Introduce Constant
refactoring, which instantly converts magic numbers into constants; the Move
Initialization to Declaration refactoring, which combines a variable s initial
assignment with its declaration, as illustrated in Figure 4; and Split
Initialization from Declaration refactoring, which does the opposite. If you
choose to register the plug-in with Developer Express, you ll have access to
several additional refactoring types (see Figure 5).
|
Refactoring Type
|
Visual Studio
C# Support
|
Refactor! For
VB 2005 Support
|
|
Rename
|
X
|
X
|
|
Reorder Parameters
|
X
|
X
|
|
Extract Method
|
X
|
X
|
|
Extract Property
|
|
X
|
|
Encapsulate Field
|
X
|
X
|
|
Remove Parameters
|
X
|
|
|
Promote Local Variable to Parameter
|
X
|
|
|
Create Overload
|
|
X
|
|
Surrounds With
|
|
X
|
|
Reverse Conditional
|
|
X
|
|
Simplify Expression
|
|
X
|
|
Introduce Local
|
|
X
|
|
Introduce Constant
|
|
X
|
|
Inline Temp
|
|
X
|
|
Replace Temp with Query
|
|
X
|
|
Split
Temporary Variable
|
|
X
|
|
Move Initialization to Declaration
|
|
X
|
|
Split Initialization
from Declaration
|
|
X
|
|
Move Declaration Near Reference
|
|
X
|
|
Create Method Contract *
|
|
X
|
|
Use String.Format *
|
|
X
|
|
Rename Local *
|
|
X
|
|
Safe Rename*
|
|
X
|
|
More future VB refactorings... *
|
|
X
|
|
*Requires free registration with Developer Express, Inc.
|
Figure 5: Refactoring
support for C# and VB.
Healthy Code Is Good Code
As successful software projects age and expand, some
refactoring is usually necessary to prune code trees so they can continue to
grow healthily in the long term. Refactoring tools help to simplify this chore,
making tune-ups a breeze. Refactoring tools promote good programming practices
by making it easy to elevate code into a more maintainable syntax and improved
design. As developers and companies refine their development standards, tools
such as these can make it simple to retrofit existing code to conform to the
new syntactical standards without risking the introduction of bugs.
Refactoring tools are not magic. It still takes careful
thought and planning to decide what code should be refactored and in which ways.
However, refactoring tools can help spur that thought process and they
certainly take the tedium out of making the specific changes. It s even rather
fun to watch these tools do work in seconds that otherwise could take many
hours to do manually or perhaps never even gotten done at all.
Refactoring tools have matured dramatically in the last
few years. While the tools outlined here are some of the best around, they
still don t come close to providing every different kind of refactoring that is
conceptually possible. Refactoring is a deep topic, and there are many books
written on the subject. I encourage you to dig deeper to find even more ways to
refactor your code.
Bloated code may never disappear from the world
completely, but now every developer has a fighting chance. Now you have no
excuse for untidy code, because these tools will help clean it up in a flash.
Download Refactor! for Visual Basic 2005 directly from
Microsoft from http://msdn.microsoft.com/VBasic/Downloads/Tools/Refactor/.
Steve C. Orr is an
MCSD and a Microsoft MVP in ASP.NET. He s been developing software solutions
for leading companies in the Seattle
area for more than a decade. When he s not busy designing software systems or
writing about them, he can often be found loitering at local user groups and
habitually lurking in the ASP.NET newsgroup. Find out more about him at http://SteveOrr.net
or e-mail him at mailto:Steve@Orr.net.