2011-04-04 5 views
6

¿Cuándo es buena forma enviar una variable local a una función/método como parámetro, en lugar de usar una variable de clase en lugar de la variable función/método?Uso de una variable de clase versus envío de variable local a funciones/métodos

Por ejemplo, puedo tener una función:

int DoSomething(int var) 
{ 
    if(var == -1) 
    return 0; 
} 

o puedo tener una variable "_var" clase y utilizarlo en la misma función, así:

int DoSomething() 
{ 
    if(_var == -1) 
    return 0; 
} 

I' M de la mente, si tenemos una variable de clase para ser utilizada en alguna función/método, llamada DoSomething en mi ejemplo anterior, que debería enviar la función/método DoSomething la variable de clase como parámetro, para que la función sea más fácil para leer y probar

¿Cuándo es buena forma de hacerlo? Sé que esta es una pregunta cargada, pero estoy tratando de defender mi argumento con un compañero de trabajo, y afirman que agregaría más código a las firmas de función/método, en lugar de mantener la función/firmas de métodos más pequeñas.

En mi opinión, estoy haciendo que el código sea más limpio y fácil de mantener al empujar las variables de clase a las respectivas funciones/métodos, en lugar de forzarlas a depender de la existencia de una variable de clase.

Por favor, asesorar.

Respuesta

10

La única respuesta inesperada, para cualquier caso genérico es: depende de su caso específico. Los miembros de datos, los miembros estáticos y los argumentos de función sirven con diferentes propósitos. Por supuesto, hay algunos consejos clave que podemos dar sobre qué tipos de carteles debe buscar para elegir uno u otro.

casos típicos:

  • miembro de datos: el valor es parte del objeto de (como en la instancia de una clase) estado. Desea que otras llamadas a métodos reflejen este estado particular.
  • Miembro estático: el valor tiene significado simultáneo, idéntico a todas las instancias de la clase. Normalmente, esto se usa solo para constantes (incluso cuando se inicializa en tiempo de ejecución, como un singleton) pero, en algunos casos, se necesita un estado de clase mutable.
  • argumento de la función: el valor tiene significado solo para una ejecución específica de la función/método. Este valor está sujeto a cambios de una invocación a la siguiente.

Hay algunos síntomas comunes de mala elección.

considerar las siguientes preguntas:

  • ¿Siempre pase el mismo valor a un método, no importa donde usted lo llama desde? Considere hacer que el argumento sea constante y ocultando el argumento. Considere definir sobrecargas: una sin argumento para el caso común y otra con argumento para flexibilidad.
  • ¿Necesita establecer un miembro de datos (a través de un setter) cada vez que invoque la función? Considere hacer que el valor sea un argumento para la función. No es necesario guardar en la firma de la función si necesita reemplazar cada llamada con dos líneas para establecer el valor de antemano.

estoy bajo la impresión de que usted y su compañero de trabajo está en un simple malentendido de la naturaleza de este parámetro. Asegúrese de comprender claramente los argumentos de su compañero de trabajo y dejar en claro. Intenta reformular qué es lo que intentas decir.

+0

Gracias por su comentario Andre. El diseño original de mi compañero de trabajo implicaba una inicialización dinámica de la variable de clase, a través del constructor, y esta variable de clase se utilizó en varias funciones de la clase. Eliminé esta dependencia y envié la variable en cuestión a una llamada de función, que luego la usa en otras llamadas a función. Como la variable no está encapsulando datos para luego propagarlos a otro lugar, pensé que la función DoSomething (int var) sería más apropiada. Gracias de nuevo por su respuesta reflexiva. – Rick

2

miro a ella en términos de dependencia , es decir, que depende de la variable (en su caso var), que es un método o una clase?

Por ej. Los JavaBeans tienen variables de clase que dependen de la clase, por lo que si la clase necesita estas variables, lo mejor es DoSomething().

alternativa, si la clase no se preocupa por var y no en ningún otro necesita, y sólo requiere DoSomething()var, entonces DoSomething(int var) es esencial.

+0

Gracias por su respuesta! Sí. Este es exactamente el argumento que estoy preparando, delineado en mi comentario a Andre arriba. – Rick

0

No debe tratarse de lo que da más o menos código o lo que requiere más esfuerzo para escribir. Se trata de lo que es más lógico dentro del contexto de esa clase y función. En general, mantener las cosas aisladas entre sí es algo bueno, pero no se exceda. Cuando está claro desde el propósito de una función que debería estar trabajando en un valor contenido en una clase var, debería hacerlo y no recibir el valor a través de un parámetro.

Cuestiones relacionadas