2011-12-16 10 views
7

Estoy tratando de refactorizar un proyecto en el que existen los mismos métodos que se distribuyen en varias clases. Para reducir la duplicación de código, ¿debería mover el código común a una superclase abstracta o debería ponerlo en un método estático en una clase de utilidad?Debo crear un método estático o una superclase abstracta

EDIT Algunos de los métodos son para cosas genéricas que creo que pueden estar estáticos. Si bien hay otros que se refieren a los atributos de la clase, en cuyo caso creo que tiene más sentido hacerlo como una súper clase abstracta.

+2

Imposible responder sin contexto; mucho depende de cuán estrechamente relacionadas estén las clases existentes, cómo se usan las clases y los métodos, etc. –

+1

Tiene que decirnos más acerca de estos métodos, si comparten el mismo comportamiento y podrían actuar independientemente de cualquier clase, luego tener utilidad. las clases con métodos estáticos tendrían sentido. Si está pensando en usar clases abstractas/clases base/interfaces, debe considerar si esa jerarquía de clases tendría sentido, y si estas funciones son realmente intrínsecas al comportamiento de esas clases o, como se mencionó anteriormente, a esos métodos no les importa sobre la clase de la que forman parte. – birryree

+0

¿Puede explicarme qué hace el método y si todas esas clases están relacionadas? –

Respuesta

0

Si no utiliza ningún miembro de la clase, ¡puede hacerlo estático!

Pero debe hacerlo en una clase o clase abstracta madre

+3

¿clase de madre? Suena bien. –

+0

Es bastante temprano en la mañana aquí: X No esperes demasiado: D –

1

Otro punto a considerar puede ser el tipo de trabajo que hacen estas funciones. Si está disperso, debe crear una clase fachada/auxiliar/util con métodos estáticos.

2

Depende de lo que haga su código. ¿Son métodos de utilidad? ¿Son métodos de clase específicos/especializados? ¿Es esta una aplicación pesada multiproceso?

Tenga en cuenta que si los convierte en estáticos y su aplicación es multiproceso, tendrá que protegerlos con bloqueos. Esto, a su vez, reduce la concurrencia. En este caso, dependiendo de cuántos subprocesos llamen a ese mismo fragmento de código, puede considerar moverlo (el código) a una superclase.

+1

Solo necesitas bloquear los métodos estáticos si son con estado – user949300

+1

@ user949300 Estoy de acuerdo. Estaba haciendo suposiciones. – Adrian

5

Bueno, sigo una regla: No utilice la clase base para eliminar la duplicación de código, use la clase de utilidad.

Por herencia, pregunte a usted mismo: ¿Existe una relación Is-A?

Otra regla, que la mayor parte de las veces es correcto, es: Prefiero composición sobre la herencia

usando clase de utilidad estático no es verdadera composición, pero se le puede llamar una derivación de la misma.

Aplica estas reglas a tus secenrios y toma una decisión teniendo en cuenta el mantenimiento y la escalabilidad. Sin embargo, será bueno si pudiera agregar más detalles a su pregunta.

+0

Más detalles reducirían las conjeturas, pero me gustan las reglas generales que usted mencionó. –

0

Si los métodos utilizan muchos campos o métodos de la clase, no deberían ser estáticos. Si son algo que una subclase puede querer modificar, no deberían ser estáticos. Si los métodos deben formar parte de una interfaz, no pueden ser estáticos.

De lo contrario, es su decisión y probablemente cambie de opinión más adelante. :-)

1

Como han mencionado otros, la respuesta depende del contexto del problema y del código duplicado.

Algunas cosas a considerar

  • ¿El código duplicado mutar la instancia del objeto. En este caso, un método protegido en una clase abstracta común
  • En lugar de la clase de utilidad estática, considere un singleton. Los métodos estáticos pueden ser problemáticos para pruebas unitarias puras, aunque los marcos de prueba mejoran.
  • La herencia puede ser complicada para hacer las cosas bien, piensa si estos objetos de las diferentes clases están realmente relacionados y requieren un re factorización OO. o son piezas disjuntas de lógica de dominio que requieren bits de código similares.
0

A primera vista, diría que sería mejor hacer el código común como un método público estático en una clase pública. Esto hará que el método útil para cualquier clase sólo mediante el uso

UtilityClassName.methodName(); 

Esto es mejor que lo que es un método concreto en una super-clase abstracta porque entonces siempre se tendrá que extender esta super-clase en todas las clases donde quieres usar este único método.

Pero ahora, como dijiste, el comportamiento del método depende de algunas variables. Ahora, si depende de las variables de instancia de diferentes clases, mejor agregue este método en una interfaz y permita que todas sus clases implementen esta interfaz y tengan su propia implementación de la misma.

Pero de nuevo si estas variables son valores constantes, entonces tienen estos valores constantes en una interfaz. Implemente estas interfaces en su clase de utilidad. Y nuevamente haga que sea un método estático en esa clase de utilidad que usará directamente estas constantes.

Por ej. Considera Foll. código común de área de retorno de un círculo.

public interface TwoDimensional{ 
     double PI = 3.14; 
    } 

    public class MyUtility implements TwoDimensional{ 
     public static double getCircleArea(double radius){ 
      return PI*radius*radius; 
     } 
    } 

Aquí, se puede ver que el método getCircleArea() depende del radio que será diferente para diferentes clases, pero aún así puede pasar este valor con el método estático de clase myUtility.

Cuestiones relacionadas