Code Complete 2 – Steve McConnell – General Issues in Using Variables
I just love Steve McConnell's classic book Code Complete 2, and I recommend it to everyone in the Software 'world' who's willing to progress and sharpen his skills.
Other blog posts in this series:
- Part 1 (Chapters 1 - 4): Laying the Foundation
- Chapter 5: Design in Construction
- Chapter 6: Working Classes
- Chapter 7: High-Quality Routines
- Chapter 8: Defensive programming
- Chapter 9: Pseudocode Programming Process
It's easy to start using hazardous practices before you're fully aware of your alternatives and then to continue to use them out of habit even after you've learned ways to avoid them.
An implicit declaration is one of the most hazardous features available in any language. For example, if you use a variable in Microsoft Visual Basic without declaring it, the compiler declares it for you automatically (depending on your compiler settings).
What do you do if you program in a language with implicit declarations? Here are some suggestions:
+ Turn off implicit declaration
+ Declare all variables - as you type in a new variable, declare it, even though the compiler doesn't require you to
+ Use naming conventions - establish a naming convention for common suffixes such as Num and No so that you don't use two variables when you mean to use one
+ Check variable names - use cross-reference list generated by your compiler or another utility program
Guidelines for initializing variables
Improper data initialization is one of the most fertile sources of error in computer programming. Developing effective techniques for avoiding initialization problems can save a lot of debugging time.
The problem with improper initialization stem from a variable's containing an initial value that you do not expect it to contain. This can happen for any of several reasons:
- The variable has never been assigned a value. Its value is whatever bits happened to be in its area of memory when the program started
- The value of the variable is outdated. The variable was assigned a value at some point, but the value is no longer valid
- Part of the variable has been assigned a value and part has not. That can happen when you initialize some of the members of an object but not all of them
Guidelines for avoiding initialization problems:
- Initialize each variable as it's declared
- Declare and initialize each variable close to where it's first used
- Use final or const when possible
- Pay special attention to counters and accumulators. A common error is forgetting to reset a counter or an accumulator before the next time it's used.
Scope, or visibility, refers to the extent to which your variables are known and can be referenced throughout a program.
One method of measuring how close together the references to a variable are is to compute "span" of a variable. Here's an example:
a = 0; b = 0; c = 0; a = b + c;
In this case, two lines come between the first reference to a and the second, so a has a span of two. The main advantage of keeping references to variables together is that it improves program readability.
A concept that's related to variable span is variable "live time," the total number of statements over which a variable is live. A variable's life begins at the first statement in which it's referenced; its life ends at the last statements in which it's referenced.
Comments on scope
Many programmers approach to minimizing variables scope depends on their views of the issues of "convenience" and "intellectual manageability." The difference boils down to a difference in emphasis between writing programs and reading them. Maximizing the scope might indeed make programs easy to write, but a program in which any routine can use any variable at any time is harder to understand.
Using each variable for exactly one purpose
It's possible to use variables for more than one purpose in several subtle ways. You're better off without this kind of subtlety.
- Use each variable for one purpose only - it's sometimes tempting to use one variable in two different places for two different activities. Usually, the variable is named inappropriately for one of its uses, or a "temporary" variable is used in both cases
Avoid variables with hidden meanings
- The value in the variable pageCount might represent the number of pages printed unless it equals -1, in which case it indicates that an error has occurred
- The variable bytesWritten might be the number of bytes written to an output file, unless its value is negative, in which case it indicates the number of the disk drive used for the output
Make sure all declared variables are used - the opposite of using a variable for more than one purpose is not using it at all