Whole Tomato Software Forums
Whole Tomato Software Forums
Main Site | Profile | Register | Active Topics | Members | Search | FAQ
 All Forums
 Visual Assist
 Feature Requests
 Split Declaration refactoring

You must be registered to post a reply.
Click here to register.

Screensize:
UserName:
Password:
Format: BoldItalicizeUnderlineStrikethrough Align leftCenterAlign right Insert horizontal ruleUpload and insert imageInsert hyperlinkInsert email addressInsert codeInsert quoted textInsert listInsert Emoji
   
Message:

Forum code is on.
Html is off.

 
Check to subscribe to this topic.
   

T O P I C    R E V I E W
legalize Posted - Mar 27 2013 : 2:06:30 PM
Summary: When multiple identifiers are declared in a single statement, split the identifier containing the cursor into a separate declaration

Example:

Source code reads:
int i, j;
and the cursor is anywhere between the comma and the semi-colon and I select "Split Declaration", the code becomes
int i;
int j;

Rationale:

A common refactoring activity is to perform "Compose Method"[1] on long methods and functions.

Long methods often have lots of local state that is stored in variables defined in the local scope. Often times, the declarations are grouped together because the programmer already recognized that this method was really long and they attemped to conserve space by declaring multiple variables on the same line. However, one variable is used in one area of the method and another variable is used in a second area of the method.

When performing Compose Method, these variables are going to end up as local variables in the extracted submethods, but first we need to localize their use or Extract Method will consider them modifiable parameters of the original scope that need to be passed in and out of the extracted methods.

So, before we can get VAX's Extract Method to do something useful for us (remember, we want to use automated tools to change the code in order to avoid the mistakes that come from making manual changes to code), we need to localize the variables used in each block we intend to extract. That means splitting multiple declarations into individual declarations and then moving those declarations to immediately before their first use.

[1] "Compose Method" refactoring:
http://www.industriallogic.com/xp/refactoring/composeMethod.html

See "Refactoring to Patterns", by Joshua Kerievsky; if you haven't read this book yet and you're implementing a refactoring tool, you should stop reading this forum thread and go order the book.
3   L A T E S T    R E P L I E S    (Newest First)
feline Posted - Mar 29 2013 : 3:47:56 PM
This all makes sense. It turns out this idea has come up before, but only the once by the looks of it. I have added your comments to this case, since you made made good points here:

case=30486
legalize Posted - Mar 28 2013 : 11:23:38 AM
Yes, it's useful on it's own. I've done this hundreds of times when migrating legacy C code with long functions to C++, because C forces you to declare a variable at the most recently created {} block and lots of people didn't realize they could introduce a new scope block anytime they wanted in C, so for long functions there tends to be a sh'load of variables declared at the top of the function, even then they are only used locally much farther down.

Given the difficulty of the flow analysis and parsing, I'm trying to make suggestions for new refactorings that are simple, small steps. While it's true that Split Declaration and Localize Variable are often used together, it's easier on the tool developer if I apply those two separately as a user rather than trying to combine them into a larger refactoring that's harder to implement correctly.

It's also the case that I often want to apply these refactorings individually. Sometimes I have code that suffers from the bulk declarations and other times I have code that doesn't suffer from bulk declarations but the declarations aren't localized to the first use.
feline Posted - Mar 27 2013 : 2:59:07 PM
Are you likely to want or need to split the declarations when you are not moving them around? If you have 6 or 8 variables declared on the same line, I assume you are looking for this to become 6 or 8 separate lines, one variable per line.

This makes sense, I am just wondering how useful it is on its own, or if it should just be rolled into part of your Localize Variable refactoring suggestion:

http://forums.wholetomato.com/forum/topic.asp?TOPIC_ID=11305

© 2023 Whole Tomato Software, LLC Go To Top Of Page
Snitz Forums 2000