Updated code standards

This commit is contained in:
Andrew Henry 2020-05-16 15:56:30 -07:00 committed by GitHub
parent bbb271a678
commit 32c892fe98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -122,43 +122,93 @@ changes.
### Code Standards ### Code Standards
JavaScript sources in Open MCT must satisfy JSLint under its default JavaScript sources in Open MCT must satisfy the ESLint rules defined in
settings. This is verified by the command line build. this repository. This is verified by the command line build.
#### Code Guidelines #### Code Guidelines
JavaScript sources in Open MCT should: JavaScript sources in Open MCT should:
* Use four spaces for indentation. Tabs should not be used. 1. Write clean code. Heres a good summary - https://github.com/ryanmcdermott/clean-code-javascript.
* Include JSDoc for any exposed API (e.g. public methods, constructors). 1. Include JSDoc for any exposed API (e.g. public methods, constructors).
* Include non-JSDoc comments as-needed for explaining private variables, 1. Include non-JSDoc comments as-needed for explaining private variables,
methods, or algorithms when they are non-obvious. methods, or algorithms when they are non-obvious. Otherwise code
* Define one public class per script, expressed as a constructor function should be self-documenting.
returned from an AMD-style module. 1. Classes and Vue components should use camel case, first letter capitalized
* Follow “Java-like” naming conventions. These includes: (e.g. SomeClassName).
* Classes should use camel case, first letter capitalized 1. Methods, variables, fields, events, and function names should use camelCase,
(e.g. SomeClassName). first letter lower-case (e.g. someVariableName).
* Methods, variables, fields, and function names should use camel case, 1. Source files that export functions should use camelCase, first letter lower-case (eg. testTools.js)
first letter lower-case (e.g. someVariableName). 1. Constants (variables or fields which are meant to be declared and
* Constants (variables or fields which are meant to be declared and initialized statically, and never changed) should use only capital
initialized statically, and never changed) should use only capital letters, with underscores between words (e.g. SOME_CONSTANT). They should always be declared as `CONST`s
letters, with underscores between words (e.g. SOME_CONSTANT). 1. File names should be the name of the exported class, plus a .js extension
* File names should be the name of the exported class, plus a .js extension (e.g. SomeClassName.js).
(e.g. SomeClassName.js). 1. Avoid anonymous functions, except when functions are short (a few lines)
* Avoid anonymous functions, except when functions are short (a few lines) and/or their inclusion makes sense within the flow of the code
and/or their inclusion makes sense within the flow of the code (e.g. as arguments to a forEach call).
(e.g. as arguments to a forEach call). 1. Named functions are preferred over functions assigned to variables.
* Avoid deep nesting (especially of functions), except where necessary eg.
(e.g. due to closure scope). ```JavaScript
* End with a single new-line character. function renameObject(object, newName) {
* Expose public methods by declaring them on the class's prototype. Object.name = newName;
* Within a given function's scope, do not mix declarations and imperative }
code, and present these in the following order: ```
* First, variable declarations and initialization. is preferable to
* Second, function declarations. ```JavaScript
* Third, imperative statements. const rename = (object, newName) => {
* Finally, the returned value. Object.name = newName;
}
```
1. Avoid deep nesting (especially of functions), except where necessary
(e.g. due to closure scope).
1. End with a single new-line character.
1. Always use ES6 `Class`es and inheritence rather than the pre-ES6 prototypal
pattern.
1. Within a given function's scope, do not mix declarations and imperative
code, and present these in the following order:
* First, variable declarations and initialization.
* Secondly, imperative statements.
* Finally, the returned value.
1. Avoid the use of "magic" values.
eg.
```JavaScript
Const UNAUTHORIZED = 401
if (responseCode === UNAUTHORIZED)
```
is preferable to
```JavaScript
if (responseCode === 401)
```
1. Dont use the ternary operator. Yes it's terse, but there's probably a clearer way of writing it.
1. Test specs should reside alongside the source code they test, not in a separate directory.
1. Organize code by feature, not by type.
eg.
```
- telemetryTable
- row
TableRow.js
TableRowCollection.js
TableRow.vue
- column
TableColumn.js
TableColumn.vue
plugin.js
pluginSpec.js
```
is preferable to
```
- telemetryTable
- components
TableRow.vue
TableColumn.vue
- collections
TableRowCollection.js
TableColumn.js
TableRow.js
plugin.js
pluginSpec.js
```
Deviations from Open MCT code style guidelines require two-party agreement, Deviations from Open MCT code style guidelines require two-party agreement,
typically from the author of the change and its reviewer. typically from the author of the change and its reviewer.