Uso de atributos con Ruby

mira cualquieracódigo orientado a objetosy todo sigue más o menos el mismo patrón. Cree un objeto, llame a algunos métodos en ese objeto y acceda a los atributos de ese objeto. No hay mucho más que puedas hacer con un objeto excepto pasarlo como un parámetro al método de otro objeto. Pero lo que nos preocupa aquí son los atributos.





Los atributos son como variables de instancia puede acceder a través de la notación de punto de objeto. Por ejemplo, person.name accedería al nombre de una persona. Del mismo modo, a menudo puede asignar a atributos como persona.nombre = 'Alicia' . Esta es una característica similar a las variables miembro (como en C++), pero no es exactamente lo mismo. Aquí no sucede nada especial, los atributos se implementan en la mayoría de los lenguajes usando 'captadores' y 'configuradores', o métodos que recuperan y configuran los atributos de las variables de instancia.

Ruby no hace una distinción entre captadores y definidores de atributos y métodos normales. Debido a la sintaxis de llamada de método flexible de Ruby, no es necesario hacer ninguna distinción. Por ejemplo, person.name y person.name() son lo mismo, estás llamando a la nombre método con cero parámetros. Uno parece una llamada a un método y el otro un atributo, pero en realidad ambos son lo mismo. Ambos están llamando al nombre método. De manera similar, cualquier nombre de método que termine en un signo igual (=) se puede usar en una tarea. La declaración persona.nombre = 'Alicia' es realmente lo mismo que persona.nombre=(alicia) , a pesar de que hay un espacio entre el nombre del atributo y el signo igual, sigue llamando al nombre= método.



01 de 03

Implementación de atributos usted mismo

cicatrizarse, de, mujer

Andreas Larsson/Imágenes en folio/Imágenes Getty

Puede implementar fácilmente los atributos usted mismo. Al definir los métodos setter y getter, puede implementar cualquier atributo que desee. Aquí hay un código de ejemplo que implementa el nombre atributo para una clase de persona. Almacena el nombre en un @nombre variable de instancia, pero el nombre no tiene que ser el mismo. Recuerde, no hay nada especial en estos métodos.



|_+_|

Una cosa que notará de inmediato es que esto es mucho trabajo. Es mucho escribir solo para decir que desea un atributo llamado nombre que accede a la @nombre Instancia variable. Afortunadamente, Ruby proporciona algunos métodos convenientes que definirán estos métodos por usted.

02 de 03

Usando attr_reader, attr_writer y attr_accessor

Hay tres métodos en el Módulo clase que puede usar dentro de sus declaraciones de clase. Recuerde que Ruby no hace distinción entre el tiempo de ejecución y el 'tiempo de compilación', y cualquier código dentro de las declaraciones de clase no solo puede definir métodos sino también llamar a métodos. llamando al attr_reader, attr_writer y attr_accessor los métodos, a su vez, definirán los setters y getters que estábamos definiendo en la sección anterior.

los attr_lector al método le gusta lo que parece que hará. Toma cualquier número de parámetros de símbolo y, para cada parámetro, define un método 'captador' que devuelve la variable de instancia del mismo nombre. Entonces, podemos reemplazar nuestro nombre método en el ejemplo anterior con attr_reader :nombre .

Del mismo modo, el attr_writer method define un método 'setter' para cada símbolo que se le pasa. Tenga en cuenta que el signo igual no necesita ser parte del símbolo, solo el nombre del atributo. Podemos reemplazar el nombre= método del ejemplo anterior con una llamada a attr_writier :nombre .



Y, como era de esperar, attr_accesorio hace el trabajo de ambos attr_writer y attr_lector . Si necesita tanto un setter como un getter para un atributo, es una práctica común no llamar a los dos métodos por separado y, en su lugar, llamar attr_accesorio . Podríamos reemplazar ambas cosas la nombre y nombre= métodos del ejemplo anterior con una sola llamada a attr_accessor :nombre .

|_+_| 03 de 03

¿Por qué definir setters y getters manualmente?

¿Por qué debería definir setters manualmente? ¿Por qué no usar el attr_* métodos cada vez? Porque rompen la encapsulación. La encapsulación es el principio que establece que ninguna entidad externa debe tener acceso sin restricciones al estado interno de su objetos . Se debe acceder a todo mediante una interfaz que evite que el usuario corrompa el estado interno del objeto. Usando los métodos anteriores, hemos perforado un gran agujero en nuestra pared de encapsulación y permitimos que se configure absolutamente cualquier cosa para un nombre, incluso nombres obviamente no válidos.



Una cosa que verás a menudo es que attr_lector se usará para definir rápidamente un getter, pero se definirá un setter personalizado ya que el estado interno del objeto a menudo quiere ser leer directamente del estado interno. Luego, el setter se define manualmente y realiza comprobaciones para asegurarse de que el valor que se establece tiene sentido. O, quizás más comúnmente, no se define ningún setter en absoluto. Los otros métodos en la función de clase establecen la variable de instancia detrás del captador de alguna otra manera.

Ahora podemos agregar un años e implementar adecuadamente un nombre atributo. los años El atributo se puede establecer en el método constructor, leer usando el años getter pero solo manipulado usando el tener_cumpleaños método, que incrementará la edad. los nombre El atributo tiene un getter normal, pero el setter se asegura de que el nombre esté en mayúsculas y tenga la forma de Nombre Apellido .



|_+_|