...this pattern helps complete the SimplyUnderstoodCode pattern; it settles part of the question of how to make the use of local variables understandable.
* * *Local variables hold local state and serve as a means to abbreviate certain parts of the computation or to prevent computations from being repeated causing inefficiency or incorrectness. Frequently local variables disorient people reading the code.
You are writing a piece of code that requires local variables to told temporary results. The code will be in use for a long time with relatively infrequent attention for maintenance. You expect that by the time you go back to the code it will be unfamiliar or else someone who has never seen it before will be working on it.
People need to stare at code in order to understand it well enough to feel secure making changes to it; understanding the role and uses of a local variable is central to this understanding. People understand best things read top to bottom.
Therefore, Lay out the definition of a local variable so that all of its uses are visible on one page of a typical screen or window size for the developers who might need to work on the code. Ideally the definition of the local variable will be above its use or reference.
* * *This won't work well if the variable is assigned multiple times within the visible field, and it will work even worse if it is assigned multiple times partly within and partly outside the visible field. See the pattern AssignVariablesOnce.
Sometimes the local variables are the reason the function has got so big. That is, you can't split it into smaller functions because all the parts of it need access to local variables. Some techniques for dealing with that situation are discussed in WellFactoredCode.
If you write SideEffectFreeFunctions?, then local variables become mere caches, used for efficiency and clarity and without having any effect on correctness.
Frequently local variables disorient people reading the code -- this may be a sign you need to chose their names more carefully. Using a variable for intermediate results can split a complicated expression into simpler ones, and giving a name to a quantity helps explain what that quantity is. It is usually better to introduce variables than to write comments.
-- DaveHarris
This page mirrored in WikiPagesAboutRefactoring as of April 29, 2006