Recientemente he invertido un par de horas en JavaScript porque quería beneficiarme de la enorme base de usuarios. Al hacerlo, noté un patrón que la mayoría de las personas atribuyen a los lenguajes dinámicos. Hace que las cosas funcionen realmente rápido, pero una vez que su código alcanza un cierto tamaño, pierde mucho tiempo con errores de tipografía, ortografía y refactorización en general. Errores que un compilador normalmente me evitaría. Y no tengo que buscar errores en la lógica cuando acabo de hacer un error tipográfico en otro módulo.
Teniendo en cuenta los increíbles siguientes JavaScript y otros lenguajes escritos dinámicamente, creo que hay algo mal con mi enfoque. ¿O es solo el precio que tiene que pagar?
Para decirlo de manera más concisa:
- ¿Cómo aborda un proyecto de JavaScript (o cualquier otro lenguaje dinámico para el caso) con ~ 2000 LOC?
- ¿Hay herramientas para evitar que cometa esos errores? He intentado fluir por Facebook y JSHint que de alguna manera ayudan, pero no detectan errores tipográficos.
Respuestas:
Específicamente hablando de JavaScript, podría usar TypeScript en su lugar. Ofrece algunas de las cosas a las que te refieres. Citando el sitio web:
Y es solo un superconjunto de JS, lo que significa que parte de su código existente funcionará bien con TS:
fuente
foo(x) { return x.bar;}
o algo así. Como no hay información de tipo y la función es pública (por lo tanto, no puede conocer a todas las personas que llaman), es imposible que se dé cuenta si se debe cambiar el nombre de la barra a baz si cambia el nombre de alguna clase.Hay algunos enfoques que pueden ayudar:
Examen de la unidad
Escriba pruebas unitarias donde sea posible. Confiar exclusivamente en las pruebas manuales o encontrar errores en la naturaleza es impredecible.
Usar marcos
En lugar de rodar el tuyo y arriesgar la introducción de errores, usa marcos establecidos siempre que sea posible.
Prefiero CSS / lenguajes de alto nivel
Donde puede ceder funcionalidad a CSS o cualquier lenguaje de alto nivel en el que esté escribiendo
Refactor
Refactorizar para reducir la cantidad de código. Menos código = menos lugares para que las cosas salgan mal.
Reutilizar
Reutilice el código existente donde pueda. Incluso si el código no coincide exactamente, puede ser mejor copiar, pegar y modificar en lugar de escribir algo nuevo.
IDEs
Los IDEs modernos generalmente tienen al menos algo de soporte de Javascript. Algunos editores de texto también son compatibles con Javascript.
fuente
Una herramienta que aún no se ha mencionado es la búsqueda de texto simple, local de archivo o de todo el proyecto .
Suena simple, pero cuando incluye algunas expresiones regulares puede hacer un filtrado básico a avanzado, por ejemplo, buscar palabras ubicadas en la documentación o el código fuente.
Ha sido una herramienta efectiva para mí (además de los analizadores estáticos), y dado el tamaño de su proyecto de 2k LOC, que en mi opinión no es particularmente grande, espero que funcione de maravilla.
fuente
grep
va un largo camino. A menos que no hagas cosas dinámicas demasiado raras, funciona. Sin embargo, se siente muy manual si está acostumbrado a IDEs para lenguajes tipados estáticos.Actualmente estoy refactorizando varios miles de líneas de código en un gran proyecto AngularJS. Una de las mayores molestias es averiguar el contrato exacto de una función determinada. A veces terminé leyendo la documentación de la API porque los elementos de la respuesta API sin procesar se asignaron a variables que pasaron por 6 capas de código antes de ser modificadas y devueltas a través de 6 capas más de código.
Mi primer consejo es diseñar por contrato . Tome datos específicos, produzca resultados específicos, evite los efectos secundarios y documente esas expectativas utilizando TypeScript o al menos JSDoc.
Mi segundo consejo es implementar tantas verificaciones como sea posible. Seguimos el estándar AirBnB y usamos eslint en toda nuestra base de código. Los ganchos de compromiso verifican que siempre seguimos el estándar. Naturalmente, tenemos una batería de pruebas de unidad y aceptación, y todas las confirmaciones deben ser revisadas por un compañero.
Cambiar de un editor de texto (Sublime Text) a un IDE adecuado (WebStorm) también facilitó mucho el trabajo con código en general. WebStorm usará JSDoc para dar pistas sobre los tipos de parámetros esperados y generar un error si proporciona el tipo incorrecto o utiliza el valor de retorno de la manera incorrecta.
En JavaScript, las nuevas características, como símbolos y captadores / establecedores, pueden ayudar a imponer un cierto nivel de calidad al agregar aserciones a la asignación de variables (por ejemplo, asegúrese de que el entero esté dentro del rango o que el objeto de datos tenga ciertos atributos).
Desafortunadamente, no creo que haya una verdadera solución para evitar errores de lenguaje dinámico, solo una serie de medidas que pueden ayudar a reducir su frecuencia.
fuente
Mi respuesta a la pregunta "¿Cómo aborda un proyecto de JavaScript (o cualquier otro lenguaje dinámico para el caso) con ~ 2000 LOC?"
Desarrollo aplicaciones de formulario PDF. Me acerco a mi proyecto de desarrollo de software JavaScript (independientemente del tamaño del código fuente) usando los elementos y anotaciones netas de Petri. El método no está vinculado a ninguna tecnología de lenguaje de programación en particular. Por lo tanto, puede usarse para otros "lenguajes de programación".
Creo un diagrama de la lógica de la aplicación. Para mantener el diagrama ordenado, agrego la mayoría de mis anotaciones a un formulario que utilizo con el diagrama. Las entradas en el formulario incluyen referencias a propiedades o funciones. Luego escribo el código fuente basado en la información en el diagrama y las entradas en el formulario. El método es sistemático porque cada código fuente escrito se asigna directamente desde el diagrama y las entradas en el formulario. El código fuente se puede verificar fácilmente porque también sigo las convenciones de nomenclatura y codificación cuando escribo el código.
Por ejemplo, he elegido una convención según la cual todas las funciones son prototipos. Si el rendimiento se convierte en un problema, puede mejorarse declarando las funciones en el constructor. Para algunas propiedades uso matrices. Nuevamente, si el rendimiento se convierte en un problema, se puede mejorar mediante el uso de referencias directas.
También uso eval. Esto puede reducir en gran medida el tamaño del código fuente. Debido a problemas de rendimiento, uso eval al comienzo o parte de la inicialización de mi aplicación; Nunca lo uso en la "lógica de tiempo de ejecución": esta es otra convención de codificación que sigo.
fuente