[Box Backup] Coding standards

Ben Summers boxbackup@fluffy.co.uk
Wed, 31 Aug 2005 11:05:43 +0100


In preparation for getting the code up for others to work on, I've  
written some notes on coding standards. I hope this documents the  
style and preferences to date, and that I haven't forgotten anything.

I think that consistency is important, and since the code base is  
quite large, we should stick to the existing "standards" regardless  
of whether something else is "better". I don't think anything below  
should place an intolerable burden on anyone.

So, are they OK?

Ben




The coding style should be fairly easy to pick up when looking at the  
source files. But here are some pointers:

Indent with tabs, with 4 character tab stops.

Bracing style:

     if(condition)
     {
     }

Use braces, even if it's a single statement.

Prefer references to pointers.

Function(), if(), switch(), etc... no space before the brackets.

Variable names are prefixed with m (class member), p (pointer), r  
(reference) in that order. Arguments to functions are capitalised  
(ArgumentToFunction, rArgumentToFunction), local variables aren't  
(localVariable). Member variables are caplitalised too, but always  
start with m.

Classes are ClassName (with no prefix), and member functions are  
FunctionName(). Code lives in .cpp and .h files with the same name as  
the class.

Non-member function calls are prefixed with ::, eg ::printf(...).

Exceptions are used. All are autogenerated, and thrown with the  
THROW_EXCEPTION macro. Except for std::bad_alloc, which is thrown  
when memory allocations failed.

Objects are allocated on the stack whereever possible to ease  
exception handling.

No overloading of operators, especially not for i/o. Only exception  
is comparison operators, but even then, only if really justified.  
(Justification: it's not obvious what an operator will do!)

Use the STL wherever useful, but don't use the STL style!

If a function returns a newly allocated object, use an  
std::auto_ptr<> to return it.

Code is split up into logical groups in the lib/* directories,  
although the use of these is minimised.

#include "Box.h" must be the first include in every cpp file. On some  
platforms, failing to do this absolutely first will cause the  
compiled code to crash due to inconsistent options.

There is no global base class.

Serialisation is done using two functions:
         void ReadFromStream(IOStream &rStream, int Timeout);
         void WriteToStream(IOStream &rStream) const;
Serialisable objects are not derived from any particular base class  
as it doesn't seem necessary. Templates can be used if generic code  
is necessary.

All serialised objects use network byte order.