C贸mo hacer que el c贸digo sea legible

C贸mo hacer que el c贸digo sea legible


En alg煤n momento, todos escribimos (y algunos escriben) c贸digo incorrecto, y espero que todos trabajemos para mejorar nuestras habilidades, y no solo leer art铆culos como este.


驴Por qu茅 necesitamos escribir un buen c贸digo, no solo c贸digo productivo?


Si bien el rendimiento de su producto o sitio es importante, tambi茅n lo es la apariencia de su c贸digo. La raz贸n de esto es que no solo la m谩quina est谩 leyendo su c贸digo .


En primer lugar, tarde o temprano tendr谩s que volver a leer tu propio c贸digo, y cuando llegue ese momento, solo un c贸digo bien escrito te ayudar谩 a comprender lo que escribiste o descubrir c贸mo solucionarlo.


En segundo lugar, si trabaja en un equipo o colabora con otros desarrolladores, todos los miembros del equipo leer谩n su c贸digo e intentar谩n interpretarlo tal como lo entienden. Para que sea m谩s f谩cil para ellos, es importante seguir ciertas reglas al nombrar variables y funciones, limitar la longitud de cada l铆nea y preservar la estructura de su c贸digo.


Finalmente, veamos un ejemplo espec铆fico.


Parte 1: 驴C贸mo identificar un c贸digo incorrecto?


La forma m谩s f谩cil de identificar un c贸digo incorrecto, en mi opini贸n, es intentar leer el c贸digo como si fuera una oraci贸n o frase .


Por ejemplo, eche un vistazo a este c贸digo:


Captura de pantalla de una mala versi贸n de traverseUpUntil


Captura de pantalla de una mala versi贸n de traverseUpUntil


La funci贸n presentada anteriormente acepta un elemento y una funci贸n condicional y devuelve el nodo primario m谩s cercano que satisface la funci贸n condicional.


const traverseUpUntil = (el, f) => { 

Basado en el hecho de que el c贸digo debe leerse como texto sin formato, la primera l铆nea tiene tres defectos graves.


  • Los par谩metros de la funci贸n no se leen como palabras .
  • Suponga que se puede entender el, ya que dicho nombre se usa generalmente para denotar un elemento, pero el nombre del par谩metro f no explica nada en absoluto.
  • El nombre de la funci贸n se puede leer as铆: "cambiar hasta que el pase f", que probablemente sea mejor leer como "cambiar hasta que f pase para el". Por supuesto, la mejor manera de hacer esto es permitir que la funci贸n se llame como el.traverseUpUntil(f) , pero este es otro problema.

 let p = el.parentNode 

Esta es la segunda l铆nea. De nuevo el problema con los nombres, esta vez con la variable. Si alguien mirara el c贸digo, probablemente entender铆a qu茅 p . Este es el parentNode par谩metro el. Sin embargo, lo que sucede cuando observamos p usado en otros lugares, ya no tenemos un contexto que explique de qu茅 se trata .


 while (p.parentNode && !f(p)) { 

En la siguiente l铆nea, el principal problema que enfrentamos es la falta de comprensi贸n de lo que !f(p) significa o hace, porque "f" puede significar cualquier cosa . Se supone que la persona que lee el c贸digo debe comprender que !f(p) es una comprobaci贸n del nodo actual para satisfacer una determinada condici贸n. Si pasa, entonces el ciclo se interrumpe.


 p = p.parentNode 

Todo est谩 claro aqu铆.


 return p 

No es del todo obvio lo que se devuelve debido a un nombre de variable no v谩lido.


Parte 2: refactoricemos


Captura de pantalla de una buena versi贸n de traverseUpUntil


Captura de pantalla de una buena versi贸n de traverseUpUntil


Primero, cambiamos los nombres de los par谩metros y su orden: (el, f) => a (condition, node) => .
Quiz谩s se pregunte por qu茅 en lugar de "elemento (elemento ruso) us茅" nodo "( nodo ruso). Lo us茅 por las siguientes razones:


  • Escribimos c贸digo en t茅rminos de nodos, por ejemplo .parentNode , entonces, 驴por qu茅 no hacerlo coherente?
  • "Nodo" es m谩s corto que "elemento", y el significado no se pierde .

Luego pasamos a los nombres de las variables:


 let parent = node 

Es muy importante revelar completamente el valor de su variable en su nombre , por lo que "p" ahora es "padre" ( padre ruso). Tambi茅n puede haber notado que ahora no comenzamos obteniendo el node.parentNode , sino que solo obtenemos el nodo.


Vamos m谩s all谩:


 do { parent = parent.parentNode } while (parent.parentNode && !condition(parent)) 

En lugar del while habitual while eleg铆 el do ... while . Esto significa que necesitamos obtener el nodo padre cada vez antes de verificar las condiciones, y no al rev茅s. Usar el do ... while tambi茅n ayuda a leer c贸digo como texto sin formato.


Intentemos leer: "Asigne el nodo padre del padre al padre, siempre que el padre tenga un nodo padre y la funci贸n de condici贸n no devuelva verdadero" . Ya mucho m谩s claro.


 return parent 

A menudo, los desarrolladores prefieren usar alg煤n tipo de variable com煤n ret (o returnValue ), pero esta es una pr谩ctica bastante mala . Si nombra sus variables de retorno correctamente, se hace obvio lo que se devuelve. Sin embargo, a veces las funciones pueden ser largas y complejas, lo que genera mucha confusi贸n. En este caso, sugerir铆a dividir su funci贸n en varias funciones , y si a煤n es demasiado complicado, tal vez agregar comentarios pueda ayudar.


Parte 3: simplificaci贸n del c贸digo


Ahora que ha hecho que el c贸digo sea legible, es hora de eliminar el c贸digo innecesario . Estoy seguro de que algunos de ustedes ya han notado que no necesitamos la variable parent en absoluto.


 const traverseUpUntil = (condition, node) => { do { node = node.parentNode } while (node.parentNode && !condition(node)) return node } 

Simplemente elimin茅 la primera l铆nea y reemplac茅 "padre" por "nodo". As铆 que me salt茅 el paso innecesario de crear un "padre" y fui directamente al ciclo.


驴Pero qu茅 pasa con el nombre de la variable?


Aunque "nodo" no es la mejor descripci贸n para esta variable, es satisfactoria. Pero no nos quedemos ah铆, cambiemos el nombre. 驴Qu茅 pasa con "currentNode"?


 const traverseUpUntil = (condition, currentNode) => { do { currentNode = currentNode.parentNode } while (currentNode.parentNode && !condition(currentNode)) return currentNode } 

Eso esta mejor! Ahora, cuando leemos el m茅todo, sabemos que currentNode siempre representa el nodo en el que estamos ahora, en lugar de ser un nodo "de alg煤n tipo".

Source: https://habr.com/ru/post/es421867/


All Articles