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?
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.
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.
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.
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.
pienso que este blog fue copiado y pegado de algun otro lugar!! :D
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... :)
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.
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.
Yo a eso lo suelo llamar:
"Hacer un copy-em-pastre"
@alfredocasado +1
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,
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.
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
"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?
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).
izaera es el argumento más curioso que he oido en mucho tiempo, ¿usar el vi quizás como castigo? XD
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,
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.
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
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.