Sol eterno del copiar y pegar impecable

Sol eterno del copiar y pegar impecable

Hoy recordemos el artículo antiguo pero bueno "El efecto de la última línea" escrito hace más de 5 años. El tiempo pasa, pero nada cambia. No hay nada terrible en ello. Copiar y pegar sigue siendo cruel y despiadado. Sin embargo, a lo largo de los años, muchos lectores nuevos se han sumado a nuestro blog y es posible que no estén familiarizados con ese artículo. Así que ahora habrá un momento de recuerdos y algunas adiciones.

Hoy me encontré con la mención del artículo "Last Line Effect" en el tweet de Jason Turner. Como podemos ver, el tema de Copiar y Pegar está vivo y seguido de animadas discusiones. Así que decidí que valía la pena desempolvar esa publicación y recordársela. Estoy seguro de que muchas personas no han leído este viejo artículo o lo han olvidado. Pero es muy interesante y divertido.

Aquí está el punto principal. Las personas tienden a cometer errores al final de las operaciones monótonas, ya que pierden la atención. Una de esas cosas tediosas es escribir código con Copiar y Pegar.

Si uno tiene que escribir un código que consta de bloques similares, la gente prefiere copiar el bloque y editarlo. Así que noté que lo más probable es que se cometa un error en el último bloque.

Este es el patrón con ejemplos relevantes que describo en el artículo "Efecto de última línea".

De todos modos, no me gustaría volver a contar el contenido de este artículo aquí. Entonces, si aún no lo ha revisado, siga el enlace y léalo.

Desafortunadamente, el artículo se escribió en un momento en que el analizador de PVS-Studio aún no podía analizar proyectos de C# y Java. Por lo tanto, todos los errores del artículo se relacionan con los lenguajes C y C++.

En este punto, puedo dar ejemplos similares relacionados con otros idiomas. El problema de copiar y pegar es universal y se revela en todas partes de la misma manera. Para no ser infundado, citaré un ejemplo para C# y Java.

El ejemplo de un error que encontramos en el proyecto C# AWS SDK for .NET.

if (
  (this.token == JsonToken.ObjectEnd ||
  this.token == JsonToken.ArrayEnd ||
  this.token == JsonToken.String ||    // <=
  this.token == JsonToken.Boolean ||
  this.token == JsonToken.Double ||
  this.token == JsonToken.Int ||
  this.token == JsonToken.UInt ||
  this.token == JsonToken.Long ||
  this.token == JsonToken.ULong ||
  this.token == JsonToken.Null ||
  this.token == JsonToken.String       // <=
  ))
{
  ....
}

El ejemplo de un error que encontramos en el proyecto Java Elasticsearch.

for (int i = 0; i < values.length; i++) {
    if (values[i] == null) continue;
    if (values[i] instanceof String) continue;
    if (values[i] instanceof Text) continue;
    if (values[i] instanceof Long) continue;
    if (values[i] instanceof Integer) continue;
    if (values[i] instanceof Short) continue;
    if (values[i] instanceof Byte) continue;
    if (values[i] instanceof Double) continue;
    if (values[i] instanceof Float) continue;
    if (values[i] instanceof Boolean) continue;   // <=
    if (values[i] instanceof Boolean) continue;   // <=
    throw new IllegalArgumentException(....);
}

Como puedes ver, todo es igual en todas partes :). No es sorprendente, ya que los errores tipográficos y los problemas de copiar y pegar casi no dependen del idioma elegido.

Por cierto, para aquellos que quieran profundizar en el tema tratado, ofrezco el siguiente artículo de investigación, escrito por varios autores:"El efecto de la última línea explicado".

¿Qué harás ahora con este conocimiento? Buena pregunta. Tengo tres ideas:

  • Tenga en cuenta este efecto y dígaselo a los demás. Al saberlo, será más preciso al terminar el mismo tipo de trabajo de escritura de código. ¡El conocimiento es poder!
  • Así que no sea perezoso y escriba funciones, funciones de plantilla o expresiones lambda para evitar la duplicación de código. En cuanto a las macros, no las escribas en absoluto. Marcos son malvados.
  • Use PVS-Studio regularmente. Es excelente para encontrar esos errores.