He llegado a creer algo acerca de la refactorización que no he visto mencionada aquí, sé que ya hay muchas respuestas aquí, pero creo que esto es nuevo.
He sido un refactorista despiadado y un fuerte creyente en la SECA desde antes de que surgieran los términos. Principalmente es porque tengo problemas para mantener una base de código grande en mi cabeza y en parte porque disfruto de la codificación DRY y no disfruto nada de la codificación C & P, de hecho es doloroso y terriblemente lento para mí.
La cuestión es que insistir en DRY me ha dado mucha práctica en algunas técnicas que rara vez veo que otras usan. Mucha gente insiste en que es difícil o imposible hacer Java en DRY, pero en realidad no lo intentan.
Un ejemplo de hace mucho tiempo que es algo similar a su ejemplo. La gente tiende a pensar que la creación de Java GUI es difícil. Por supuesto que si escribes así:
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
Cualquiera que piense que esto es una locura tiene toda la razón, pero no es culpa de Java: el código nunca debe escribirse de esta manera. Estas llamadas de método son funciones destinadas a envolverse en otros sistemas. Si no puede encontrar un sistema de este tipo, ¡constrúyalo!
Obviamente no puedes codificar así, así que necesitas dar un paso atrás y mirar el problema, ¿qué está haciendo realmente ese código repetido? Está especificando algunas cadenas y su relación (un árbol) y uniendo las hojas de ese árbol a las acciones.
Así que lo que realmente quieres es decir:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
Una vez que haya definido su relación de alguna manera que sea sucinta y descriptiva, escriba un método para tratarla. En este caso, repita los métodos de la clase pasada y construya un árbol y luego use eso para construye tus menús y acciones, así como (obviamente) muestra un menú. No tendrá duplicación, y su método es reutilizable ... y probablemente más fácil de escribir que un gran número de menús, y si realmente disfruta de la programación, se divirtió MUCHO más. Esto no es difícil, ¡el método que necesita para escribir es probablemente menos líneas que crear el menú a mano sería!
La cosa es que, para hacer esto bien, necesitas practicar, mucho. Debe ser bueno analizando exactamente qué información única hay en las partes repetidas, extraiga esa información y descubra cómo expresarla bien. Aprender a usar herramientas como el análisis de cadenas y las anotaciones ayuda mucho. Aprender a ser realmente claro sobre el informe de errores y la documentación también es muy importante.
Obtienes la práctica "gratis" simplemente mediante la codificación correcta. Lo más probable es que una vez que lo hagas, encuentres que la codificación de algo SECO (incluida la escritura de una herramienta reutilizable) es más rápida que copiar y pegar, y todos los errores , errores duplicados y cambios difíciles que causa el tipo de codificación.
No creo que pueda disfrutar de mi trabajo si no practicara las técnicas DRY y las herramientas de construcción tanto como podría. Si tuviera que reducir mi pago para no tener que copiar y pegar la programación, lo tomaría.
Así que mis puntos son:
- Copiar & Pegar cuesta más tiempo a menos que no sepa refactorizar bien.
- Aprendes a refactorizar bien haciéndolo, insistiendo en DRY incluso en los casos más difíciles y triviales.
- Eres un programador, si necesitas una pequeña herramienta para hacer tu código DRY, compílalo.