Author |
Topic |
|
legalize
Tomato Guru
USA
119 Posts |
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.
|
http://legalizeadulthood.wordpress.com |
|
feline
Whole Tomato Software
United Kingdom
19014 Posts |
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 |
zen is the art of being at one with the two'ness |
|
|
legalize
Tomato Guru
USA
119 Posts |
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. |
http://legalizeadulthood.wordpress.com |
|
|
feline
Whole Tomato Software
United Kingdom
19014 Posts |
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 |
zen is the art of being at one with the two'ness |
|
|
|
Topic |
|
|
|