|
|
Microsoft
Coding techniques
Coding techniques incorporate many facets of software development.
Although they usually have no impact on the functionality of the
application, they contribute to an improved comprehension of source code.
All forms of source code are considered here, including programming,
scripting, markup and query languages.
The coding techniques defined here are not proposed to form an
inflexible set of coding standards. Rather, they are meant to serve as a
guide for developing a coding standard for a specific software
project.
The coding techniques are divided into three sections:
Names
The naming scheme is one of the most influential aids to understanding
the logical flow of an application. A name should tell "what" rather than
"how." By avoiding names that expose the underlying implementation, which
can change, you preserve a layer of abstraction that simplifies the
complexity. For example, you could use GetNextStudent()
instead of GetNextArrayElement()
.
A tenet of naming is that difficulty in selecting a proper name may
indicate that you need to further analyze or define the purpose of an
item. Make names long enough to be meaningful but short enough to avoid
verbosity. Programmatically, a unique name serves only to differentiate
one item from another. Expressive names function as an aid to a human
reader; therefore, it makes sense to provide a name that a human reader
can comprehend. However, be certain that the chosen names are in
compliance with the applicable language's rules and standards.
The following points are recommended naming techniques.
Routines
- Avoid elusive names that are open to subjective interpretation, such
as
AnalyzeThis()
for a routine, or xxK8
for a variable. Such names contribute to ambiguity
more than abstraction.
- In object-oriented languages, it is redundant to include class names
in the name of class properties, such as
Book.BookTitle
. Instead, use Book.Title
.
- Use the verb-noun method for naming routines that perform some
operation on a given object, such as
CalculateInvoiceTotal()
.
- In languages that permit function overloading, all overloads should
perform a similar function. For those languages that do not permit
function overloading, establish a naming standard that relates similar
functions.
Variables
- Append computation qualifiers (
Avg
, Sum
, Min
, Max
, Index
) to the end of a
variable name where appropriate.
- Use complementary pairs in variable names, such as min/max,
begin/end, and open/close.
- Since most names are constructed by concatenating several words, use
mixed-case formatting to simplify reading them. In addition, to help
distinguish between variables and routines, use Pascal casing (
CalculateInvoiceTotal
) for routine names where the first
letter of each word is capitalized. For variable names, use camel casing
(documentFormatType
) where the first letter of
each word except the first is capitalized.
- Boolean variable names should contain
Is
which
implies Yes/No or True/False values, such as fileIsFound
.
- Avoid using terms such as
Flag
when naming
status variables, which differ from Boolean variables in that they may
have more than two possible values. Instead of documentFlag
, use a more descriptive name such as documentFormatType
.
- Even for a short-lived variable that may appear in only a few lines
of code, still use a meaningful name. Use single-letter variable names,
such as
i
, or j
, for
short-loop indexes only.
- Do not use literal numbers or literal strings, such as
For i = 1 To 7
. Instead, use named constants, such as
For i = 1 To NUM_DAYS_IN_WEEK
for ease of
maintenance and understanding.
Tables
- When naming tables, express the name in the singular form. For
example, use
Employee
instead of Employees
.
- When naming columns of tables do not repeat the table name; for
example, avoid a field called
EmployeeLastName
in
a table called Employee
.
- Do not incorporate the data type in the name of a column. This will
reduce the amount of work should it become necessary to change the data
type later.
Microsoft SQL Server
- Do not prefix stored procedures with
sp
, which
is a prefix reserved for identifying system stored procedures.
- Do not prefix user-defined functions with
fn_
,
which is a prefix reserved for identifying built-in functions.
- Do not prefix extended stored procedures with
xp_
, which is a prefix reserved for identifying system
extended stored procedures.
Miscellaneous
- Minimize the use of abbreviations, but use those that you have
created consistently. An abbreviation should have only one meaning and
likewise, each abbreviated word should have only one abbreviation. For
example, if you use min to abbreviate minimum, do so everywhere and do
not use min to also abbreviate minute.
- When naming functions, include a description of the value being
returned, such as
GetCurrentWindowName()
.
- File and folder names, like procedure names, should accurately
describe their purpose.
- Avoid reusing names for different elements, such as a routine called
ProcessSales()
and a variable called iProcessSales
.
- Avoid homonyms, such as write and right, when naming elements to
prevent confusion during code reviews.
- When naming elements, avoid commonly misspelled words. Also, be
aware of differences that exist between regional spellings, such as
color/colour and check/cheque.
- Avoid typographical marks to identify data types, such as
$
for strings or %
for integers.
Comments
Software documentation exists in two forms, external and internal.
External documentation, such as specifications, help files, and design
documents, is maintained outside of the source code. Internal
documentation is comprised of comments that developers write within the
source code at development time.
Despite the availability of external documentation, source code
listings should be able to stand on their own because hard-copy
documentation can be misplaced. External documentation should consist of
specifications, design documents, change requests, bug history, and the
coding standard used.
One challenge of internal software documentation is ensuring that the
comments are maintained and updated in parallel with the source code.
Although properly commenting source code serves no purpose at run time, it
is invaluable to a developer who must maintain a particularly intricate or
cumbersome piece of software.
The following points are recommended commenting techniques.
- If developing in C#, use the XML Documentation
feature. For more information, see:XML
Documentation.
- When modifying code, always keep the commenting around it up to
date.
- At the beginning of every routine, it is helpful to provide
standard, boilerplate comments, indicating the routine's purpose,
assumptions, and limitations. A boilerplate comment should be a brief
introduction that explains why it exists and what it can do.
- Avoid adding comments at the end of a line of code; end-line
comments make code more difficult to read. However, end-line comments
are appropriate when annotating variable declarations, in which case,
align all end-line comments at a common tab stop.
- Avoid clutter comments, such as an entire line of asterisks.
Instead, use white space to separate comments from code.
- Avoid surrounding a block comment with a typographical frame. It may
look attractive, but it is difficult to maintain.
- Prior to deployment, remove all temporary or extraneous comments to
avoid confusion during future maintenance work.
- If you need comments to explain a complex section of code, examine
the code to determine if you should rewrite it. If at all possible, do
not document bad code — rewrite it. Although performance should not
typically be sacrificed to make the code simpler for human consumption,
a balance must be maintained between performance and maintainability.
- Use complete sentences when writing comments. Comments should
clarify the code, not add ambiguity.
- Comment as you code because you will not likely have time to do it
later. Also, should you get a chance to revisit code you have written,
that which is obvious today probably will not be obvious six weeks from
now.
- Avoid superfluous or inappropriate comments, such as humorous
sidebar remarks.
- Use comments to explain the intent of the code. They should not
serve as inline translations of the code.
- Comment anything that is not readily obvious in the code.
- To prevent recurring problems, always use comments on bug fixes and
work-around code, especially in a team environment.
- Use comments on code that consists of loops and logic branches.
These are key areas that will assist source code readers.
- Throughout the application, construct comments using a uniform style
with consistent punctuation and structure.
- Separate comments from comment delimiters with white space. Doing so
will make comments obvious and easy to locate when viewed without color
clues.
Format
Formatting makes the logical organization of the code obvious. Taking
the time to ensure that the source code is formatted in a consistent,
logical manner is helpful to you and to other developers who must decipher
the source code.
The following points are recommended formatting techniques.
- Establish a standard size for an indent, such as four spaces, and
use it consistently. Align sections of code using the prescribed
indentation.
- Use a monotype font when publishing hard-copy versions of the source
code.
- Align open and close braces vertically where brace pairs align, such
as:
for (i = 0; i < 100; i++)
{
...
}
You can also use a slanting style, where open braces appear at the
end of the line and close braces appear at the beginning of the line,
such as:
for (i = 0; i < 100; i++){
...
}
Whichever style you choose, use that style throughout the source
code.
- Indent code along the lines of logical construction. Without
indenting, code becomes difficult to follow, such as:
If ... Then
If ... Then
...
Else
End If
Else
...
End If
Indenting the code yields easier-to-read code, such as:
If ... Then
If ... Then
...
Else
...
End If
Else
...
End If
- Establish a maximum line length for comments and code to avoid
having to scroll the source code editor and to allow for clean hard-copy
presentation.
- Use spaces before and after most operators when doing so does not
alter the intent of the code. For example, an exception is the pointer
notation used in C++.
- Use white space to provide organizational clues to source code.
Doing so creates "paragraphs" of code, which aid the reader in
comprehending the logical segmenting of the software.
- When a line is broken across several lines, make it obvious that it
is incomplete without the following line by placing the concatenation
operator at the end of each line instead of at the beginning.
- Where appropriate, avoid placing more than one statement per line.
An exception is a loop in C, C++, C#, or JScript, such as
for (i = 0; i < 100; i++)
.
- When writing HTML, establish a standard format for tags and
attributes, such as all uppercase for tags and all lowercase for
attributes. As an alternative, adhere to the XHTML specification to
ensure all HTML documents are valid. Although there are file size
trade-offs to consider when creating Web pages, use quoted attribute
values and closing tags to ease maintainability.
- When writing SQL statements, use all uppercase for keywords and
mixed case for database elements, such as tables, columns, and views.
- Divide source code logically between physical files.
- Put each major SQL clause on a separate line so statements are
easier to read and edit, for example:
SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA'
- Break large, complex sections of code into smaller, comprehensible
modules.