-
Notifications
You must be signed in to change notification settings - Fork 470
Coding style
Some rules for writing code in BOINC. In general:
- Make it short and simple.
- Split up long functions.
- Imitate the style and structure of code that's already there, even if you don't like it.
- If you're writing a function that might be of general utility, make it general, and put it in lib/ or html/inc. Check first - it might already be there.
- Don't copy and paste code. Use functions.
Most functions should return an integer error code. Nonzero means error. See lib/error_numbers.h for a list of error codes. Exceptions:
- PHP database access functions, which use the mysql_* convention that zero means error, and you call mysql_error() or mysql_error_string() to find details.
- Functions that return whether a condition holds;
such functions return bool and should have descriptive names like
is_job_finished()
. - Functions that return a number or other type, and for which no errors are possible.
Calls to functions that return an error code should check the code. Generally they should return non-zero on error, e.g.:
retval = blah();
if (retval) return retval;
Don't use exceptions.
- All files have a comment at the top saying what's in the file (and perhaps what isn't).
- Functions are preceded by a comment saying what they do.
- structs and classes are preceded by a comment saying what they represent.
- Names are descriptive without being verbose (local variables names may be short).
- Class and type names, and
#defined
symbols, are all upper case, with underscores to separate words. - Variable and function names are all lower case, with underscores to separate words.
- No mixed case names.
- Each level of indentation is 4 spaces (not a tab).
- Multi-line function call:
func(
blah, blah, blah, blah, blah,
blah, blah, blah, blah, blah
);
-
switch
statements:case
labels are at same indent level asswitch
switch (foo) {
case 1:
...
break;
case 2:
...
break;
}
- Opening curly brace goes at end of line (not next line):
if (foobar) {
...
} else if (blah) {
...
} else {
...
}
- Always use curly braces on multi-line
if
statements.
if (foo)
return blah; // WRONG
- 1-line
if()
statements are OK:
if (foo) return blah;
- There should be few numeric constants in code. Use defined symbols instead. Put the defines at the top of the file or in the appropriate include file.
- For C++ and PHP, use
//
for all comments. - End multi-line comments with an empty comment line, e.g.
// This function does blah blah
// Call it when blah blah
//
function foo() {
}
- C++
.h
files often contain both interface and implementation. Clearly divide these.
- A
.cpp
file should have the minimum set of #includes to get that particular file to compile (e.g. the includes needed byfoo.cpp
should be infoo.cpp
, notfoo.h
). - For readability, includes should be ordered from general (
<stdio.h>
) to specific (foo.h
). However, this order shouldn't matter.
-
foo.h
should haveextern
declarations for all public functions and variables infoo.cpp
. There should be noextern
statements in.cpp
files.
- If a function or variable is used in only its same file, declare it
static
.
- Operator and function overloading.
- Templates.
- Stream I/O; use printf() and scanf().
- Use
typedef
(not#define
) to define types. - Don't use
memset()
ormemcpy()
to initialize or copy classes that are non-C compatible. Write a default constructor and a copy constructor instead. - Dynamic memory allocation. Functions shouldn't return pointers to malloc'd items.
struct FOO {
...
};
You can then declare variables as:
FOO x;
Comment out blocks of code as follows:
#if 0
...
#endif
PHP scripts should output "HTML 4.01 Transitional". The HTML should pass the W3C validator. This means, e.g., you must have quotes around attributes that have non-alpha characters in them. However, all-alpha attributes need not have quotes, and tags like <br> and <p> need not be closed.
The HTML need not be XHTML.
This means no self-closing tags like <br />
.
Do not access $_POST
or $_GET
directly.
Use get_int()
, get_str()
, post_int()
and post_str()
(from util.inc
) to get POST and GET data.
- Use the database abstraction layer.
- If a POST or GET string value will be used in a database query, use
BoincDb::escape_string
to escape it.