2010-12-14 8 views
8

En Java, dada la siguiente clase:Java Estilo/Mejor Práctica - pasando campos de métodos vs accediendo directamente a

public class MyClass { 
    private final Dependency dependency; 
    public MyClass(Dependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public void doWork() 
    { 
     // validate dependency... 
    } 

El método DoWork necesita invocar un método que utiliza dependency.

¿Cuál de las siguientes dos variaciones se considera "mejor práctica", y por qué?

// Access dependency directly 
    void validateDependency() 
    { 
     this.dependency.something(); 
    } 

    // access dependency as passed to the method 
    void validateDependency(Dependency dependency) 
    { 
     dependency.something(); 
    } 

me encuentro a favor de este último, pasando la dependencia directa con el método, ya que hace que el método más fácil para poner a prueba de forma aislada (aunque marginalmente).

Sin embargo, estoy interesado en la convención/práctica recomendada de java aquí.

+4

ciertamente depende de la situación. –

+1

exactamente! depende de la situación; por ejemplo, si tiene operaciones que están temporalmente acopladas (debe llamarse en un orden específico), entonces debe usar el último. De lo contrario, podría terminar con clientes/mantenedores de su código obteniendo NPE o un comportamiento más confuso. – lucas1000001

+0

también, para llevarlo al extremo - Supongo que realmente está considerando estilos de programación funcionales versus orientados a objetos - oo siendo el primero y funcional el último. – lucas1000001

Respuesta

9

Existe una clase porque tiene estado y operaciones que están acopladas a ese estado. No hay una buena razón para pasar parte de ese estado como parámetro de un método de clase.

De hecho, me indicaría que ese estado no debería pertenecer a la clase. O que el método no pertenece a la clase.

El uso de un parámetro "para que sea más fácil probar la unidad" es una buena indicación de que esto último se cumple (el método no debe estar en la clase).

+0

+1 justo en mi buen anon –

-1

No hay una manera correcta de hacerlo. Prefiero solo poner la variable allí.

+1

-1 Las API deberían estar mejor pensadas. –

-1

Dependency injection. La segunda opción es "mejor".

Si convierte su clase de "Dependencia" en una interfaz, hace que el código sea más modular, más fácil de probar y menos acoplado.

+1

-1 Su "Dependencia" es una variable miembro. Ya está acoplado. Llamar a esto "inyección de dependencia" ofusca la situación. –

3

Bueno, en su ejemplo le está pidiendo a la función que haga algo con Dependencia que se presta a una función estática, no a una función de miembro.

Mi regla de oro es: Use miembros directamente al llamar a un método en un objeto que posee el miembro sino que pasan referencias al hacer/probar algo directamente relacionado con la dependencia y favorecer a los métodos estáticos para este último

Eso es un poco detallado, pero espero que ayude. Como siempre, trate de "hacer lo correcto" y las diferencias tan pequeñas probablemente no tengan un gran impacto en el mantenimiento o la legibilidad de su código.

Cuestiones relacionadas