Ruby: ¿cuándo usar variables de instancia versus parámetros entre métodos?

8

Estoy escribiendo varios métodos que llaman a otros métodos.

Para pasar la información, tengo un par de opciones:

  1. Pase la información como parámetros

  2. Establecer variables de instancia para que otros métodos puedan acceder a ellas

¿Cuándo debo elegir una opción sobre la otra?

Parece que la primera opción es buena, ya que es muy específica sobre lo que se está pasando. La desventaja parece ser que se están pasando muchos valores.

El segundo método no requiere pasar todos los valores, pero parece conducir a una gran cantidad de magia donde los métodos establecen variables de instancia 'en algún lugar'

¿Debería ser siempre muy explícito acerca de cómo se pasa a otros métodos en la clase? ¿Hay excepciones así que esto?

Michael Durrant
fuente
2
Muchas veces he tenido la oportunidad de hacer cambios o corregir un error en algún código que alguien ha escrito usando la opción # 2. Por lo general, es un desastre enredado y los cambios llevan mucho tiempo. Incluso una vez que lo tengo todo resuelto, todavía se necesita mucho esfuerzo mental para hacer cambios porque tengo que mantenerme derecho exactamente cuándo y dónde se inicializan o actualizan las variables.
Aprendiz del Dr. Wily

Respuestas:

12

Depende del papel de esas variables con respecto a toda la clase .

Si su clase es pequeña y la información que estas variables transportan es relevante para todo o casi todo, entonces tiene sentido tenerlas como variables de instancia. Un objeto de cuenta bancaria probablemente necesita conocer a su titular para la mayoría de las acciones de todos modos, por lo que tiene sentido retenerlo indefinidamente.

Si los datos son muy específicos para este método y sus ayudantes, entonces deben viajar como parámetros. La fecha de una transacción no es tanto una característica de la cuenta como una sola acción tomada en esa cuenta. (Si tiene más de uno de estos parámetros, y tienden a pasarse como unidad (por ejemplo, fecha, hora del día y zona horaria), también es aconsejable agruparlos en un objeto auxiliar para mantener el número de parámetros abajo.)

Kilian Foth
fuente
14

Permítame citarlo erróneamente para aclarar mi punto

Estoy escribiendo varias funciones que llaman a otras funciones. Para pasar la información tengo dos opciones:

  1. Pase la información como argumentos.
  2. Utiliza variables globales.

¿Cuándo debo elegir una opción sobre la otra?

En general, se reconoce que el estado no local es una mala idea. Por lo tanto, generalmente debe pasar la información utilizando parámetros, no a través de variables en un ámbito común. Esto se vuelve más manejable si agrupa información relacionada en objetos o estructuras.

Pasar demasiados parámetros es un olor a código, y probablemente se pueda refactorizar para usar algunas clases más. Suponga un caso patológico en el que está escribiendo una libreta de direcciones y tiene un método add_contact(surname, firstname, fullname, ...). Sería mejor que al grupo en una Nameclase, lo mismo para partes de una dirección: add_contact(name, address).

Sin embargo, si los parámetros necesarios para su función no tienen relación alguna, es posible que su método esté tratando de hacer demasiado y que se deba refactorizar en partes más pequeñas.

No creo que usar variables de instancia sea una buena solución: es una mutación innecesaria del estado y trae consigo todos los problemas de las variables globales, en una escala menor. De esta manera se encuentra el código de espagueti no depurable.

amon
fuente