Bonehead Programming

Why do some programmers write stupid code?  Simple. Nobody every told them it was stupid, explained why, or told them a better way of doing it.

Each of the tasks below shows one or more "bonehead" solutions (in Java), an explanation of why it's a stupid solution, and then a better solution.  Study and learn, grasshopper.  Don't be a bonehead.



Task 1:  Calculate x2.

Bonehead Solution:    square = Math.pow(x,2);

What's wrong with it?

Better Solutionsquare = x * x;

Similarly, Math.sqrt(x) is better than Math.pow(x, 0.5);



Task 2:  Converting an alphabetic character between A and Z to an integer from 0 to 25.

Bonehead Solution A:

switch (letter)
{
    case 'A': return 0;
    case 'B': return 1;
    case 'C': return 2;
    case 'D': return 3;
    case 'E': return 4;
    case 'F': return 5;
    case 'G': return 6;
    case 'H': return 7;
    case 'I': return 8;
    case 'J': return 9;
    case 'K': return 10;
    case 'L': return 11;
    case 'M': return 12;
    case 'N': return 13;
    case 'O': return 14;
    case 'P': return 15;
    case 'Q': return 16;
    case 'R': return 18;
    case 'S': return 18;
    case 'T': return 19;
    case 'U': return 20;
    case 'V': return 21;
    case 'W': return 22;
    case 'X': return 23;
    case 'Y': return 24;
    case 'Z': return 25;
    default: return 0;
}
Bonehead Solution B

Similar to solution A except uses multiple IF statements.

What's wrong with it?
 


Better Solution

return (letter - 'A');
(Note: this only works for a character set like ASCII that has consecutive characters).



Task 3: Determine if a character is a digit in the range 0 to 9.

Bonehead Solution A:

return  (letter == '0') || (letter == '1') || (letter == '2') || (letter == '3') ||
    (letter == '4') || (letter == '5') ||(letter == '6') ||(letter == '7') ||
    (letter == '8') ||(letter == '9') ;

Bonehead Solution B:

return (letter >= '0') && (letter <= '9');
 

What's wrong with it?


Better Solution

return Character.isDigit(letter);



Task 4: make a decision based on the results of some boolean function (for example,  isEmpty()).

Bonehead Solution

if (mystack.isEmpty() == true) dosomething;

What's wrong with it?
 


Better Solution

if (mystack.isEmpty()) dosomething;



Task 5: return a boolean value based on some boolean expression

Bonehead Solution

if (size > 0)
    return true;
else
    return false;

What's wrong with it?
 

Better Solution

return size > 0;



Task 6: initialize an array.

Bonehead Solution

private int[] scores = new int[10];

scores[0] = 5;
scores[1] = 3;
scores[2] = 7;
scores[3] = 8;
scores[4] = 2;
scores[5] = 3;
scores[5] = 5;
scores[7] = 6;
scores[8] = 9;
scores[9] = 3;

What's wrong with it?

Better Solution

private int[] scores = {5, 3, 7, 8, 2, 3, 5, 6, 9, 3};



Task 7:  Assign a value to a variable based on the value of a second variable.

Bonehead Solution

if (turn == 1) color = 1;
elseif (turn == 2) color = 2;
elseif (turn == 3) color = 3;
elseif (turn == 4) color = 4;
elseif (turn == 5) color = 5;
elseif (turn == 6) color = 6;
elseif (turn == 7) color = 7;
elseif (turn == 8) color = 8;
else color = 9;

What's wrong with it?

Better Solution

color = turn;



Task 8: Convert a string representation of a number into a Java int.

Bonehead Solution

public static int stringToInt(String input)
{
    int result = 0;
    int sLen = input.length();
    for (int i = 0; i < sLen; i++)
    {
        result = 10 * result + ((int) (input.charAt(i)) - 48);
    }
    return result;
}
 

What's wrong with it?

Java already has a function to do this.   This is a clear symptom of ignorance of the language.  This is only one of many examples of this kind of boneheadedness. Others functions already available in Java for which ignorant programmers write their own code include:


Better Solution

result = Integer.parseInt(input);



Task 9  Advance the turn among players in a multiplayer game (or any situation that needs to maintain a counter that "rolls over").

Bonehead Solution

if (player ==1)
{
 if (numberOfPlayers >= 2) player = 2;
 else player = 1
}
else if (player == 2)
{
 if (numberOfPlayers >= 3) player = 3;
 else player = 1
}
.
.
.   (repeats five more times!)
.
else if (player == 8)
{
 if (numberOfPlayers >= 9) player = 9;
 else player = 1
}

What's wrong with it?

Better Solution:
        player = player + 1;
        if (player > numberOfPlayers)
            player = 1;

Best Solution:
               player = (player % numberOfPlayers) + 1;
 




Home