From 30a46904e5d199115824336dce674bb38c60b5b6 Mon Sep 17 00:00:00 2001 From: Henry Weller <http://cfd.direct> Date: Tue, 19 Apr 2016 10:02:14 +0100 Subject: [PATCH] doc/codingStyleGuide.org: Added specification references in class headers --- doc/codingStyleGuide.org | 216 ++++++++++++++++++++++----------------- 1 file changed, 123 insertions(+), 93 deletions(-) diff --git a/doc/codingStyleGuide.org b/doc/codingStyleGuide.org index 4a6a679d55..e763b7c0c1 100644 --- a/doc/codingStyleGuide.org +++ b/doc/codingStyleGuide.org @@ -2,7 +2,7 @@ # #+TITLE: OpenFOAM C++ style guide #+AUTHOR: OpenFOAM Foundation -#+DATE: Aug 2011-2015 +#+DATE: 2011-2016 #+LINK: http://www.OpenFOAM.org #+OPTIONS: author:nil ^:{} #+STARTUP: hidestars @@ -22,23 +22,23 @@ + Stream output + =<<= is always four characters after the start of the stream, so that the =<<= symbols align, i.e. - #+BEGIN_SRC c++ + #+begin_src c++ Info<< ... os << ... - #+END_SRC + #+end_src so - #+BEGIN_SRC C++ + #+begin_src C++ WarningInFunction << "Warning message" - #+END_SRC + #+end_src *not* - #+BEGIN_SRC C++ + #+begin_src C++ WarningInFunction << "Warning message" - #+END_SRC + #+end_src + Remove unnecessary class section headers, i.e. remove -#+BEGIN_SRC C++ +#+begin_src C++ // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // Check @@ -46,21 +46,21 @@ // Edit // Write -#+END_SRC +#+end_src if they contain nothing, even if planned for 'future use' + Class titles should be centred -#+BEGIN_SRC C++ +#+begin_src C++ /*---------------------------------------------------------------------------*\ Class exampleClass Declaration \*---------------------------------------------------------------------------*/ -#+END_SRC +#+end_src *not* -#+BEGIN_SRC C++ +#+begin_src C++ /*---------------------------------------------------------------------------*\ Class exampleClass Declaration \*---------------------------------------------------------------------------*/ -#+END_SRC +#+end_src *** The /.H/ Header Files + Header file spacing @@ -71,42 +71,42 @@ + Text on the line starting with =//-= becomes the Doxygen brief description; + Text on subsequent lines becomes the Doxygen detailed description /e.g./ - #+BEGIN_SRC C++ + #+begin_src C++ //- A function which returns a thing // This is a detailed description of the function // which processes stuff and returns other stuff // depending on things. thing function(stuff1, stuff2); - #+END_SRC + #+end_src + List entries start with =-= or =-#= for numbered lists but cannot start on the line immediately below the brief description so - #+BEGIN_SRC C++ + #+begin_src C++ //- Compare triFaces // Returns: // - 0: different // - +1: identical // - -1: same face, but different orientation static inline int compare(const triFace&, const triFace&); - #+END_SRC + #+end_src or - #+BEGIN_SRC C++ + #+begin_src C++ //- Compare triFaces returning 0, +1 or -1 // // - 0: different // - +1: identical // - -1: same face, but different orientation static inline int compare(const triFace&, const triFace&); - #+END_SRC + #+end_src *not* - #+BEGIN_SRC C++ + #+begin_src C++ //- Compare triFaces returning 0, +1 or -1 // - 0: different // - +1: identical // - -1: same face, but different orientation static inline int compare(const triFace&, const triFace&); - #+END_SRC + #+end_src + List can be nested for example - #+BEGIN_SRC C++ + #+begin_src C++ //- Search for \em name // in the following hierarchy: // -# personal settings: @@ -125,15 +125,15 @@ // \return the full path name or fileName() if the name cannot be found // Optionally abort if the file cannot be found fileName findEtcFile(const fileName&, bool mandatory=false); - #+END_SRC + #+end_src + For more details see the Doxygen documentation. + Destructor + When adding a comment to the destructor use =//-= and code as a normal function: - #+BEGIN_SRC C++ + #+begin_src C++ //- Destructor ~className(); - #+END_SRC + #+end_src + Inline functions + Use inline functions where appropriate in a separate /classNameI.H/ file. Avoid cluttering the header file with function bodies. @@ -141,22 +141,22 @@ *** The /.C/ Sourcs Files + Do not open/close namespaces in a /.C/ file + Fully scope the function name, i.e. - #+BEGIN_SRC C++ + #+begin_src C++ Foam::returnType Foam::className::functionName() - #+END_SRC + #+end_src *not* - #+BEGIN_SRC C++ + #+begin_src C++ namespace Foam { ... returnType className::functionName() ... } - #+END_SRC + #+end_src *Exception* When there are multiple levels of namespace, they may be used in the /.C/ file to avoid excessive clutter, i.e. - #+BEGIN_SRC C++ + #+begin_src C++ namespace Foam { namespace compressible @@ -167,7 +167,7 @@ } // End namespace RASModels } // End namespace compressible } // End namespace Foam - #+END_SRC + #+end_src + Use two empty lines between functions @@ -178,25 +178,25 @@ + =const= + Use everywhere it is applicable. + Variable initialisation using - #+BEGIN_SRC C++ + #+begin_src C++ const className& variableName = otherClass.data(); - #+END_SRC + #+end_src *not* - #+BEGIN_SRC C++ + #+begin_src C++ const className& variableName(otherClass.data()); - #+END_SRC + #+end_src + Virtual functions + If a class is virtual, make all derived classes virtual. *** Conditional Statements - #+BEGIN_SRC C++ + #+begin_src C++ if (condition) { code; } - #+END_SRC + #+end_src OR - #+BEGIN_SRC C++ + #+begin_src C++ if ( long condition @@ -204,24 +204,24 @@ { code; } - #+END_SRC + #+end_src *not* (no space between =if= and =(= used) - #+BEGIN_SRC C++ + #+begin_src C++ if(condition) { code; } - #+END_SRC + #+end_src *** =for= and =while= Loops - #+BEGIN_SRC C++ + #+begin_src C++ for (i = 0; i < maxI; i++) { code; } - #+END_SRC + #+end_src OR - #+BEGIN_SRC C++ + #+begin_src C++ for ( i = 0; @@ -231,33 +231,33 @@ { code; } - #+END_SRC + #+end_src *not* this (no space between =for= and =(= used) - #+BEGIN_SRC C++ + #+begin_src C++ for(i = 0; i < maxI; i++) { code; } - #+END_SRC + #+end_src Note that when indexing through iterators, it is often slightly more efficient to use the pre-increment form. Eg, =++iter= instead of =iter++= *** =forAll=, =forAllIter=, =forAllConstIter=, /etc./ loops Like =for= loops, but - #+BEGIN_SRC C++ + #+begin_src C++ forAll( - #+END_SRC + #+end_src *not* - #+BEGIN_SRC C++ + #+begin_src C++ forAll ( - #+END_SRC + #+end_src Using the =forAllIter= and =forAllConstIter= macros is generally advantageous - less typing, easier to find later. However, since they are macros, they will fail if the iterated object contains any commas /e.g./ following will FAIL!: - #+BEGIN_SRC C++ + #+begin_src C++ forAllIter(HashTable<labelPair, edge, Hash<edge>>, foo, iter) - #+END_SRC + #+end_src These convenience macros are also generally avoided in other container classes and OpenFOAM primitive classes. @@ -266,104 +266,104 @@ + 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. - #+BEGIN_SRC C++ + #+begin_src C++ const Foam::longReturnTypeName& Foam::longClassName::longFunctionName const - #+END_SRC + #+end_src *not* - #+BEGIN_SRC C++ + #+begin_src C++ const Foam::longReturnTypeName& Foam::longClassName::longFunctionName const - #+END_SRC + #+end_src *nor* - #+BEGIN_SRC C++ + #+begin_src C++ const Foam::longReturnTypeName& Foam::longClassName::longFunctionName const - #+END_SRC + #+end_src *nor* - #+BEGIN_SRC C++ + #+begin_src C++ const Foam::longReturnTypeName& Foam::longClassName:: longFunctionName const - #+END_SRC + #+end_src + If it needs to be split again, split at the function name (leaving behind the preceding scoping =::=s), and again, left align, i.e. - #+BEGIN_SRC C++ + #+begin_src C++ const Foam::longReturnTypeName& Foam::veryveryveryverylongClassName:: veryveryveryverylongFunctionName const - #+END_SRC + #+end_src ***** Splitting long lines at an "=" Indent after split - #+BEGIN_SRC C++ + #+begin_src C++ variableName = longClassName.longFunctionName(longArgument); - #+END_SRC + #+end_src OR (where necessary) - #+BEGIN_SRC C++ + #+begin_src C++ variableName = longClassName.longFunctionName ( longArgument1, longArgument2 ); - #+END_SRC + #+end_src *not* - #+BEGIN_SRC C++ + #+begin_src C++ variableName = longClassName.longFunctionName(longArgument); - #+END_SRC + #+end_src *nor* - #+BEGIN_SRC C++ + #+begin_src C++ variableName = longClassName.longFunctionName ( longArgument1, longArgument2 ); - #+END_SRC + #+end_src *** Maths and Logic + Operator spacing - #+BEGIN_SRC C++ + #+begin_src C++ a + b, a - b a*b, a/b a & b, a ^ b a = b, a != b a < b, a > b, a >= b, a <= b a || b, a && b - #+END_SRC + #+end_src + Splitting formulae over several lines Split and indent as per "splitting long lines at an =" 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_SRC C++ + #+begin_src C++ variableName = a*(a + b) *exp(c/d) *(k + t); - #+END_SRC + #+end_src This is sometimes more legible when surrounded by extra parentheses: - #+BEGIN_SRC C++ + #+begin_src C++ variableName = ( a*(a + b) *exp(c/d) *(k + t) ); - #+END_SRC + #+end_src + 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_SRC C++ + #+begin_src C++ if ( a == true && b == c ) - #+END_SRC + #+end_src ** Documentation *** General @@ -376,7 +376,7 @@ + The first paragraph following the 'Description' will be used for the brief description, the remaining paragraphs become the detailed description. For example, - #+BEGIN_SRC C++ + #+begin_example C++ Class Foam::myClass @@ -385,38 +385,38 @@ The class is implemented as a set of recommendations that may sometimes be useful. - #+END_SRC + #+end_example + 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. - #+BEGIN_SRC C++ + #+begin_example C++ Class Foam::myUnderDocumentedClass Description Foam::myUnderDocumentedClass - #+END_SRC + #+end_example + 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. - #+BEGIN_SRC C++ + #+begin_example C++ InClass Foam::myClass Description Implements the read and writing of files. - #+END_SRC + #+end_example *** Doxygen Special Commands Doxygen has a large number of special commands with a =\= prefix. Since the filtering removes the leading spaces within the blocks, the Doxygen commmands can be inserted within the block without problems. - #+BEGIN_SRC C++ + #+begin_example C++ InClass Foam::myClass @@ -440,7 +440,7 @@ ... // some operation } \endcode - #+END_SRC + #+end_example *** HTML Special Commands Since Doxygen also handles HTML tags to a certain extent, the angle @@ -457,15 +457,15 @@ + 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. /e.g./, - #+BEGIN_SRC C++ + #+begin_example C++ documented namespace 'Foam::functionEntries' within the class 'Foam::functionEntry' - #+END_SRC + #+end_example + If nothing else helps, find some sensible header. /e.g./, - #+BEGIN_SRC C++ + #+begin_example C++ namespace 'Foam' is documented in the foamVersion.H file - #+END_SRC + #+end_example *** Documenting Applications Any number of classes might be defined by a particular application, but @@ -491,6 +491,36 @@ 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. /e.g./, - #+BEGIN_SRC C++ + #+begin_src C++ myClass.initialize() - #+END_SRC + #+end_src +*** References + References provided in the =Description= section of the class header files + should be formatted in the [[http://www.apastyle.org][APA (American + Psychological Association)]] style /e.g./ from =kEpsilon.H= + #+begin_example +Description + Standard k-epsilon turbulence model for incompressible and compressible + flows including rapid distortion theory (RDT) based compression term. + + Reference: + \verbatim + Standard model: + Launder, B. E., & Spalding, D. B. (1972). + Lectures in mathematical models of turbulence. + + Launder, B. E., & Spalding, D. B. (1974). + The numerical computation of turbulent flows. + Computer methods in applied mechanics and engineering, + 3(2), 269-289. + + For the RDT-based compression term: + El Tahry, S. H. (1983). + k-epsilon equation for compressible reciprocating engine flows. + Journal of Energy, 7(4), 345-353. + \endverbatim + #+end_example + The APA style is a commonly used standard and references are available in + this format from many sources including + [[http://www.citationmachine.net/apa/cite-a-book][Citation Machine]] and + [[http://scholar.google.com][Google Scholar]]. -- GitLab