| [.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 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_ |