jueves, 16 de febrero de 2012

Objetos en Ruby

El lenguaje de programación Ruby contempla el paradigma de la orientación a objetos, la cual encapsula o abstrae la programación en módulos llamados objetos, simulando los objetos del mundo real, los cuales tienen unas características (propiedades) y realizan acciones (métodos).

Todo parte de una clase, que define el molde de cualquier objeto de esa especie. Una vez definida la clase, se crean objetos o instancias de dicha clase, con entidad propia. Por ejemplo, una clase Vehiculo define las propiedades y métodos comunes a todo tipo de vehículo. Un objeto coche es una instancia de la clase Vehiculo.

El siguiente ejemplo ilustra estos conceptos. Crearemos el archivo Vehiculo.rb con el siguiente código:


Entre las línea 1 y 28 se define la clase Vehiculo. El método initialize es un método constructor, el cual se ejecuta automáticamente cuando se crea el objeto. En este caso asigna las propiedades que se pasan por parámetro.

Las variables propias de la clase se diferencian de las pasadas por parámetro, en que les antecede el símbolo @ (ampersand)

Se han definido las acciones arrancar y apagar, las cuales cambian el valor de la propiedad encendido, y muestran un mensaje con el resultado de la acción.

El método to_s es similar al toString() de Java, el cual se utiliza para extraer los valores de las propiedades clave del objeto, retornando un String con dichos valores.

Las líneas 31 y 40 son clave, pues crean los objetos (variables) coche y moto a través del método new, pasando los valores correspondientes al constructor (número de ruedas y color). El acceso a los métodos de un objeto se realiza mediante el nombre de la variable (u objeto), seguido de un punto y del nombre del método.

Las líneas 37 y 49 asignan el valor nil a los objetos. Con esto se asigna un valor nulo y pasan al colector de basura, destruyendo el objeto y liberando memoria.

La línea 47 visualiza todos los métodos del objeto coche. Además de initializearrancarapagar to_s estarán definidos, por defecto, otros métodos comunes a cualquier objeto que se cree en Ruby. Si la clase definida hubiese heredado o implementara alguna interfaz, los métodos de la clase padre o de la interfaz, también se heredarían.

Existe un método especial llamado object_id, el cual hereda cualquier objeto, y que retorna el código o identificador único del objeto, como instancia única. Por ejemplo, si se crearan los objetos coche1, coche2 y coche3, al acceder a su object_id, éste será distinto. Una instancia es una entidad o existencia única, como lo puede ser físicamente un coche o una persona.

Al igual que en otros lenguajes de programación orientados a objetos, es posible definir el acceso a sus miembros (métodos y propiedades). Por defecto, son públicos, es decir, que se pueden acceder desde cualquier lugar.

Los miembros protegidos (protected) pueden ser accedidos desde clases del mismo paquete.

Los miembros privados (private) sólo pueden ser accedidos desde métodos definidos dentro de la propia clase.

La definición del acceso sería la siguiente:

class Clase


   def metodo
      # Por defecto es público
   end


   # A partir de aqui el acceso es protegido
   protected


   def metodo1
      # Acceso protegido
   end


   # A partir de aqui el acceso es privado
   private


   def metodo2
      # Acceso privado
   end
end