diff --git a/doc/GUIDELINES b/doc/GUIDELINES index 8038f997de186017c4b2fe1519fc8aa471a0bd0c..5603ca3f657c13001b1e584452c3592d0be93360 100644 --- a/doc/GUIDELINES +++ b/doc/GUIDELINES @@ -109,7 +109,7 @@ eg, | | Within the implementation, a loop over all patches is done: | @code - | forAll (patches, patchI) + | forAll(patches, patchI) | { | ... // some operation | } @@ -222,4 +222,4 @@ The doc/Doxygen/tools directory contains miscellaneous scripts for finding and possibly repairing documentation issues. -Updated: 2008-03-17 +Updated: 2009-11-27 diff --git a/doc/codingStyleGuide.org b/doc/codingStyleGuide.org index 6c5f691aa54955b9154246c70acae9d41ae1445b..da50ffcd93a5ce855af1f393a03cb4597957a6fa 100644 --- a/doc/codingStyleGuide.org +++ b/doc/codingStyleGuide.org @@ -17,292 +17,244 @@ + Avoid trailing whitespace. + stream output - << is always four characters after the start of the stream, - so that the << symbols align, i.e. + =<<= is always four characters after the start of the stream, + so that the =<<= symbols align, i.e. -#+BEGIN_EXAMPLE - Info<< ... - os << ... -#+END_EXAMPLE + :Info<< ... + :os << ... so -#+BEGIN_EXAMPLE - WarningIn("className::functionName()") - << "Warning message" -#+END_EXAMPLE + :WarningIn("className::functionName()") + : << "Warning message" NOT -#+BEGIN_EXAMPLE - WarningIn("className::functionName()") - << "Warning message" -#+END_EXAMPLE + :WarningIn("className::functionName()") + :<< "Warning message" - + no unnecessary class section headers, i.e. remove - -#+BEGIN_EXAMPLE - // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // - - // Check - // Edit + + no unnecessary class section headers, i.e. remove - // Write -#+END_EXAMPLE + :// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + : + :// Check + : + :// Edit + : + :// Write if they contain nothing, even if planned for 'future use' + class titles are centred -#+BEGIN_EXAMPLE - /*---------------------------------------------------------------------------*\ - Class exampleClass Declaration - \*---------------------------------------------------------------------------*/ -#+END_EXAMPLE + :/*---------------------------------------------------------------------------*\ + : Class exampleClass Declaration + :\*---------------------------------------------------------------------------*/ - NOT + NOT -#+BEGIN_EXAMPLE - /*---------------------------------------------------------------------------*\ - Class exampleClass Declaration - \*---------------------------------------------------------------------------*/ -#+END_EXAMPLE + :/*---------------------------------------------------------------------------*\ + : Class exampleClass Declaration + :\*---------------------------------------------------------------------------*/ -*** .H Files +*** The =.H= Files + header file spacing - Leave two empty lines between sections (as per functions in the .C file etc) + Leave two empty lines between sections (as per functions in the =.C= file etc) + use "//- Comment" comments in header file + add descriptions to class data and functions + destructor If adding a comment to the destructor - use //- and code as a normal function: -#+BEGIN_EXAMPLE - //- Destructor - ~className(); -#+END_EXAMPLE + ://- Destructor + :~className(); + + inline functions Use inline functions where appropriate in a separate classNameI.H file. Avoid cluttering the header file with function bodies. -*** .C Files - + Do not open/close namespaces in a .C file +*** The =.C= Files + + Do not open/close namespaces in a =.C= file Fully scope the function name, i.e. -#+BEGIN_EXAMPLE - Foam::returnType Foam::className::functionName() -#+END_EXAMPLE + :Foam::returnType Foam::className::functionName() NOT -#+BEGIN_EXAMPLE - namespace Foam - { - ... - - returnType className::functionName() - - ... - } -#+END_EXAMPLE + :namespace Foam + :{ + : ... + : + : returnType className::functionName() + : + : ... + :} EXCEPTION - When there are multiple levels of namespace, they may be used in the .C + When there are multiple levels of namespace, they may be used in the =.C= file, i.e. -#+BEGIN_EXAMPLE - namespace Foam - { - namespace compressible - { - namespace RASModels - { - - ... - - } // End namespace RASModels - } // End namespace compressible - } // End namespace Foam -#+END_EXAMPLE + :namespace Foam + :{ + :namespace compressible + :{ + :namespace RASModels + :{ + : + : ... + : + :} // End namespace RASModels + :} // End namespace compressible + :} // End namespace Foam + Use two empty lines between functions -*** Coding Practise +*** Coding Practice + passing data as arguments or return Pass bool, label and scalar as copy, anything larger by reference. + + const Use everywhere it is applicable. + + variable initialisation using "=" -#+BEGIN_EXAMPLE - const className& variableName = otherClass.data(); -#+END_EXAMPLE + : const className& variableName = otherClass.data(); NOT -#+BEGIN_EXAMPLE - const className& variableName(otherClass.data()); -#+END_EXAMPLE + : const className& variableName(otherClass.data()); + virtual functions If a class is virtual - make all derived classes virtual. *** Conditional Statements -#+BEGIN_EXAMPLE - if (condition) - { - code; - } -#+END_EXAMPLE + :if (condition) + :{ + : code; + :} OR -#+BEGIN_EXAMPLE - if - ( - long condition - ) - { - code; - } -#+END_EXAMPLE + :if + :( + : long condition + :) + :{ + : code; + :} NOT (no space between "if" and "(") -#+BEGIN_EXAMPLE - if(condition) - { - code; - } -#+END_EXAMPLE - -*** `for' Loops -#+BEGIN_EXAMPLE - for (i = 0; i < maxI; i++) - { - code; - } -#+END_EXAMPLE + :if(condition) + :{ + : code; + :} + +*** =for= Loops + :for (i = 0; i < maxI; i++) + :{ + : code; + :} OR -#+BEGIN_EXAMPLE - for - ( - i = 0; - i < maxI; - i++ - ) - { - code; - } -#+END_EXAMPLE + :for + :( + : i = 0; + : i < maxI; + : i++ + :) + :{ + : code; + :} NOT (no space between "for" and "(") -#+BEGIN_EXAMPLE - for(i = 0; i < maxI; i++) - { - code; - } -#+END_EXAMPLE + :for(i = 0; i < maxI; i++) + :{ + : code; + :} + + Note that when indexing through iterators, it is often slightly more + efficient to use the pre-increment form. Eg, =++iter= instead of =iter++= -*** `forAll' loops - like for loops, but +*** =forAll= loops + like =for= loops, but -#+BEGIN_EXAMPLE - forAll( -#+END_EXAMPLE + :forAll( NOT -#+BEGIN_EXAMPLE - forAll ( -#+END_EXAMPLE + :forAll ( *** Splitting Over Multiple Lines - + splitting return type and function name + +**** Splitting return type and function name + split initially after the function return type and left align - + do not put "const" onto its own line - use a split to keep it with the - function name and arguments. + + do not put "const" onto its own line - use a split to keep it with + the function name and arguments. so: -#+BEGIN_EXAMPLE - const Foam::longReturnTypeName& - Foam::longClassName::longFunctionName const -#+END_EXAMPLE + :const Foam::longReturnTypeName& + :Foam::longClassName::longFunctionName const NOT -#+BEGIN_EXAMPLE - const Foam::longReturnTypeName& - Foam::longClassName::longFunctionName const -#+END_EXAMPLE + :const Foam::longReturnTypeName& + : Foam::longClassName::longFunctionName const NOR -#+BEGIN_EXAMPLE - const Foam::longReturnTypeName& Foam::longClassName::longFunctionName - const -#+END_EXAMPLE + :const Foam::longReturnTypeName& Foam::longClassName::longFunctionName + :const NOR -#+BEGIN_EXAMPLE - const Foam::longReturnTypeName& Foam::longClassName:: - longFunctionName const -#+END_EXAMPLE + :const Foam::longReturnTypeName& Foam::longClassName:: + :longFunctionName const + + + if it needs to be split again, split at the function name (leaving + behind the preceding scoping "::"s), and again, left align, i.e. - + if need to split again, split at the function name (leaving behind the - preceding scoping "::"s), and again, left align, i.e. + For example, -#+BEGIN_EXAMPLE - const Foam::longReturnTypeName& - Foam::veryveryveryverylongClassName:: - veryveryveryverylongFunctionName const -#+END_EXAMPLE + :const Foam::longReturnTypeName& + :Foam::veryveryveryverylongClassName:: + :veryveryveryverylongFunctionName const - + splitting long lines at an "=" +**** Splitting long lines at an "=" Indent after split -#+BEGIN_EXAMPLE - variableName = - longClassName.longFunctionName(longArgument); -#+END_EXAMPLE + :variableName = + : longClassName.longFunctionName(longArgument); OR (where necessary) -#+BEGIN_EXAMPLE - variableName = - longClassName.longFunctionName - ( - longArgument1, - longArgument2 - ); -#+END_EXAMPLE + :variableName = + : longClassName.longFunctionName + : ( + : longArgument1, + : longArgument2 + : ); NOT -#+BEGIN_EXAMPLE - variableName = - longClassName.longFunctionName(longArgument); -#+END_EXAMPLE + :variableName = + :longClassName.longFunctionName(longArgument); NOR -#+BEGIN_EXAMPLE - variableName = longClassName.longFunctionName - ( - longArgument1, - longArgument2 - ); -#+END_EXAMPLE + :variableName = longClassName.longFunctionName + :( + : longArgument1, + : longArgument2 + :); *** Maths and Logic + operator spacing @@ -318,34 +270,201 @@ with the operator on the lower line. Align operator so that first variable, function or bracket on the next line is 4 spaces indented i.e. -#+BEGIN_EXAMPLE - variableName = - a * (a + b) - - exp(c/d) - * (k + t); -#+END_EXAMPLE + :variableName = + : a * (a + b) + : - exp(c/d) + : * (k + t); This is sometime more legible when surrounded by extra parentheses: -#+BEGIN_EXAMPLE - variableName = - ( - a * (a + b) - - exp(c/d) - * (k + t) - ); -#+END_EXAMPLE + :variableName = + :( + : a * (a + b) + : - exp(c/d) + : * (k + t) + :); + splitting logical tests over several lines outdent the operator so that the next variable to test is aligned with the four space indentation, i.e. -#+BEGIN_EXAMPLE - if - ( - a == true - && b == c - ) -#+END_EXAMPLE + :if + :( + : a == true + : && b == c + :) + +** Documentation + +*** General + + + For readability in the comment blocks, certain tags are used that are + translated by pre-filtering the file before sending it to Doxygen. + + + The tags start in column 1, the contents follow on the next lines and + indented by 4 spaces. The filter removes the leading 4 spaces from the + following lines until the next tag that starts in column 1. + + + The 'Class' and 'Description' tags are the most important ones. + + + The first paragraph following the 'Description' will be used for the + brief description, the remaining paragraphs become the detailed + description. + + For example, + + :Class + : Foam::myClass + : + :Description + : A class for specifying the documentation style. + : + : The class is implemented as a set of recommendations that may + : sometimes be useful. + + + The class name must be qualified by its namespace, otherwise Doxygen + will think you are documenting some other class. + + + If you don't have anything to say about the class (at the moment), use + the namespace-qualified class name for the description. This aids with + finding these under-documented classes later. + + + :Class + : Foam::myUnderDocumentedClass + : + :Description + : Foam::myUnderDocumentedClass + + + + Use 'Class' and 'Namespace' tags in the header files. + The Description block then applies to documenting the class. + + + Use 'InClass' and 'InNamespace' in the source files. + The Description block then applies to documenting the file itself. + + + :InClass + : Foam::myClass + : + :Description + : Implements the read and writing of files. + +*** Doxygen Special Commands + + Doxygen has a large number of special commands with a '\' prefix or a + (alternatively) an '@' prefix. + + The '@' prefix form is recommended for most Doxygen specials, since it + has the advantage of standing out. It also happens to be what projects + like gcc and VTK are using. + + The '\' prefix form, however, looks a bit better for the '\n' newline + command and when escaping single characters - eg, '\@', '\<', '\>', etc. + + Since the filtering removes the leading 4 spaces within the blocks, the + Doxygen commmands can be inserted within the block without problems. + + + :InClass + : Foam::myClass + : + :Description + : Implements the read and writing of files. + : + : An example input file: + : @verbatim + : patchName + : { + : type myPatchType; + : refValue 100; + : value uniform 1; + : } + : @endverbatim + : + : Within the implementation, a loop over all patches is done: + : @code + : forAll(patches, patchI) + : { + : ... // some operation + : } + : @endcode + +*** HTML Special Commands + + Since Doxygen also handles HTML tags to a certain extent, the angle + brackets need quoting in the documentation blocks. Non-HTML tags cause + Doxygen to complain, but seem to work anyhow. + + eg, + + The template with type <HR> is a bad example. + + + The template with type \<HR\> is a better example. + + + The template with type <Type> causes Doxygen to complain about an + unknown html type, but it seems to work okay anyhow. + + +*** Documenting Namespaces + + + If namespaces are explictly declared with the Namespace() macro, + they should be documented there. + + + If the namespaces is used to hold sub-models, the namespace can be + documented in the same file as the class with the model selector. + eg, + :documented namespace 'Foam::functionEntries' within the + :class 'Foam::functionEntry' + + + If nothing else helps, find some sensible header. + eg, + :namespace 'Foam' is documented in the foamVersion.H file + + +*** Documenting Typedefs and classes defined via macros + + ... not yet properly resolved + + +*** Documenting Applications + + Any number of classes might be defined by a particular application, but + these classes will not, however, be available to other parts of + OpenFOAM. At the moment, the sole purpuse for running Doxygen on the + applications is to extract program usage information for the '-doc' + option. + + The documentation for a particular application is normally contained + within the first comment block in a =.C= source file. The solution is this + to invoke a special filter for the "applications/{solver,utilities}" + directories that only allows the initial comment block for the =.C= files + through. + + The layout of the application documentation has not yet been finalized, + but foamToVTK shows an initial attempt. + +*** Orthography (an opinion) + + Given the origins of OpenFOAM, the British spellings (eg, neighbour and + not neighbor) are generally favoured. For code sections that interact + with external libraries, it can be useful to adopt American spellings, + especially for names that constitute a significant part of the external + library - eg, 'color' within graphics sub-systems. + + Both '-ize' and the '-ise' variant are found in the code comments. If + used as a variable or class method name, it is probably better to use + '-ize', which is considered the main form by the Oxford University + Press. + + Eg, + :myClass.initialize() + + + The word "its" (possesive) vs. "it's" (colloquial for "it is" or "it has") + seems to confuse non-native (and some native) English speakers. + It is better to donate the extra keystrokes and write "it is" or "it has". + Any remaining "it's" are likely an incorrect spelling of "its". + +