¿Debo agregar parámetros a los métodos de instancia que usan esos campos de instancia como parámetros?

7

Tengo un método de instancia que utiliza campos de instancia en su trabajo. Puedo dejar el método sin esos parámetros, ya que están disponibles para mí, o puedo agregarlos a la lista de parámetros, haciendo que mi método sea más "genérico" y no sea confiable en la clase. Por otro lado, los parámetros adicionales estarán en la lista de parámetros. ¿Qué enfoque es preferible y por qué?

Editar: en este momento no sé si mi método será público o privado.

Edit2: aclaración: tanto el método como los campos son nivel de instancia.

    
pregunta dhblah 01.10.2012 - 11:27

6 respuestas

7

OMI, "hacer que mi método sea más" genérico "y no confiable en la clase" no es un buen objetivo, ya que promueve clases con baja cohesión .

Si su método también es lo suficientemente genérico para servir para otras clases, entonces sáquelo de la clase y muévalo a una clase de "biblioteca de funciones". (Pero tenga cuidado con el antipattern de descomposición funcional ).

    
respondido por el user281377 01.10.2012 - 14:43
2

Cada interfaz que usted ofrece a clientes externos le da restricciones. Por ejemplo, si tienes un método

    public double computeMean(double[] values) {
    ...
    }

Usted da la promesa de aceptar arrays double[] , pero ¿qué sucede si entrega el código a los clientes y de repente se da cuenta de que ArrayList<Double> sería mejor? Y quizás no sepa si hay clientes que llaman a su método, por lo que no puede simplemente cambiarlo a ArrayList.

Si es público y la clase ya conoce el values , no necesita los parámetros. Esto le da la libertad de cambiar de double[] a lo que quiera, sin cambiar su interfaz.

Si es un método privado, no necesita los parámetros, serían códigos repetitivos, ya que ya conoce los valores como dijo.

Si desea una función realmente genérica que no dependa en absoluto de la clase (lo que significa que no hay un estado del que realizar un seguimiento), puede crear un método static que obtenga toda la información que necesita de los parámetros, si no mantienes ningún estado en tu clase en absoluto, ni siquiera necesitas una instancia de esta clase. Como en Java Collections.sort (...).

Depende de sus clientes si debe agregar los parámetros.

    
respondido por el Puckl 01.10.2012 - 11:54
1

Bueno, a menos que necesite una interfaz con el mundo exterior, no es útil agregar parámetros, ni tampoco si es necesario para más tarde.

Si en algún momento debe darse cuenta de que necesita proporcionar este método con parámetros, puede sobrecargar este método en ese momento, aceptando los parámetros en la nueva firma y administrarlo de esa manera.

En términos generales, tiendo a considerar un buen enfoque de diseño que deja los posibles cambios de segunda generación fuera de alcance, si mi especificación está bien definida.

Es mejor mantener el diseño lo mínimo posible, pero abierto a posibles cambios posteriores.

Esto significa que, dada una situación como la suya, no es útil confiar inmediatamente en la evolución del programa; en lugar de eso, apéguese a las especificaciones reales, diseñando con miras a lo que es razonable esperar.

    
respondido por el Federico Zancan 01.10.2012 - 12:00
0

Respuesta breve: si el método de instancia tiene acceso a las variables de instancia, no hay necesidad de pasar esos mismos valores como parámetros.

Si desea crear métodos de clase (estáticos), dicho método no tendrá acceso a ningún estado, por lo que debe pasar los valores como parámetros.

    
respondido por el Tulains Córdova 01.10.2012 - 15:09
0

Piénsalo de esta manera. Si las variables de instancia están más relacionadas con la clase en general, déjelas en la clase. Si no están relacionados con la clase pero mucho más con un solo método, conviértalos en parámetros.

Si piensa de esta manera, tendrá una cohesión superior, también, cuál Conceptos de OO.

    
respondido por el Patkos Csaba 01.10.2012 - 16:30
0

Si la entrada al método debe ser en campos de instancia o en parámetros depende de lo que hace el método . Depende de la semántica del método, de la relación del método con la clase y de su , y del propósito de los campos dentro de la clase. No especificaste ninguno de estos, por lo que la respuesta podría ser cualquier cosa.

En general, si tiene algún sentido que el método haga todo su trabajo a partir de parámetros en lugar de campos de instancia, entonces mi primer instinto sería preguntarme por qué el método está incluso en esa clase. Quizás debería ser un método de utilidad estática en alguna clase de ayuda estática.

Dicho de otra manera, si crees que no hay duda de que el método debe ser claramente un método de instancia en esa clase, entonces debería parecer igualmente inequívoco que use los campos de instancia de la clase; debería parecer imposible hacerlo de otra manera. camino. Ya que lo estás cuestionando, deberías poner la premisa en cuestión.

    
respondido por el Timwi 07.10.2012 - 05:27

Lea otras preguntas en las etiquetas