¿Cuáles son algunas de las malas prácticas que suelen hacer los desarrolladores de Javascript?

Gracias por el A2A. Personalmente, me gustaría relatar algunos de los errores que he cometido en el pasado (y creo que aprendí de ellos).

  • Uso excesivo de cierres. Los cierres son un concepto poderoso. Le permiten realizar un seguimiento de los datos sin contaminar su alcance global. Sin embargo, en mis primeros días de javascript, acabo de convertir mi cierre en un nuevo alcance global. También entraría en el hábito de nunca pasar variables a funciones, simplemente las anidaría dentro de mis funciones existentes para que usaran las variables existentes. Esto obviamente es muy malo. Cuando tiene una sola función que tiene 30,000 líneas de largo, el código huele. Si bien nunca he tenido uno tan malo, tengo un compañero de trabajo que sí, y pasé 2 meses desglosándome quirúrgicamente.
  • Demasiados globales. Por supuesto, no podemos hablar de cierres que ayuden con la contaminación global sin hablar de por qué eso es malo. Los primeros JavaScript no le daban muchas herramientas para administrar su espacio de nombres global, por lo que los desarrolladores novatos (incluso los bien educados) tenderían a rellenar todas sus variables en el ámbito global. Esto condujo a algunos comportamientos interesantes en momentos en que sacamos alguna biblioteca que tenía nombres globales similares.
  • Funciones largas y locas . Fuera del problema de cierre anterior, solía tratar de agrupar toda la lógica de algo en una función, no importaba cuánta lógica hubiera. Aprendí por las malas que las funciones más pequeñas son mejores. Prueban mejor y son más fáciles de depurar en fragmentos más pequeños. Cuando tiene una función de más de 50 líneas, es MUY largo. Por lo general, apunto ahora a alrededor de 25 líneas sin incluir comentarios (que si se hacen correctamente podrían duplicar eso a 50 o más).
  • No hay suficientes comentarios. Hablando de comentarios, sé juicioso. Si tuvo que pensar para escribir ese código, coméntelo. Claro, tengo funciones sin comentarios. No necesitan comentarios. Realmente se auto documentan. Estas son funciones que hacen cosas como instanciar los diversos campos de un objeto, o copiar cosas de un objeto a otro. Eso es solo un código de tipo repetitivo que es muy legible para casi cualquier persona sin comentarios. Casi todo lo demás que escribo ahora tiene comentarios (¡es absolutamente necesario!) A veces he pasado más tiempo escribiendo comentarios que código, pero quería asegurarme de que mi código fuera legible.
  • Demasiados comentarios Hablando de eso, es posible tener tantos comentarios que el código se vuelve menos legible. Una vez escribí tantos comentarios en una función que cuando volví a ello más tarde, tuve que eliminar 3 líneas para cada línea que todavía estaba en la función solo para LEER realmente la función. Un problema raro para estar seguro, pero lo he tenido.
  • Falta de uso del prototipo. Muchos desarrolladores de JavaScript simplemente no pueden comprender qué es la herencia de prototipos. Creo que ES2015 hará mucho para frenar eso, ya que oculta la herencia prototípica bajo la apariencia de palabras clave más conocidas de “clase” y “extensión”. La realidad en ese punto es que no necesitas REALMENTE entenderlo, aunque es una abstracción permeable.
  • Dependencia excesiva de la comparación estricta o laxa. En pocas palabras, ==! == ===. Doble igual (o comparación suelta) es muy útil cuando se trata de la entrada del usuario que siempre viene como una cadena. También es útil cuando se trata de respuestas de API que, en la mayoría de los casos, no están en el tipo que está utilizando. No se debe confiar en ellos universalmente, pero tienen su lugar. Del mismo modo, triple igual (o comparación estricta) es más “seguro de tipo” y se asegurará de que esté utilizando entradas completamente válidas. Tenga en cuenta que hacer cosas como un <5 no es una comparación estricta, y a se convertirá en un número si puede ser (falso no obliga a 0, así que no se preocupe). El uso de triple igual sin motivo para preocuparse por la rigidez puede causar fallas cuando la coerción de tipo fue suficiente para que su lógica funcione. El uso de doble igual cuando no tiene al menos un lado "desinfectado" puede hacer que su lógica "tenga éxito" cuando debería haber fallado. Conozca su situación y elija en consecuencia. Esto fue difícil para mí cuando comencé con doble igual en todas partes, me quemé, cambié a triple igual en todas partes, y ahora he encontrado un equilibrio.
  • Nuevo brillante. Es realmente fácil quedar atrapado en la última herramienta divertida. Sé que tengo Recuerdo cuando salió jQuery y no pude dejar de mirar con la boca ligeramente abierta. Entonces apareció KnockoutJS e hice lo mismo. Entonces angular. Luego meteorito. Entonces reacciona. Entonces GraphQL. Etc. Es importante mantenerse “actualizado”, pero también es importante elegir porque hay un nuevo brillo cada 5 minutos. Si te sumerges en el bombo, te perderás el resto.

Estoy seguro de que hay muchas más cosas que he sucumbido a lo largo de los años, y que no. Quién sabe, probablemente encontraré más pronto. Diré que cada uno de los que he enumerado aquí lo he visto en mí mismo en el pasado, así como en la actualidad en compañeros de trabajo o personas que he ayudado a entrevistar.

Aquí hay algunos, muchos de los cuales he sido parte anteriormente.

Console.love ()

Los desarrolladores a menudo están expuestos a console.log() relativamente temprano en sus días y, como una sirena, pocos pueden resistirse a su canción una vez que la han escuchado. Eventualmente, hay declaraciones de registro en todo su código para todo, desde probar los resultados de la función hasta decirle que se ha revisado cierta parte de su código. Y luego … lo hacen en producción.

Esto se puede evitar fácilmente aprendiendo a recorrer el código. Si tiene sentencias de registro, téngalas por razones y aprenda a usar console.warn() y console.error() lugar de console.log () cuando necesite informar que algo está sucediendo.

Pero … pero … ¡rendimiento!

JavaScript es rápido Muy rapido. Pero algunas personas no reconocen este hecho o realmente quieren empujar los límites de la velocidad. Estas son las personas cuyos patrones de diseño están orientados a la velocidad en lugar de la legibilidad. Es especialmente común en los desarrolladores más jóvenes que parecen pensar que la “optimización” es un objetivo más que un proceso.

La mayoría de las personas crecen a partir de esto al mismo tiempo que se preguntan seriamente si es mejor usar un simple if / else o un ternario; eventualmente, tiene más sentido terminar su proyecto que hacer todo lo posible. de rendimiento de la aplicación interna de su empresa como si fuera un motor de juego.

Fanatismo desenfrenado

Si bien esto está presente en prácticamente todos los lenguajes de programación, es especialmente notable en los desarrolladores de JavaScript de hoy. Odio decirte esto, pero JavaScript no es el final de todos los lenguajes de programación. ES6 no resolverá el hambre en el mundo y React no va a curar el cáncer.

Al igual que muchos otros idiomas, JavaScript tiene sus partes buenas y malas: depende de usted aprender la distinción y aplicarla en consecuencia. Al igual que cualquier otro idioma. Dedique menos tiempo a hablar sobre por qué JavaScript es la “carrera maestra” de los lenguajes de programación y más tiempo a desarrollar las aplicaciones que alentarán a otros a aprobar su uso y alentar su evolución.

He visto muchos códigos curiosos (que rayan en lo horrible) en mi vida; y yo diría que aproximadamente la mitad fue escrita por mí. Si no atestiguas el hecho de que alguna vez escribiste código basura, entonces eres un mentiroso o quizás, ¡tienes poderes omnipotentes!

Aquí hay una colección relativamente pequeña de lo que veo como malas prácticas de JavaScript; en otras palabras, ¡una lista de cómo escribir JavaScript realmente muy feo que se romperá! Sé que es un ángulo bastante negativo, pero es más fácil que escribir una publicación sobre las mejores prácticas, ¡además me da la oportunidad de desahogarme! Muchas de estas son cosas que he hecho en el pasado; Desde entonces descubrí los errores en mis formas.

Identificadores no constructores que comienzan con una letra mayúscula

Los nombres de las variables solo deben comenzar con mayúscula si apuntan a funciones de constructor. Doug Crockford tiene más:

Existe la convención de que todas las funciones de constructor se nombran con una mayúscula inicial, y que nada más se deletrea con una mayúscula inicial. Esto nos da una oración para que la inspección visual pueda encontrar una new falta.

¡No seguir las convenciones solo te meterá en problemas! Entonces, para ser claros, todo esto está mal:

Solo las funciones que son constructores deben identificarse con una letra inicial de captura, no las funciones regulares. P.ej

No usar la instrucción var para definir variables

No usar la instrucción var cuando se definen variables por primera vez es una muy mala idea. Estas variables pasarán a formar parte del alcance global. Esto apesta porque no recibirás ninguna advertencia. No solo es una mala práctica, sino que puede tener un efecto negativo en el rendimiento, después de todo, cuanto más lejos esté un alcance, más tardará en acceder. Entonces, siempre use la declaración var :

Prefijar cada nueva variable en un ámbito dado con var

No tiene sentido tener varias declaraciones var si solo necesita una:

Usar operadores de comparación no estrictos y luego comparar entre diferentes tipos

Hay dos clases de operadores de comparación; los que == ( == / != ) cuando es necesario y los que no ( === / !== ). ¡Nunca querrás usar el primero!

¿Ver? ¡Obviamente es una mala idea! Utilice solo operadores de comparación de igualdad estricta; comprobarán que los dos operandos son idénticos , no solo “iguales”:

No “almacenar en caché” objetos complejos que no varían

Esto es de vital importancia; Si va a utilizar repetidamente un objeto, debe nombrarlo y guardarlo. Un ejemplo básico:

configObj se crea cada vez que se ejecuta la función. No cambia en cada llamada, por lo que no tiene sentido incluirlo en el cuerpo de la función. Aquí hay una mejor alternativa:

Aquí estamos almacenando configObj en un ámbito “privado” al que solo pueden acceder los ámbitos “secundarios”. ¡Solo se está creando una vez, por lo que instantáneamente hemos reducido notablemente milisegundos del tiempo de ejecución!

Uso excesivo de bibliotecas. Es un mal habito. Noté que muchas personas eligen simplemente usar bibliotecas antes de investigar si se podría obtener la misma funcionalidad simplemente usando JavaScript puro de una manera mucho más eficiente. Especialmente jQuery mantiene a las personas aprendiendo JS, HTML5 y CCS3, ya que muchas de las funcionalidades necesarias ya están presentes en las API proporcionadas por ellos. Considero que esta es la peor práctica por el hecho de que uno se desarrolle en el negocio web.

Yo diría orden.
Con JavaScript como “moderno” y “genial”, muchas personas sin experiencia están escribiendo código que realmente no sigue los estándares, no emplea adecuadamente los espacios en blanco y todos esos pequeños toques que esperaría de un desarrollador experimentado.

A menudo puede ejecutar un embellecedor de código y obtener un resultado lo suficientemente bueno, pero en la actualidad muchos proyectos en JavaScript me recuerdan a PHP de hace unos años, donde la mayoría de los miembros de la comunidad estaban trabajando en una biblioteca personalizada escrita con estándares de codificación inconsistentes y mal documentado.

Esto no es cierto, por supuesto, para todo el mundo de JavaScript, pero a veces incluso en la página de inicio de una herramienta encuentro código escrito con estilos inconsistentes, y yo mismo soy alguien que valora MUCHO código limpio, ordenado y legible, esos pequeños errores realmente se mantienen fuera de mi

Alguien en Stack Overflow hizo esta pregunta, específicamente sobre los desarrolladores de jQuery, y todas las respuestas merecen la pena:

http://stackoverflow.com/questio