Programación de copiar y pegar

La programación de copiar y pegar , la programación de C&P o copiar y pegar en programación  es el proceso de creación de código de programa con partes que se repiten con frecuencia producidas por operaciones de copiar y pegar ( copiar y pegar en inglés  ) [1] [2] . El término generalmente se usa en un sentido peyorativo para referirse a habilidades insuficientes de programación de computadoras o la falta de un entorno de desarrollo expresivo en el que normalmente se pueden usar bibliotecas de complementos.

La programación de copiar y pegar es un antipatrón común que da como resultado un código duplicado, generalmente grande y difícil de leer. Los fragmentos de código repetidos propagan un error cometido en el código original, y las múltiples repeticiones dificultan la corrección de este error en las copias [1] [3] .

Hay casos en los que copiar y pegar en programación puede ser aceptable o necesario: plantillas, loop unwinding (cuando no hay soporte automático por parte del compilador), y también en el caso de aplicar algunos paradigmas de programación o en caso de soporte de código fuente en forma de fragmentos por parte de los editores .

Plagio

Copiar y pegar es a menudo utilizado por programadores inexpertos o novatos a quienes les resulta difícil escribir código desde cero y prefieren buscar soluciones previamente escritas o soluciones parciales que puedan usarse como base para resolver su problema [4] .

Los programadores que a menudo copian el código de otra persona a menudo no entienden parte o la totalidad de él. Así, el problema surge más por su inexperiencia y falta de persistencia que por el hecho mismo de copiar. El código copiado a menudo se toma de amigos, colegas, foros de Internet , educadores o libros de programación . El resultado corre el riesgo de ser un conjunto de estilos inconexos y puede contener código redundante que resuelve problemas que ya no existen.

Hay alguna diferencia entre la programación copiar y pegar y la programación cargo-cult . El primer tipo se entiende más como el hecho mismo de la duplicación múltiple de partes del código del programa [5] , el segundo tipo puede significar tanto copiar el código para resolver el problema, realizado desde el programa o fuentes externas y sin entender el esquema. del código, y copiando partes del código sin necesidad [5] [ 6] .

Un problema adicional es que los errores también pueden incluirse con el código copiado. Las técnicas de diseño utilizadas en diferentes códigos fuente pueden no ser aceptables cuando se combinan en un nuevo entorno.

Dicho código también puede ofuscarse sin darse cuenta , ya que los nombres de las variables, clases, funciones, etc., después de la copia, generalmente permanecen sin cambios, incluso si su propósito es completamente diferente en el nuevo contexto [4] .

Duplicación

Como forma de duplicación de código , la programación C&P tiene algunos problemas que empeoran si el código no conserva ninguna relación semántica entre el original y la copia. En este caso, si se requieren cambios, se pierde tiempo buscando todas las partes duplicadas. Este proceso se puede acelerar parcialmente con un código bien comentado, pero aún así no elimina la necesidad de varias ediciones. Dado que el mantenimiento del código a menudo omite la actualización de los comentarios [7] , los comentarios que describen dónde encontrar partes duplicadas del código están notoriamente desactualizados.

Eric Allen, en su libro Common Design Mistakes, utiliza el término "mosaico falso" para referirse a los errores causados ​​al copiar una pieza de software. Extraer un fragmento repetitivo en un método (la "receta" principal para deshacerse de tales problemas) puede ser una tarea no trivial [8] .

Uso de bibliotecas

La programación de copiar y pegar también es utilizada a menudo por programadores experimentados que tienen bibliotecas de fragmentos bien probados y listos para usar y algoritmos generales que se adaptan a tareas específicas [2] .

En lugar de crear varias copias modificadas de un algoritmo genérico, el enfoque orientado a objetos sugiere abstraer el algoritmo en una clase encapsulada que se puede reutilizar. Dicha clase se crea de forma flexible, con soporte total para la herencia y la sobrecarga , lo que permite que el código de llamada interactúe con un código genérico en lugar de varios modificados [9] . A medida que se expande la funcionalidad requerida, la biblioteca también crece en tamaño (mientras mantiene la compatibilidad con versiones anteriores ). Entonces, si se corrige un error en el algoritmo original, todo el software que usa este algoritmo y biblioteca gana.

Ramificación

La ramificación es un proceso normal en el desarrollo de software en equipos grandes. Permite el desarrollo paralelo en las sucursales y, por lo tanto, acorta los ciclos de desarrollo. La ramificación clásica tiene las siguientes características:

La programación de copiar y pegar es una alternativa menos formal a la bifurcación clásica, a menudo utilizada cuando se espera que las bifurcaciones diverjan (la diferencia de código en las bifurcaciones aumentará) cada vez más con el tiempo, como en el caso de derivar un nuevo producto de software de un existente.

Como una forma de aislar un nuevo producto, copiar y pegar tiene algunas ventajas. Dado que el desarrollo de un nuevo producto no cambia uno existente:

Defectos:

Otra alternativa al enfoque C&P es el enfoque modular :

Tareas recurrentes o variaciones de tareas

Una de las formas más dañinas de programación C&P es el código duplicado que realiza una tarea repetitiva o una variación de la tarea principal, dependiendo de alguna variable. Cada copia copia la creada previamente con cambios menores. Efectos llamados:

Elección deliberada de enfoque

Copiar y pegar en la programación a veces se acepta como una técnica de programación normal. Por lo general, puede ver esto en patrones como la declaración de una clase, incluidas las bibliotecas estándar, o el uso de una plantilla de código existente (con contenido vacío o funciones auxiliares ) como base para el relleno.

El uso de lenguajes de programación y patrones de diseño es similar al enfoque de copiar y pegar en el sentido de que también usan código repetitivo. En algunos casos, esto se puede expresar como un fragmento que se inserta en el código a pedido, aunque a menudo simplemente se "llama" desde la mente del programador. En otros casos, el uso de expresiones idiomáticas no puede reducirse a un código repetitivo. Sin embargo, en la mayoría de los casos, incluso si el idioma se puede reducir a código, será demasiado largo (que se extraerá en una función) o demasiado corto (para que se pueda escribir directamente).

Ejemplo

Un ejemplo simple de una aplicación válida del enfoque sería un bucle for, que podría parecerse a . Un ejemplo de código que usa un bucle de este tipo sería: for (int i=0; i!=n; ++i) {}

void foo ( int n ) { para ( int i = 0 ; i != n ; ++ i ) { } }

El código para el bucle se puede generar con el siguiente fragmento (que define tipos y nombres de variables):

for ( $tipo $bucle_var = 0 ; $bucle_var != $detener ; ++ $bucle_var ) { }

Muchos programadores a menudo usan el enfoque porque no quieren reescribir una línea que difiere de la anterior por solo unos pocos caracteres (por ejemplo, llamando a la misma función para dos objetos del mismo tipo, cuyos nombres difieren ligeramente). Duplicar la línea anterior (también usando atajos de teclado) es más rápido que volver a escribirla. Pero la probabilidad de cometer un error no disminuye [14] , especialmente para la última línea [15] .

Si necesita realizar más de una edición en la línea duplicada, los errores se producirán con más frecuencia. Como puede ver en el ejemplo, después de la duplicación, el autor corrigió el valor asignado, pero no corrigió el índice de la matriz en el lado izquierdo:

Matriz [ 12 ] = "a" ; Matriz [ 13 ] = "b" ; Matriz [ 14 ] = "c" ; Matriz [ 14 ] = "d" ;

Hay un estudio [16] dirigido a la "despenalización" de la programación de copiar y pegar - Lenguaje de programación Subtext . Cabe señalar que en este modelo, copiar y pegar es el principal modelo de interacción y, por lo tanto, no se considera un antipatrón.

Véase también

Notas

  1. 1 2 Estudio etnográfico de copiar y pegar .
  2. 1 2 Herramienta para rastrear código de copiar y pegar .
  3. Encuesta sobre la detección de clones de software .
  4. 12 Revisión de los errores de los programadores novatos .
  5. 12 Integración de antipatrones .
  6. Cargo Cults en Java .
  7. Creación de ASP.NET .
  8. Errores típicos de diseño, 2003 .
  9. Principios de la programación orientada a objetos .
  10. Reutilización de código en desarrollo orientado a objetos .
  11. Los beneficios de los estándares de codificación .
  12. CS106X .
  13. Código Perfecto, 2005 .
  14. Karpov, 2011 .
  15. Karpov, 2014 .
  16. Subtexto .

Literatura