commit 23923fe9745c346c2d70ba8305b2875dbaaca7c3 Author: Ryan McDermott Date: Fri Nov 11 18:23:24 2016 -0800 First commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0575c8e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Ryan McDermott + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE diff --git a/README.md b/README.md new file mode 100644 index 0000000..33aa78f --- /dev/null +++ b/README.md @@ -0,0 +1,124 @@ +# clean-code-javascript +Software engineering principles, from Robert C. Martin's wonderful book *Clean Code*, adapted for JavaScript. + +## **Variables** +### Use meaningful and pronounceable variable names + +**Bad:** +```javascript +var yyyymmdstr = moment().format('YYYY/MM/DD'); +``` + +**Good**: +```javascript +var yearMonthDay = moment().format('YYYY/MM/DD'); +``` + +### Use the same vocabulary for the same type of variable + +**Bad:** +```javascript +getUserInfo(); +getClientData(); +getCustomerRecord(); +``` + +**Good**: +```javascript +getUser(); +``` + +## **Functions** +### Limit the amount of function parameters (2 or less) +Use an object if you are finding yourself needing a lot of parameters + +**Bad:** +```javascript +function createMenu(title, body, buttonText, cancellable) { + ... +} +``` + +**Good**: +```javascript +var menuConfig = { + title: 'Foo', + body: 'Bar', + buttonText: 'Baz' + cancellable: true +} + +function createMenu(config) { + ... +} + +``` + +### Don't use flags as function parameters +Flags tell your user that this function does more than one thing. Functions should do one thing. Split out your functions if they are following different code paths based on a boolean. + +**Bad:** +```javascript +function createFile(name, temp) { + if (temp) { + fs.create('./temp/' + name); + } else { + fs.create(name); + } +} + +``` + +**Good**: +```javascript +function createTempFile(name) { + fs.create('./temp/' + name); +} + +function createFile(name) { + fs.create(name); +} +``` + +## **Comments** +### Only comment things that have business logic complexity. +Comments are an apology, not a requirement. Good code *mostly* documents itself. + +**Bad:** +```javascript +function hashIt(data) { + // The hash + var hash = 0; + + // Length of string + var length = data.length; + + // Loop through every character in data + for (var i = 0; i < length; i++) { + // Get character code. + var char = i.charCodeAt(i); + // Make the hash + hash = ((hash << 5) - hash) + char; + // Convert to 32-bit integer + hash = hash & hash; + } +} +``` + +**Good**: +```javascript + +function hashIt(data) { + var hash = 0; + var length = data.length; + + for (var i = 0; i < length; i++) { + var char = i.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + + // Convert to 32-bit integer + hash = hash & hash; + } +} + +```