Estoy escribiendo varios métodos que llaman a otros métodos.
Para pasar la información, tengo un par de opciones:
Pase la información como parámetros
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?
object-oriented
ruby
parameters
Michael Durrant
fuente
fuente
Respuestas:
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.)
fuente
Permítame citarlo erróneamente para aclarar mi punto
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 unaName
clase, 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.
fuente