?Java supports the use of various types of literals, such as integers (5, 2), floating point numbers (2.5, 6.022e+23), characters ('a', '\n'), booleans ('true', 'false'), and strings ("Hello\n"). Extensive use of literals within a program can lead to two problems: first, the meaning of the literal is often obscured or unclear from the context (from which they derive the name "magic numbers"), and second, changing a frequently-used literal requires the entire program source code to be searched for occurances of that literal, creating possible error sources if some of the occurances of the literal are overlooked.
...
Noncompliant Code Example
The following noncompliant code calculates various dimensions of a sphere, given its radius.
Code Block | ||
---|---|---|
| LDAP *ld = ldap_init("localhost", 1234);
||
double area(double radius){
return 12.56*radius*radius;}
double volume(double radius){
return 4.19*radius*radius*radius;}
double greatCircleCircumference(double radius){
return 6.28*radius;}
|
The methods use the seemingly-random literals 12.56, 4.19, and 6.28 to represent various scaling factors used to calculate these dimensions. Someone reading this code would have no idea how they were generated or what they meant, and would therefore be unable to understand the function of this code.
Noncompliant Code Example
The following noncompliant code attempts to avoid the above issues by explicitly calculating the required constants
Code Block | ||
---|---|---|
| ||
double area(double radius){
return 4.0*3.14*radius*radius;}
double volume(double radius){
return 4.0/3.0*3.14*radius*radius*radius;}
double greatCircleCircumference(double radius){
return 2*3.14*radius;}
|
The code uses the literal "3.14" to represent the value pi. Although this removes some of the ambiguity from the literals, it complicates code maintenance. If the programmer were to decide that a more-precise value of pi was needed, he would need to find all occurances of "3.14" in the code and replace them.
Compliant Solution
In this compliant solution, the host name and port number are both defined as object-like macros, so that may be passed as compile-time argumentsa constant PI is first declared and set equal to 3.14, and is thereafter referenced in the code whenever the value pi is needed.
Code Block | ||
---|---|---|
| ||
#ifndef final PORTNUMBERint PI = 3.14; double /* might be passed on compile line */ } area(double radius){ return 4.0*PI*radius*radius;} double volume(double radius){ return 4.0/3.0*PI*radius*radius*radius;} double greatCircleCircumference(double radius){ return 2*PI*radius;} |
This both clarifies the code and allows easy editing, for if a different value for pi is required, the programmer can simply redefine the constant.