Buscar
IntelliJ IDEA

Social
Contenido de otras web
En javaHispano...
« ¿Qué IDE empleas? Resultados de la encuesta | Main | La Wikipedia migra de MySQL a MariaDB »
martes
dic182012

Copiar y pegar código debería ser ilegal

Este es el punto de vista de Andrew Wulf, "The Codist". Según él, el hecho de que alguien copiase y pegase código es algo que le ha ocasionado problemas en múltiples ocasiones a lo largo de su vida como programador. Uno de los problemas que tiene esto es que el día de mañana cuando sea necesario modificar ese código, habrá que modificarlo en un montón de puntos diferentes. Y es posible que nos olvidemos de cambiar todas esas copias del código, introduciendo así bugs.

Otro problema es que ese código que inicialmente comienza siendo el mismo, a menudo evoluciona de modo diferente en cada uno de los sitios en los que ha sido pegado. Si el día de mañana hace falta cambiar esa funcionalidad, habrá que entender cada uno de esos sitios independientes y llevará mucho más trabajo hacer cambios en esa pieza de funcionalidad. Si en vez de copiar y pegar nos hubiésemos molestado en refactorizar esa funcionalidad de modo adecuado a un método o una clase, sólo habría que cambiarla en un sitio.

El artículo original se trata de una lectura interesante. ¿Vosotros copiais y pegais código a veces?

PrintView Printer Friendly Version

EmailEmail Article to Friend

Reader Comments (20)

Totalmente de acuerdo, además que copiar y pegar código es totalmente innecesario. Yo me baso en una regla muy simple: si tengo que usar el mismo código, aunque sea sólo en dos lugares diferentes, selecciono el código, lo copio, lo reemplazo por un llamado a un método y pego el código dentro del método. Con IDEs como Eclipse esto además es sumamente sencillo.

diciembre 18, 2012 | Unregistered CommenterSebastián

Que susto! por el título lo que primeramente entendí era que querían ilegalizar el compartir (copiar) código de otros. Aclarado eso, estoy totalmente de acuerdo con el artículo, hay que encontrar un equilibrio entre copiar y parametrizar métodos que hagan casi lo mismo, siempre hay que desarrollar pensando en las evoluciones y mantenimiento que pueda tener el software.

diciembre 18, 2012 | Unregistered CommenterRoberto

Menuda gilipollez para crear polémica. Yo propondré que sea ilegal escribir tonterías en un blog para que luego la gente se las tome literalmente y pase lo que pase.

IMHO, una reflexión simplista para una discusión en blanco y negro.

diciembre 18, 2012 | Unregistered CommenterKomorr

El articulo original parte de un precepto equivocado,

When you replicate code with copy and paste you are spreading potential evil into your nice carefully designed codebase.

En especial por lo de "your nice carefully designed codebase "

Además, por algo se inventó el refactoring.

diciembre 18, 2012 | Registered Commenterefrigerio

pienso que este blog fue copiado y pegado de algun otro lugar!! :D

diciembre 18, 2012 | Unregistered CommenterCopy

Este hombre quiere cargarse la más genuina, extendida y preferida forma de reutilización real de código... :), que no quiero decir que sea la mejor....

Pero ya se sabe, lo mejor es enemigo de lo bueno... :)

diciembre 18, 2012 | Registered Commenterasertus

Hombre, razón lleva razón claro esta, pero que en "casi" 2013 alguien escriba un post declarando que el copy&paste es malo... america no esta descubriendo precisamente.

La mejor definición de esto para mi es el principio DRY de pragmatic programmer:

DRY–Don't Repeat Yourself
Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

Y cuidado que copy&paste es sólo una forma de duplicación, la más obvia, pero hay otras como la repetición de estructuras similares, le duplicación entre proyectos, la duplicación de datos, la duplicación de ficheros de configuración... algunos son más faciles de detectar y corregir que otros.

Ahora una reflexión, reutilizar y hacer código generico no es trivial, requiere cierto nivel de experiencia y/o habilidad para hacerlo con seguridad. ¿Que pasa si introduces un bug en un código del que dependen cientos de clases?, incluso puede que el bug no sea tan obvio y todo funcione bien en el caso en el que estas trabajando pero introduzcas regresiones muy difíciles de localizar.

Sin test automáticos de regresión no si es peor el remedio que la enfermedad. Es decir, algunos programadores sin mucho nivel o experiencia (y en nuestra industria hay muchos) casi es preferible que corten y peguen, puede sonar extraño, pero sin un buen diseño y una buena bateria de test de regresión reutilizar es bastante peligroso. Me hace gracia porque esto si que no lo suene mencionar nadie, pero yo he visto auténticos desastres por tratar de reutilizar y hacerlo mal, casi los mismos que por hacer copy&paste indiscriminado.

diciembre 18, 2012 | Registered Commenteralfredocasado

Hasta cierto punto lo veo bien. Eso de incorporar una determinada funcionalidad a una clase debería mirarse con lupa, ya que hay que tener en cuenta los principios por los que se crean las clases (no se puede hacer a lo loco, debe desglosarse en una mínima funcionalidad). Y aún con ello, aunque no sea tan notorio, hay que tener en cuenta que el introducir más clases hace que el programa vaya más lento, por lo que tampoco se puede pretender que se creen clases así porque sí para solventar los problemas del copy & paste. Se trata, creo yo, hacerlo de forma tal que la solución a un problema no genere otro nuevo.

diciembre 18, 2012 | Unregistered CommenterMolina

Yo a eso lo suelo llamar:
"Hacer un copy-em-pastre"

diciembre 18, 2012 | Registered Commenterlogongas

@alfredocasado +1

diciembre 19, 2012 | Registered Commenterpeyrona

Ahora resulta que el copy&paste está al nivel del goto.

:o(

Si el sistema está "bien diseñado" (o como ponen en el articulo original "your nice carefully designed codebase "), la cantidad de código duplicado debería ser mínima y acotado a pequeñas rutinas de uso genérico como puede ser un bloque try/catch de lectura o escritura en un Stream o cualquier otra que en sí misma no justifique crear un jar y arrastrar dependencias entre distintos proyectos.

Y si no, para algo existen las métricas de código y el refactoring.

Un saludo,

diciembre 19, 2012 | Registered Commenterefrigerio

Desde mi punto de vista, copiar y pegar es una mala práctica (ilegal, pues podría considerarse). Por otro lado, si que se vé muchas veces dicha práctica y te encuentras "sorpresas" heredando el código de otro compañero (prácticas que en la universidad están perseguidas y penadas con suspender la asignatura).
Desde mi punto de vista no debería darse esta situación, y es muy molesto encontrarse con código que sigue la dinámica "copy / paste".
Aunque, en ocasiones, en las realidades de las empresas (y por ejemplo, iniciar un proyecto a partir de otro), se produce, aunque internamente, las empresas advierten de "no hacer uso del copy paste", en ocasiones, se hace uso de ello (y en consecuencia, suele traer errores heredados, si el antiguo código no estaba bien implementado, o bien, si el código no tiene sentido en el sistema en el que se está desarrollando, y si tenía sentido en el antiguo).

Por otro lado, siempre parece más limpio, como ya ha comentado Eduardo y otros compañeros, el refactoring, métricas de código, importar, parametrizar, exportar jar's, documentar el código... etc.

diciembre 19, 2012 | Registered Commenterjcarmonaloeches

Creo que es cuestión de conocimiento de la persona que lo hace, si copias y pegas el mismo código en varios puntos es xq no se tiene nocion de refactoring ni de algún patrón de diseño que pueda ajustarse a lo que se quiere hacer, y pues para eso detrás del desarrollador inexperto hay un senior, un líder de proyectos y toda una estructura que valide lo que se hace, ojo también se puede caer en un caso de sobre-ingenieria, ya que si estas haciendo algo que no va a ser modificado no vale la pena hacer algo tan elaborado y puedes darte gusto con el copy/paste xD

diciembre 19, 2012 | Registered Commentergishac

"yo he visto auténticos desastres por tratar de reutilizar y hacerlo mal, casi los mismos que por hacer copy&paste indiscriminado"

Bienvenida maldad, dudo que te hayas encontrado muchos casos, la carencia es mucho más habitual que el exceso.

¿Merece la pena gastar tantos bytes en este tema?

diciembre 20, 2012 | Registered Commenterjmarranz

Yo siempre he dicho que el desarrollo se estropeó el dia que la gente dejo de usar "vi". En "vi" copiar y pegar era tan tedioso que la gente se preocupaba de mantener el código ordenado y reutilizable. Ahora, con los editores visuales es tan cómodo que muchos desarrolladores perezosos prefieren copiar y pegar a organizar bien su código.

Nota: es un sarcasmo, que nadie empiece una guerra santa a favor o en contra del "vi" por este comentario (Cuando el dedo señala la luna, el tonto mira el dedo).

diciembre 20, 2012 | Unregistered Commenterizaera

izaera es el argumento más curioso que he oido en mucho tiempo, ¿usar el vi quizás como castigo? XD

diciembre 20, 2012 | Registered Commenterjmarranz

Bárbaro,
Ya mencionamos al go to, al vi, falta que alguien más hable maravillas del make y ya estamos como cuando las guerras del código spaghetti vs estructurado.

:D

PD:
Usar vi SI ES UN CASTIGO,

diciembre 20, 2012 | Registered Commenterefrigerio

jmarranz: Lo único que quiero decir es que a veces reutilizar no es tarea simple, que seas consciente de tus limitaciones como desarrollador (todos las tenemos a cierto nivel), y si no sabes como reutilizar algo dejalo duplicado antes de hacer una chapuza que luego no mantiene ni perry por tratar de cumplir con el DRY a toda costa o por tratar de hacer que los indicadores de alguna herramienta de analisis estatico muestren un porcentaje de duplicación menor.

offtopic: usar eclipse (u otro IDE) es como nadar con manguitos, esta bien para no ahogarse al principio, pero el día que te los quitas descubres que se puede nadar mucho más rapido sin ellos.

diciembre 20, 2012 | Registered Commenteralfredocasado

Reutilización de ideas: para qué desgastar el teclado, cuando alguien más expresa lo que uno piensa de una manera tan clara y coherente.

Sobre IDEs y demás:

http://techblog.bozho.net/?p=1072

diciembre 20, 2012 | Registered Commenterchoces

Y yo en cambio, el problema lo tengo porque la gente no ha hecho copy/paste. Ahora mismo tengo varios trozos de código que en un principio eran para funcionalidades distintas que todas hacían lo mismo, y ahora, a medida que las funcionalidades se han ido separando son un engendro de if's y variables reutilizadas de un lado a otro, que cada vez que hay que meterles mano, rezas para que arreglando algo no jodas tres cosas más.

El código hay que encapsularlo con cabeza, en bloques pequeños con poca funcionalidad para que puedan reutilizarse para construir cosas más complejas. Y debe hacerse siempre teniendo en cuenta que lo que parece igual no tiene porque serlo con el tiempo.

diciembre 21, 2012 | Unregistered Commenteraitkiar

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>