A style guide is a set of mandatory requirements for layout and formatting. Students are expected to follow this style guide when submitting programs in Dr. East's section of 810:061 Computer Science I. The goal here is to supply a subset of coding style useful for an introductory course in Java. This document is an adaptation of that supplied by Cay Horstmann with his text Big Java (available at http://www.horstmann.com/bigj/style.html). Horstmann's guide contains rationale and discusstion not included here.
Each Java program is a collection of one or more source files. The executable program is obtained by compiling these files. Organize the material in each file as follows:
package
statement, if appropriateimport
statementspublic
classThe comment explaining the purpose of this file should be in the format
recognized by the javadoc
utility. Start with a
/**
,
and use the @author
and @version
tags:
/** Classes to manipulate widgets. Solves CS101 homework assignment #3 COPYRIGHT (C) 1997 Harry Hacker. All Rights Reserved. @author Harry Hacker @version 1.01 1997-02-15 */
Each class should be preceded by a class comment explaining the purpose of the class.
First list all public features, then all private features.
Within the public and private section, use the following order:
Leave three blank lines after every method (or begin them on a new page, if you control paging).
All non-final
variables must be private. (However,
instance variables of a private
inner class may be public.)
Methods and final variables can be either public or private, as
appropriate.
All features must be tagged public
or
private
.
Avoid static variables (except final
ones).
Every method (except for main
) starts with a comment in
javadoc
format. Include citations/references and include
any expecatations of the method.
/** Convert calendar date into Julian day. Note: This algorithm is from Press et al., Numerical Recipes in C, 2nd ed., Cambridge University Press, 1992 Note: Expects day, month, and year to represent a date after Jan. 1, 1601. @param day day of the date to be converted @param month month of the date to be converted @param year year of the date to be converted @return the Julian day number that begins at noon of given calendar date. */ public static int dat2jul(int day, int month, int year) { . . . }
Methods must have at most 30 lines of code. The method signature, comments, blank lines, and lines containing only braces are not included in this count.
Avoid comments that duplicate code, e.g.,
int vowelCount; // count of vowels for (int i=1; i <= 100; i++ ) // count to 100 {}
Make comments distinguishable from code, e.g.,
// determine location of minimum value int least = 0; for (int i=1; i <= value.length(); i++) { if (value[i] < value[least]) { least = i; } }instead of// determine location of minimum value int least = 0; for (int i=1; i <= value.length(); i++) { if (value[i] < value[least]) { least = i; } }
Do not define all variables at the beginning of a block. Instead, define each variable just before it is used for the first time:
{ . . . double xold = Integer.parseInt(input); boolean more = false; while (more) { double xnew = (xold + a / xold) / 2; // OK . . . } . . . }
Do not define two variables on the same line:
In Java, constants must be defined with the keyword final
.
If the constant is used by multiple methods, declare it as static
final
. Define static final variables as private
.
Do not use magic numbers! A magic number is a numeric constant embedded in code, without a constant definition. Any number except -1, 0, 1, and 2 is considered magic:
When declaring array variables, group the [] with the type, not the variable.
int[] values; // OK int values[]; // Ugh--this is an ugly holdover from C
if
StatementAvoid the "if
... if
...
else
" trap. The code
will not do what the indentation level suggests, and it can take hours to find such a bug. Always use an extra pair ofif ( ... ) if ( ... ) ...; else ...;
{
...
}
when dealing with "if
...
if
... else
":
if ( ... ) { if ( ... ) ...; } // {...} are necessary else ...; if ( ... ) { if ( ... ) ...; else ...; } // {...} not necessary, but they keep you out of trouble
for
StatementUse for
loops only when a variable runs from somewhere to
somewhere with some constant increment/decrement. Do not use
the for
loop for weird constructs such as:
Make such a loop into afor (a = a / 2; count < ITERATIONS; System.out.println(xnew)) // Don't
while
loop. That way, the sequence
of instructions is much clearer.
Avoid the switch
statement, because it is easy to fall
through accidentally to an unwanted case. Use
if
/else
instead.
Avoid the break
or continue
statements. Use
another boolean
variable to control the execution flow.
Do not tag a method with an overly general exception specification:
Instead, specifically declare any checked exceptions that your method may throw:Widget readWidget(Reader in) throws Exception // Bad
Widget readWidget(Reader in) throws IOException, MalformedWidgetException // Good
Do not "squelch" exceptions:
try { double price = in.readDouble(); } catch (Exception e) {} // Bad
The following rules specify when to use upper- and lowercase letters in identifier names.
firstPlayer
.CLOCK_RADIUS
.BankTeller
.Make names reasonably long & descriptive. Use firstPlayer
instead of fp
. No drppng f vwls. Local variables that are
fairly routine can be short (ch
, i
) as long as
they are really just boring holders for an input character, a loop
counter, and so on. Also, do not use crt
, n
,
pv
, vCnt
, for variables in
your method. Surely these variables all have specific purposes and can
be named to remind the reader of them (for example,
current
, next
, previous
,
vowelCount
, . . . ).
Use tab stops every three or four columns.
Indent each statement within the scope of a statement by one level:
if ( . . . ) { int location = 0; while (location <= value.length() && value[location] <= target) { location++; } }
Every line must fit on 78 columns. If you must break a statement, add an indentation level (or two) for the continuation. Start the indented line with an operator (if possible).
a[n] = .................................................. + .................;
If the condition in an if
or while
statement
must be broken, be sure to brace the body in, even if it consists
of only one statement:
if ( ......................................................... && .................. || .......... ) { . . . }
Avoid single- or in-line statements, e.g.,
if (x == 0) y = 0; for (int i = 0; i < a.length; i++) System.out.println(a[i]);
Use blank lines freely to separate parts of a method that are logically distinct.
Use more blank lines between code segments than are used within them.
Use a blank space around every binary operator and around sets of parentheses or brackets that form expressions but not between them:
x1 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a); // Good x1 = ( -b - Math.sqrt(b * b - 4 * a * c) ) / (2 * a); // Also okay x1=(-b-Math.sqrt(b*b-4*a*c))/(2*a); //Bad
Leave a blank space after (and not before) each comma or semicolon.
Opening and closing braces must line up, either horizontally or vertically:
while (i < n) { System.out.println(a[i]); i++; } while (i < n) { System.out.println(a[i]); i++; }
Some programmers take great pride in lining up certain columns in their code. This is undeniably neat, but the layout is not stable under change. Avoid doing it.
firstRecord = other.firstRecord; lastRecord = other.lastRecord; cutoff = other.cutoff;
Do not use //
comments for comments that extend for more
than two lines. You don't want to have to move the //
around when you edit the comment.
// comment don't do this // more comment // more comment
Use /*
... */
comments instead. When using
/*
... */
comments, don't "beautify"
them with additional asterisks:
/* commentdon't do this * more comment * more comment */
Instead, format long comments like this:
/* comment more comment more comment */
These comments are easier to maintain as your program changes. If you have to choose between pretty but unmaintained comments and ugly comments that are up to date, truth wins over beauty.