¿Cómo eliminar el código duplicado (en general)?

10

En un lenguaje OO (p. Ej., Pero no limitado a Java), ¿cómo arregla el código duplicado dependiendo del alcance de su ocurrencia? Yo comenzaría con (por ejemplo)

  • en la misma clase (alcance) realice la refactorización del método de extracción (arreglo)
  • en clases de la misma jerarquía (alcance), realice el método de extracción y el pull up (arreglo)
  • ...
Peter Kofler
fuente
Eche un vistazo a un ejemplo para implementar el principio DRY (no se repita) con la misma clase en esto: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance
La pregunta original en SO ( stackoverflow.com/questions/7380946/… ) se cerró. Entonces lo mudé aquí.
Peter Kofler

Respuestas:

8

Recientemente encontré una buena respuesta a mi pregunta en el "Código limpio" del tío Bob, que quiero compartir. Él diferencia tres tipos de duplicación

Las piezas de código idéntico deben reemplazarse con un único método. Entonces, la solución sería extraer el método y delegar al comportamiento común.

  • en el mismo método, realice la Extracción de la variable local y reutilícela.
  • en la misma clase, realice la refactorización del método de extracción.
  • en clases de la misma jerarquía, método de extracción y extracción. Se podría crear una jerarquía para encontrar un lugar para los métodos.
  • en clases de jerarquías separadas use la delegación a nuevos objetos.
  • Si los métodos no necesitan ningún estado de cierre, entonces se podría aplicar el patrón "lib" (que es un contenedor para métodos estáticos, generalmente llamados SthUtilo SthLib).

casos de switch/casey if/elseque siempre prueban el mismo conjunto de condiciones .

  • Estos deben ser reemplazados con polimorfismo.

Módulos que implementan algoritmos similares . Estos son los más difíciles de encontrar, ya que ningún detector de clones puede encontrarlos.

  • Como el alcance es mayor, se utilizan patrones de diseño. El patrón de diseño del Método de plantilla puede aplicarse para algoritmos dentro de una jerarquía de clases.
  • El patrón de diseño de la estrategia puede aplicarse a cualquier algoritmo que se use en diferentes lugares.

También un punto válido mencionado por Oded, cuando se trata de diferentes versiones de bibliotecas

  • consolidar en una sola versión. El patrón de diseño de fachadas podría ayudar aquí.

Al final, la mejor frase para responder a mi pregunta es por estímulos:

El método de reutilización de código utilizado en los lenguajes OO es objetos.

Peter Kofler
fuente
5

En general, consolide el código duplicado en un solo lugar y asegúrese de que el sitio de duplicación original llame al lugar consolidado.

En sus ejemplos, dentro de una clase, este sería el método extraído y dentro de un conjunto de clases, el método desplegado dentro de la clase base.

En el código de copiar y pegar, esto sería eliminar los duplicados y garantizar que los usuarios ahora usen la copia única (en cualquier nivel que sea).

Cuando trabaje con diferentes versiones de bibliotecas, consolide en una única versión (si es posible).

Oded
fuente
¿No sería el método "desplegable" si está en una clase base? Siempre imagino las clases base como físicamente bajo las clases derivadas.
Dave Nay
El nombre propio del libro Refactoring es "pull up".
Peter Kofler
1

Supongo que esta es una pregunta abierta pero también depende del estado del código. Quiero decir que puedes tolerar un poco el código duplicado dependiendo del contexto. La regla de tres es buena para este asunto.

Regla de tres La primera vez que haces algo, simplemente lo haces. La segunda vez que haces algo similar, haces una mueca por la duplicación, pero haces lo duplicado de todos modos. La tercera vez que haces algo similar, refactorizas.

Aunque esto es bastante discutible, esta publicación también considera casos en los que tolerarías código duplicado.

Will Hughes
fuente
1
+1 sobre la "regla de tres". Siempre me sorprende lo ampliamente aplicable que es.
Andy mango
1
Esto no responde a la pregunta de cómo .
Jan Doggen