stringtranslate.com

Código repetitivo

En programación informática, el código repetitivo , o simplemente código repetitivo , son secciones de código que se repiten en varios lugares con poca o ninguna variación. Cuando se utilizan lenguajes que se consideran verbosos , el programador debe escribir una gran cantidad de código repetitivo para lograr solo una funcionalidad menor. [1]

La necesidad de código repetitivo se puede reducir mediante mecanismos de alto nivel como la metaprogramación (que hace que la computadora escriba automáticamente el código repetitivo necesario o lo inserte en el momento de la compilación ), la convención sobre configuración (que proporciona buenos valores predeterminados, lo que reduce la necesidad de especificar detalles del programa en cada proyecto) y la ingeniería basada en modelos (que utiliza modelos y generadores de modelo a código, lo que elimina la necesidad de código repetitivo manual).

También es posible mover el código repetitivo a una clase abstracta para que pueda ser heredado por cualquier número de clases concretas . Otra opción sería moverlo a una subrutina para que pueda ser llamado en lugar de ser duplicado.

Origen

El término surgió del negocio de los periódicos . Las columnas y otros artículos que distribuían los sindicatos de imprentas se enviaban a los periódicos suscriptores en forma de planchas de impresión preparadas . Debido a su parecido con las planchas de metal utilizadas para hacer calderas , se las conoció como "planchas de calderas" y el texto resultante, "texto de plancha de caldera". Como las historias que se distribuían mediante planchas de calderas eran generalmente " de relleno " en lugar de noticias "serias", el término se convirtió en sinónimo de texto repetido y poco original. [2] [3]

Un término relacionado es código de contabilidad , que se refiere al código que no es parte de la lógica empresarial pero que está intercalado con ella para mantener las estructuras de datos actualizadas o manejar aspectos secundarios del programa.

Preámbulo

Una forma de código repetitivo consiste en declaraciones que, si bien no forman parte de la lógica del programa ni de la sintaxis esencial del lenguaje , se agregan al comienzo de un archivo fuente de manera personalizada. El siguiente ejemplo de Perl demuestra el código repetitivo:

#!/usr/bin/perl usa advertencias ; usa estricto ;  

La primera línea es un shebang , que identifica el archivo como un script de Perl que se puede ejecutar directamente en la línea de comandos en sistemas Unix/Linux. Las otras dos son pragmas que activan las advertencias y el modo estricto, que son obligatorios en el estilo de programación de moda de Perl .

El siguiente ejemplo es un código estándar del lenguaje de programación C/C++ , #includeguard .

#ifndef MIINTERFAZ_H #define MIINTERFAZ_H...#finsi

Esto verifica y configura un indicador global para indicarle al compilador si el archivo myinterface.h ya se ha incluido. Como muchos archivos interdependientes pueden estar involucrados en la compilación de un módulo, esto evita procesar el mismo encabezado varias veces (lo que generaría errores debido a múltiples definiciones con el mismo nombre).

En Java y plataformas similares

En los programas Java , las clases DTO suelen contar con métodos para obtener y configurar variables de instancia. Las definiciones de estos métodos pueden considerarse frecuentemente como código repetitivo. Aunque el código variará de una clase a otra, su estructura es lo suficientemente típica como para que sea mejor generarlo automáticamente que escribirlo a mano. Por ejemplo, en la siguiente clase Java que representa una mascota, casi todo el código es repetitivo, excepto las declaraciones de Pet , name y owner :

Java

clase pública Mascota { cadena privada nombre ; persona privada propietario ;          public Pet ( String nombre , Persona propietario ) { this.name = nombre ; this.owner = propietario ; }             public String getName () { devolver nombre ; }       public void setName ( String nombre ) { this.name = nombre ; }         public Persona getOwner () { return propietario ; }       public void setOwner ( Persona propietario ) { this.propietario = propietario ; } }        

La mayor parte del código repetitivo de este ejemplo existe para cumplir con los requisitos de JavaBeans . Si el nombre y el propietario de la variable se declararan como públicos , los métodos de acceso y mutación no serían necesarios.

En Java 14, se agregaron clases de registro para solucionar este problema. [4] [5] [6]

Para reducir la cantidad de código repetitivo, se han desarrollado muchos marcos, por ejemplo, Lombok para Java. [7] El mismo código que el anterior es generado automáticamente por Lombok utilizando anotaciones de Java , que es una forma de metaprogramación :

@AllArgsConstructor @Getter @Setter clase pública Mascota { cadena privada nombre ; persona privada propietario ; }         

Escala

En otros lenguajes de programación puede ser posible lograr lo mismo con menos código repetitivo, cuando el lenguaje tiene soporte integrado para esas construcciones comunes. Por ejemplo, el equivalente del código Java anterior se puede expresar en Scala usando solo una línea de código:

clase de caso Mascota ( var nombre : String , var propietario : Persona )       

DO#

O en C# usando propiedades automáticas con campos de respaldo generados por el compilador:

clase pública Mascota { cadena pública Nombre { obtener ; establecer ; } Persona pública Propietario { obtener ; establecer ; } }                

A partir de C# 9.0 existe la posibilidad de utilizar registros que generan clases con propiedades automáticamente:

registro público Mascota ( cadena Nombre , Persona Propietario );     

Texto repetitivo del método

Además de las declaraciones, los métodos en los lenguajes OOP también contribuyen a la cantidad de código repetitivo. Un estudio de 2015 sobre proyectos Java populares muestra que el 60% de los métodos se pueden identificar de forma única por la aparición del 4,6% de sus tokens, lo que hace que el 95,4% restante del código repetitivo sea irrelevante para la lógica. Los investigadores creen que este resultado se podría traducir a subrutinas en lenguajes procedimentales en general. [8]

HTML

En HTML , el siguiente código repetitivo se utiliza como plantilla básica vacía y está presente en la mayoría de las páginas web:

<!DOCTYPE html> < html  lang = "en" > < head >  < meta  charset = "UTF-8" />  < title > Prueba </ title > </ head > < body ></ cuerpo > </ html >

El estándar HTML Living Standard de WHATWG define que las etiquetas <html>, <head>y <body>pueden omitirse sin problemas en la mayoría de las circunstancias. [9] La etiqueta es técnicamente redundante cuando proviene directamente de un servidor web configurado para enviar la codificación de caracteres en un encabezado HTTP, aunque resulta útil cuando la respuesta HTML se guarda en un archivo, caché o archivo web. [10] La guía de estilo HTML/CSS de Google recomienda que se omitan todas las etiquetas opcionales, [11] lo que da como resultado mucho menos texto repetitivo. El Consorcio World Wide Web establece que el elemento no debe estar vacío: [12]<meta charset="UTF-8">.html <title>

<!DOCTYPE html> < título > Prueba </ título >

Pitón

En Python , el siguiente código repetitivo se puede utilizar para modificar si el código solo se puede ejecutar dentro o fuera de un contexto de módulo.

si  __name__  ==  '__main__' :  # Cualquier cosa colocada aquí nunca será ejecutada en un contexto de módulo  .si  __name__  !=  '__main__' : # Todo lo que se  coloque aquí solo se ejecutará en un contexto de módulo. 

Véase también

Referencias

  1. ^ Lämmel, Ralf; Jones, Simon Peyton (2003). "Deshazte de tu código repetitivo: un patrón de diseño práctico para la programación genérica". Actas del Taller internacional ACM SIGPLAN de 2003 sobre tipos en el diseño e implementación de lenguajes . TLDI '03. Nueva York: ACM . pp. 26–37. doi :10.1145/604174.604179. ISBN . 9781581136494.S2CID 9472305  .
  2. ^ "Boilerplate". Dictionary.com . Consultado el 27 de enero de 2018 .
  3. ^ "Boilerplate". Merriam-Webster . Consultado el 27 de enero de 2018 .
  4. ^ "Clases de registros". docs.oracle.com .
  5. ^ "JEP 395: Registro". openjdk.org .
  6. ^ Evans, Ben (1 de noviembre de 2020). "Los registros llegan a Java". blogs.oracle.com .
  7. ^ Frankel, Nicolas (7 de diciembre de 2009). "Lombok reduce el código repetitivo". DZone.com . Consultado el 2 de agosto de 2017 .
  8. ^ Martin Velez; Dong Qiu; You Zhou; Earl T. Barr; Zhendong Su (5 de febrero de 2015). "Sobre la diferenciabilidad léxica del código fuente [antes: Un estudio de "trigo" y "paja" en el código fuente]". arXiv : 1502.01410 [cs].
  9. ^ "Estándar HTML - Sintaxis HTML - Etiquetas opcionales". WHATWG . 2017-05-05 . Consultado el 2017-05-05 .
  10. ^ "¿Es necesaria la metaetiqueta charset con HTML5?". stackoverflow.com . Consultado el 5 de mayo de 2017 .
  11. ^ "Guía de estilo HTML/CSS de Google". google.github.io . Consultado el 5 de mayo de 2017 .
  12. ^ "La página HTML tiene un título que no está vacío". www.w3.org . Consultado el 22 de julio de 2021 .