| [.text-center] | 
 | = Project Connected Home over IP Software | 
 |  | 
 | :plusplus: ++ | 
 |  | 
 | == Doxygen Best Practices, Conventions, and Style | 
 |  | 
 | === Comments | 
 |  | 
 | Due to Project CHIP’s infrastructure nature, it will be consumed by | 
 | other teams, both inside and outside Project CHIP. Therefore it is | 
 | critical that how it works, how it behaves, and how it is | 
 | interfaced with are **clearly** documented. | 
 |  | 
 | In support of this effort Project CHIP uses | 
 | http://www.doxygen.org/[Doxygen] to | 
 | markup (or markdown) all C, C{plusplus}, Objective C, Objective C{plusplus}, Perl, | 
 | Python, and Java code to: | 
 |  | 
 | * Detail what the various source and header files are and how they fit | 
 | into the broader context. | 
 | * Detail what the various C{plusplus} / Objective C{plusplus} namespaces are. | 
 | * Detail what the constants, C preprocessor definitions, and | 
 | enumerations are. | 
 | * Detail what the globals are and how they are to be used. | 
 | * Detail what the free function and object / class methods are and how | 
 | they are to be used, what their parameters are, and what their return | 
 | values are. | 
 | * Detail any other important technical information or theory of | 
 | operation unique and relevant to the stack that is not otherwise | 
 | captured in architecture, design, or protocol documentation. | 
 |  | 
 | ==== File | 
 |  | 
 | Every C, C{plusplus}, Objective C, Objective C{plusplus}, Perl, Python, Shell, and Java | 
 | source file should, at minimum, have a standard, boilerplate Project | 
 | CHIP file header that also describes what the file is and how, if | 
 | applicable, it fits into the broader implementation. | 
 |  | 
 | Canonical examples for C, C{plusplus}, Objective C, and Objective C{plusplus} and | 
 | Python, Perl, and shell are shown in Listing 1 and Listing 2 below. | 
 |  | 
 | [source,C] | 
 | ---- | 
 | /* | 
 |  *    Copyright (c) <Create year>[-<Last modified year>] Project CHIP Authors. | 
 |  * | 
 |  *    Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  *    you may not use this file except in compliance with the License. | 
 |  *    You may obtain a copy of the License at | 
 |  * | 
 |  *        http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  *    Unless required by applicable law or agreed to in writing, software | 
 |  *    distributed under the License is distributed on an "AS IS" BASIS, | 
 |  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  *    See the License for the specific language governing permissions and | 
 |  *    limitations under the License.  | 
 |  */ | 
 |  | 
 | /** | 
 |  *    @file | 
 |  *        <Brief description> | 
 |  * | 
 |  *      [<Detailed description>] | 
 |  */ | 
 | ---- | 
 | [.text-center] | 
 | *Listing 1.* Standard, boilerplate Project CHIP file header for C, C{plusplus}, | 
 | Objective C, and Objective C{plusplus}.. | 
 |  | 
 | [source,perl] | 
 | ---- | 
 | # | 
 | #    Copyright (c) <Create year>[-<Last modified year>] Project CHIP Authors. | 
 | # | 
 | #    Licensed under the Apache License, Version 2.0 (the "License"); | 
 | #    you may not use this file except in compliance with the License. | 
 | #    You may obtain a copy of the License at | 
 | # | 
 | #        http://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | #    Unless required by applicable law or agreed to in writing, software | 
 | #    distributed under the License is distributed on an "AS IS" BASIS, | 
 | #    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | #    See the License for the specific language governing permissions and | 
 | #    limitations under the License. | 
 | # | 
 |  | 
 | ## | 
 | #    @file | 
 | #        <Brief description> | 
 | # | 
 | #      [<Detailed description>] | 
 | # | 
 | ---- | 
 | [.text-center] | 
 | *Listing 2.* Standard, boilerplate Project CHIP file header for Perl, | 
 | Python, shell, and make. | 
 |  | 
 | where: | 
 |  | 
 | * _<Create year>_ is the year the file was created. | 
 | * _<Last modified year>_ is, optionally, the year the file was last | 
 | modified if it is different from _<Create year>_. | 
 | * _<Brief description>_ is a succinct description of what the file is. | 
 | * _<Detailed description>_ is, optionally, a more in-depth description of | 
 | what the file is and how it fits into the broader context. | 
 |  | 
 | For header files, a good prologue for _<Brief description>_ is "This file | 
 | defines...", describing what is being defined or declared. Likewise, for | 
 | source files, a good prologue for _<Brief description>_ is "This file | 
 | implements...", describing what is being implemented. Usually, | 
 | copy-and-pasting the brief description from the header to the source and | 
 | changing the prologue from "defines" to "implements" is sufficient. | 
 |  | 
 | The _<Detailed description>_, if present, could be a link to one or more | 
 | of the architecture, design, or protocol specifications or some more in | 
 | depth but still succinct information about where the file and what it | 
 | defines or implements fit into the broader design or implementation. | 
 |  | 
 | ===== Motivation and Rationale | 
 |  | 
 | The motivation and rationale for this is not from a legal perspective | 
 | and as a consequence is not in opposition to guidance from legal. | 
 | However, when Project CHIP provides a substantial amount of code as | 
 | reference code and as an SDK to third-parties and other work group member | 
 | companies, this makes it very clear—and consistently so—what code belongs | 
 | to and is authored by Project CHIP and what is not. | 
 |  | 
 | ==== Functions and Methods | 
 |  | 
 | Every non-trival or non-default public, and ideally private, free function | 
 | and class method should likewise have a prologue comment that: | 
 |  | 
 | * Briefly describes what it is and what it does. | 
 | * Describes in detail, optionally, what it is and what it does. | 
 | * Describes the purpose, function, and influence of each parameter as | 
 | well as whether it is an input, an output, or both. | 
 | * Describes the return value or values, if present, and the expected range or | 
 | constraints of it. | 
 |  | 
 | The goal of function and method comments are to not simply echo back to the | 
 | reader what is in the API signature but to provide value-added insight. Also, | 
 | remember that what may be intuitive and self-evident to you as a domain expert | 
 | today may not be to your future self or others who are uninitiated in the domain. | 
 | The project's success will be measured by the ease, speed, and breadth of its adoption. | 
 | Your comments, alongside examples, will contribute toward this goal. When in doubt, | 
 | err on the side of being generous with your comments rather than parsimonious. | 
 |  | 
 | An example is shown in Listing 3 below for C, C{plusplus}, Objective C, and | 
 | Objective C{plusplus}. Adapt as appropriate for Perl, Python and Shell. | 
 |  | 
 | [source,C] | 
 | ---- | 
 | /** | 
 |  * Parse and attempt to convert a string to a 64-bit unsigned integer, | 
 |  * applying the appropriate interpretation based on the base parameter. | 
 |  * | 
 |  * @param[in]  str     A pointer to a NULL-terminated C string representing | 
 |  *                     the integer to parse. | 
 |  * @param[out] output  A reference to storage for a 64-bit unsigned integer | 
 |  *                     to which the parsed value will be stored on success. | 
 |  * @param[in]  base    The base according to which the string should be | 
 |  *                     interpreted and parsed. If 0 or 16, the string may | 
 |  *                     be hexadecimal and prefixed with "0x". Otherwise, a 0 | 
 |  *                     is implied as 10 unless a leading 0 is encountered in | 
 |  *                     which case 8 is implied. | 
 |  * | 
 |  * @retval  0 on success. | 
 |  * @retval  #EINVAL if the given base contains an unsupported value or if no | 
 |  *          conversion was performed. | 
 |  * @retval  #ERANGE if the resulting value was out of range. | 
 |  */ | 
 | ---- | 
 | [.text-center] | 
 | *Listing 3.* Standard Doxygen-compatible free function or method comment | 
 | for C, C{plusplus}, Objective C, and Objective C{plusplus}. | 
 |  | 
 | In addition, developers should well document the bodies of their | 
 | functions and methods, describing the overall flow, design intent, error | 
 | handling nuances, historical bugs encountered and resolved, and so | 
 | forth. While these types of comments do not typically become part of the | 
 | external documentation, they are invaluable to future maintainers of the | 
 | code. | 
 |  | 
 | ==== Other | 
 |  | 
 | ===== Dos | 
 |  | 
 | * *Do* use the '@' Doxygen markup style rather than the '\' markup style. | 
 | * *Do* also consider consulting tips on | 
 | http://centerforplainlanguage.org/5-steps-to-plain-language/[Plain | 
 | Language] for additional style and tone input. | 
 | * *Do* use consistent terminology and lingo. | 
 | * *Do* properly paragraph justify and wrap your documentation. | 
 |  | 
 | ** See your editor's documentation on how to do this (for example, M-q in Emacs). | 
 |  | 
 | ===== Don'ts | 
 |  | 
 | * *Do not* forget to document your files, enumerations, constants, | 
 | classes, objects, namespaces, functions, and methods. | 
 | * *Do not* include the file name in any Doxygen file comments or | 
 | directives. | 
 |  | 
 | ** Your editor knows the [.underline]#file name#, source code control knows the file | 
 | name, and you know the file name. | 
 | ** When it changes on the file system, having to change it in the file | 
 | comments is simply an added burden. | 
 |  | 
 | * *Do not* include [.underline]#your name# in any Doxygen comments or directives. | 
 |  | 
 | ** Source code control knows who you are and what file revisions you own. | 
 | ** We do not want Project CHIP consumers knowing who you are and calling | 
 | or e-mailing you directly for support. | 
 |  | 
 | * *Do not* include the [.underline]#modification date# the file was last changed in | 
 | Doxygen comments or directives, [.underline]#except for the copyright header#. | 
 |  | 
 | ** Source code control knows when the file was last changed and the date | 
 | other revisions were made. | 
 |  | 
 | * *Do not* include subjective or opinionated commentary or expose | 
 | proprietary and confidential information not relevant to the code or | 
 | APIs. | 
 |  | 
 | ** This content *will be* published to and for consumption by members, the | 
 | CHIP community, and the general public. | 
 |  | 
 | == Revision History | 
 |  | 
 | [cols="^1,^1,<2,<3",options="header"] | 
 | |=== | 
 | |Revision |Date |Modified By |Description | 
 | |1 |2020-06-11 |Grant Erickson |Initial revision. | 
 | |=== | 
 |  | 
 | [.text-center] | 
 | _Project Connect Home over IP Public Information_ |