Pregunta

¿Cómo deciden entre hacer un seguimiento de algo localmente y luego pasarlo a cada método que invoquen, o declarar una variable de instancia y usarla en los métodos?

Tiendo a preferir las variables de instancia que se mantienen en una lista al final de la Clase. Pero a medida que mis programas se vuelven cada vez más complicados, esta lista se hace más y más larga ... Supongo que si algo se pasa con la frecuencia suficiente, debería ser visible para todos los niños y niñas que lo necesitan, pero luego empiezo a preguntarme: " ¿por qué no hacer público todo? ¡Entonces ya no habrá necesidad de pasar nada! ''

¿Fue útil?

Solución

Dado que se refiere a variables de instancia, supongo que está trabajando en un lenguaje orientado a objetos. Hasta cierto punto, cuándo usar variables de instancia, cómo definir su alcance y cuándo usar variables locales es subjetivo, pero hay un par de reglas generales que puede seguir cuando cree sus clases.

  • Las variables de instancia generalmente se consideran atributos de una clase. Piense en ellas como adjetivos del objeto que se creará a partir de su clase. Si los datos de su instancia se pueden usar para ayudar a describir el objeto, entonces es seguro apostar que es una buena opción para los datos de la instancia.

  • Las variables locales se utilizan dentro del alcance de los métodos para ayudarlos a completar su trabajo. Por lo general, un método debe tener el propósito de obtener algunos datos, devolver algunos datos y / o procesar / ejecutar un algoritmo en algunos datos. A veces, ayuda pensar en las variables locales como formas de ayudar a que un método llegue de principio a fin.

  • El alcance de la variable de instancia no es solo por seguridad, sino también por encapsulación. No asuma que el objetivo "debe ser mantener todas las variables privadas". En casos de herencia, hacer variables como protegidas suele ser una buena alternativa. En lugar de marcar todos los datos de instancia como públicos, crea captadores / establecedores para aquellos a los que se debe acceder en el mundo exterior. No los ponga a disposición, solo los que necesita. Esto vendrá durante todo el ciclo de vida del desarrollo: es difícil de adivinar desde el principio.

Cuando se trata de pasar datos por una clase, es difícil decir que lo que estás haciendo es una buena práctica sin ver algún código. A veces, operar directamente en los datos de la instancia está bien; otras veces no lo es. En mi opinión, esto es algo que viene con la experiencia: desarrollará cierta intuición a medida que mejoren sus habilidades de pensamiento orientado a objetos.

Otros consejos

Principalmente esto depende de la vida útil de los datos que almacena en la variable. Si los datos solo se usan durante un cálculo, páselos como un parámetro. Si los datos están vinculados a la vida útil del objeto, use una variable de instancia.

Cuando su lista de variables se hace demasiado larga, tal vez sea un buen punto pensar en refactorizar algunas partes de la clase en una nueva clase.

En mi opinión, las variables de instancia solo son necesarias cuando los datos se utilizarán en todas las llamadas.

Aquí hay un ejemplo:

myCircle = myDrawing.drawCircle(center, radius);

Ahora permite crear imágenes de la clase myDrawing utiliza 15 funciones auxiliares para crear el objeto myCircle y cada una de esas funciones necesitará el centro y el radio. Todavía no deben establecerse como variables de instancia de la clase myDrawing. Porque nunca más serán necesarios.

Por otro lado, la clase myCircle necesitará almacenar tanto el centro como el radio como variables de instancia.

myCircle.move(newCenter);
myCircle.resize(newRadius);

Para que el objeto myCircle sepa cuál es su radio y centro cuando se realizan estas nuevas llamadas, deben almacenarse como variables de instancia, no simplemente pasarse a las funciones que las necesitan.

Entonces, básicamente, las variables de instancia son una forma de guardar el "estado" de un objeto Si una variable no es necesaria para conocer el estado de un objeto, entonces no debería ser una variable de instancia.

Y en cuanto a hacer todo público. Podría hacerte la vida más fácil en el momento. Pero volverá para atormentarte. Pease no.

En mi humilde opinión:

Si la variable forma parte del estado de la instancia, debería ser una variable de instancia: instancia de clase HAS-A instancia variable.

Si me encontraba pasando algo repetidamente a los métodos de una instancia, o si descubrí que tenía una gran cantidad de variables de instancia, probablemente intentaría ver mi diseño en caso de que me perdiera algo o hiciera una mala abstracción en alguna parte .

Espero que ayude

Por supuesto, es fácil mantener una gran lista de variables públicas en la clase. Pero incluso de forma intuitiva, puede decir que este no es el camino a seguir.

Defina cada variable justo antes de usarla. Si una variable admite la función de un método específico, úsela solo en el ámbito del método.

También piense en la seguridad, una variable de clase pública es susceptible a cambios no deseados desde "fuera". código. Su objetivo principal debe ser mantener todas las variables privadas, y cualquier variable que no lo sea, debe tener una muy buena razón para serlo.

Acerca de pasar parámetros por toda la pila, esto puede ponerse feo muy rápido. Una regla general es mantener sus firmas de método limpias y elegantes. Si ve muchos métodos que usan los mismos datos, decida si es lo suficientemente importante como para ser un miembro de la clase, y si no lo es, refactorice su código para que tenga más sentido.

Se reduce al sentido común. Piense exactamente dónde y por qué declara cada nueva variable, cuál debería ser su función y, a partir de ahí, tome una decisión con respecto al alcance en el que debería vivir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top