Blog-Risingstack-Com - Translate.goog-Prácticas Recomendadas de Codificación Limpia de JavaScript
Blog-Risingstack-Com - Translate.goog-Prácticas Recomendadas de Codificación Limpia de JavaScript
JavaScript
blog-risingstack-com.translate.goog/javascript-clean-coding-best-practices-node-js-at-scale
Ingeniería RisingStack
Escribir código limpio es lo que debes saber y hacer para poder llamarte un
desarrollador profesional. No hay excusa razonable para hacer algo menos que lo
mejor posible.
“Incluso el código incorrecto puede funcionar. Pero si el código no está limpio, puede poner
de rodillas a una organización de desarrollo”. — Robert C. Martin (tío Bob)
Node.js at Scale es una colección de artículos que se centran en las necesidades de las
empresas con instalaciones más grandes de Node.js y desarrolladores avanzados de Node.
Capítulos:
Usted sabe que está trabajando en un código limpio cuando cada rutina que lee resulta ser
más o menos lo que esperaba.
1/9
Ahora que sabemos a qué debe apuntar todo desarrollador, ¡repasemos las mejores
prácticas!
Si sigue esta práctica, sus nombres se pueden buscar, lo que ayuda mucho
cuando hace refactorizaciones o simplemente está buscando algo.
// DON'T
let d
let elapsed
const ages = arr.map((i) => i.age)
// DO
let daysSinceModification
const agesOfUsers = users.map((user) => user.age)
2/9
// DON'T
let nameString
let theUsers
// DO
let name
let users
Haga que los nombres de sus variables sean fáciles de pronunciar, porque
para la mente humana requiere menos esfuerzo procesarlos.
Cuando realiza revisiones de código con sus compañeros desarrolladores, es más fácil
hacer referencia a estos nombres.
// DON'T
let fName, lName
let cntr
// DO
let firstName, lastName
let counter
Las funciones deben hacer una cosa. Deberían hacerlo bien. Deberían hacerlo solo. —
Robert C. Martin (tío Bob)
3/9
// DON'T
function getUserRouteHandler (req, res) {
const { userId } = req.params
// inline SQL query
knex('user')
.where({ id: userId })
.first()
.then((user) => res.json(user))
}
// DO
// User model (eg. models/user.js)
const tableName = 'user'
const User = {
getOne (userId) {
return knex(tableName)
.where({ id: userId })
.first()
}
}
Después de escribir sus funciones correctamente, puede probar qué tan bien lo hizo con
el perfilado de la CPU , lo que lo ayuda a encontrar cuellos de botella.
El nombre de una función debe ser un verbo o una frase verbal y debe comunicar
su intención, así como el orden y la intención de los argumentos.
// DON'T
/** * Invite a new user with its email address * @param {String} user email
address */
function inv (user) { /* implementation */ }
// DO
function inviteUser (emailAddress) { /* implementation */ }
4/9
// DON'T
function getRegisteredUsers (fields, include, fromDate, toDate) { /*
implementation */ }
getRegisteredUsers(['firstName', 'lastName', 'email'], ['invitedUsers'], '2016-09-
26', '2016-12-13')
// DO
function getRegisteredUsers ({ fields, include, fromDate, toDate }) { /*
implementation */ }
getRegisteredUsers({
fields: ['firstName', 'lastName', 'email'],
include: ['invitedUsers'],
fromDate: '2016-09-26',
toDate: '2016-12-13'
})
Utilice funciones puras sin efectos secundarios, siempre que pueda. Son realmente
fáciles de usar y probar.
// DON'T
function addItemToCart (cart, item, quantity = 1) {
const alreadyInCart = cart.get(item.id) || 0
cart.set(item.id, alreadyInCart + quantity)
return cart
}
// DO
// not modifying the original cart
function addItemToCart (cart, item, quantity = 1) {
const cartCopy = new Map(cart)
const alreadyInCart = cartCopy.get(item.id) || 0
cartCopy.set(item.id, alreadyInCart + quantity)
return cartCopy
}
5/9
// DON'T
// "I need the full name for something..."
function getFullName (user) {
return `${user.firstName} ${user.lastName}`
}
// DO
function renderEmailTemplate (user) {
// "I need the full name of the user"
const fullName = getFullName(user)
return `Dear ${fullName}, ...`
}
Consulta o modificación
Las funciones deben hacer algo (modificar) o responder algo (consultar), pero no ambas
cosas.
Cuanto más estrictas sean las reglas, menos esfuerzo se dedicará a señalar el mal formato
en las revisiones de código. Debe cubrir cosas como nombres consistentes, tamaño de
sangría, ubicación de espacios en blanco e incluso punto y coma.
Las promesas están disponibles de forma nativa desde el nodo 4. En lugar de escribir
devoluciones de llamada anidadas, puede tener llamadas de promesa encadenables.
6/9
// AVOID
asyncFunc1((err, result1) => {
asyncFunc2(result1, (err, result2) => {
asyncFunc3(result2, (err, result3) => {
console.lor(result3)
})
})
})
// PREFER
asyncFuncPromise1()
.then(asyncFuncPromise2)
.then(asyncFuncPromise3)
.then((result) => console.log(result))
.catch((err) => console.error(err))
// AVOID
const fs = require('fs')
try {
callback(null, JSON.parse(data))
} catch (ex) {
callback(ex)
}
})
}
// PREFER
const fs = require('fs')
const promisify = require('es6-promisify')
readJSON('./package.json')
.then((pkg) => console.log(pkg))
.catch((err) => console.error(err))
7/9
const request = require('request-promise-native')
// PREFER
async function getExtractFromWikipedia (title) {
let body
try {
body = await request({ /* same parameters as above */ })
} catch (err) {
console.error('getExtractFromWikipedia() error:', err)
throw err
}
// or
const co = require('co')
8/9
¿Cómo debo escribir un código de alto rendimiento?
En primer lugar, debe escribir un código limpio y luego usar la creación de perfiles para
encontrar cuellos de botella en el rendimiento.
Sin embargo, hay algunos escenarios sencillos como inicializar con entusiasmo lo que
pueda (por ejemplo, esquemas joi en controladores de ruta, que se usarían en cada
solicitud y agregarían una sobrecarga importante si se recrean cada vez) y usar código
asíncrono en lugar de código de bloqueo.
9/9