MOD 3 - ARGPROG - Etapa1
MOD 3 - ARGPROG - Etapa1
MOD 3 - ARGPROG - Etapa1
Apéndice
El lenguaje Ruby
Ruby es un lenguaje de Programación Orientada a Objetos gratis y de código abierto creado
en Japón. Su sintaxis amigable lo hace muy popular sobre todo en el desarrollo web; de hecho
una gran parte de la Plataforma Mumuki está desarrollada en este lenguaje.
Los objetos son entes computacionales con los que interactuaremos para resolver problemas.
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 2/23
30/8/2021 Argentina Programa
Envío de mensajes
A partir de la Lección 1: Objetos y mensajes
La manera de interactuar con los objetos es a través del envío de mensajes haciendo
objeto.mensaje :
Pepita.volar!
Pepita.comer! 20
Definición de objetos
A partir de la Lección 2: Definiendo objetos: métodos y estado
La definición de objetos en Ruby comienza anteponiendo module antes del nombre y finaliza
con end .
module Pepita
end
module Norita
end
Definición de métodos
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 3/23
30/8/2021 Argentina Programa
Para que un objeto entienda un mensaje es necesario crear un método dentro del mismo. La
definición de los métodos comienzan con def y, al igual que en la declaración de objetos,
finaliza con end . En el caso de los métodos creados dentro de un module es necesario
anteponer al nombre self. . En caso que nuestro método reciba parámetros debemos
ponerlos entre paréntesis separados por coma.
module Pepita
def self.cantar!
end
def self.volar!(distancia)
end
end
end
Interfaz
A partir de la Lección 1: Objetos y mensajes
Asignación
A partir de la Lección 2: Definiendo objetos: métodos y estado
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 4/23
30/8/2021 Argentina Programa
numero_favorito = 8
color_favorito = "Violeta"
self
Es la manera que tiene un objeto de enviarse mensajes a sí mismo; en estos casos self es el
objeto receptor del mensaje.
module Gaby
@esta_alegre = false
def self.escuchar_musica!
@esta_alegre = true
self.bailar!
end
def self.bailar!
end
end
Responsabilidad y delegación
A partir de la Lección 2: Definiendo objetos: métodos y estado
La responsabilidad, en la programación con objetos, está relacionada con qué objeto debería
resolver las determinadas partes de nuestro problema. Si un objeto no es responsable de
hacer algo lo debe delegar en el correspondiente.
Atributos
A partir de la Lección 2: Definiendo objetos: métodos y estado
Los atributos son objetos que nos permiten representar una característica de otro objeto. Un
objeto conoce a todos sus atributos por lo que puede enviarles mensajes Los atributos se
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 5/23
30/8/2021 Argentina Programa
module Pepita
@energia = 100
def self.cantar!
end
def self.ciudad=(una_ciudad)
@ciudad = una_ciudad
end
def self.volar!(distancia)
end
end
end
como argumento.
Estado
A partir de la Lección 2: Definiendo objetos: métodos y estado
El estado de un objeto es el conjunto de atributos que posee. Todos los atributos son privados,
para acceder o modificar los atributos de un objeto es necesario definir métodos dentro del
mismo.
Accessors
A partir de la Lección 3: Polimorfismo y encapsulamiento
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 6/23
30/8/2021 Argentina Programa
Los accessors son métodos que nos permiten acceder o modi car el estado de un objeto y son
conocidos como getters y setters respectivamente.
module Pepita
@energia = 100
def self.energia
@energia
end
def self.energia=(nueva_energia)
@energia = nueva_energia
end
end
Encapsulamiento
A partir de la Lección 3: Polimorfismo y encapsulamiento
module AutoDeFabi
@nafta = 200
@color = "rojo"
def self.patente
@patente
end
def self.color=(un_color)
@color = un_color
end
def self.cargar!(cantidad)
@nafta += cantidad
end
end
module Fabi
def self.pintar_auto!(un_color)
AutoDeFabi.color = un_color
end
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 7/23
30/8/2021 Argentina Programa
def self.cargar_nafta!(una_cantidad)
AutoDeFabi.cargar! una_cantidad
end
end
tiene definido un getter para su atributo @patente . Sin embargo, no define un setter ya que
tiene sentido que pueda decir su patente pero que no se pueda modificar externamente;
tiene un setter para su atributo @color ya que el objeto Fabi puede modificarlo
directamente;
no define ningún accessor para su atributo @nafta ya que en caso que Fabi desee cargar
nafta le enviará el mensaje cargar! a AutoDeFabi .
A la hora de ponerle un nombre a los métodos que definimos hay que tener en cuenta ciertas
convenciones de Ruby, es decir, algunos acuerdos entre la comunidad de personas que
programan en este lenguaje:
Los nombres de métodos que producen un cambio de estado deben finalizar con ! ;
Los nombres de métodos que retornan un valor booleano deben finalizar con ? ;
Los getters llevan el mismo nombre que el atributo que retornan pero sin el @ .
Los setters llevan el mismo nombre que el atributo que modifican, pero sin el @ y con = al
final.
module Pepita
@energia = 100
def self.energia
@energia
end
def self.energia=(nueva_energia)
@energia = nueva_energia
end
def self.volar!(distancia)
end
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 8/23
30/8/2021 Argentina Programa
def self.cansada?
@energia < 10
end
end
Alternativa Condicional
A partir de la Lección 3: Polimorfismo y encapsulamiento
La alternativa condicional en Ruby comienza con if seguido por la condición y termina con
end :
if Pepita.aburrida?
Pepita.volar! 10
end
if Norita.hambrienta?
else
Norita.volar! 15
end
A diferencia de otros lenguajes, en Ruby podemos hacer elsif en caso de tener un if dentro
de un else :
if Cleo.cansada?
Cleo.descansar!
elsif Cleo.aburrida?
Cleo.leer!
else
Cleo.trabajar!
end
Polimorfismo
A partir de la Lección 3: Polimorfismo y encapsulamiento
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 9/23
30/8/2021 Argentina Programa
polimórficos cuando comparten una interfaz. Para que estemos ante un caso de polimorfismo
es necesaria la presencia de al menos tres objetos: uno que envíe el mensaje y dos distintos
que puedan entenderlo. Veámoslo en un ejemplo:
Supongamos que Agus puede realizar llamadas por celular enviandole un mensaje llamar!
con un parámetro minutos a su atributo @celular :
module Agus
def self.celular=(un_celular)
@celular = un_celular
end
def self.realizar_llamada!(minutos)
@celular.llamar! minutos
end
end
El celular que Agus utiliza puede ser tanto su CelularPersonal como su CelularLaboral :
module CelularPersonal
@saldo = 200
def self.llamar!(minutos)
@saldo -= minutos
end
end
module CelularLaboral
@minutos_consumidos = 0
def self.llamar!(minutos)
@minutos_consumidos += minutos
end
end
Referencias
A partir de la Lección 4: Referencias
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 10/23
30/8/2021 Argentina Programa
las variables
dia = "domingo"
dia.upcase
"insomnio".upcase
module Pepita
def self.cantar!
end
end
Pepita.cantar!
los atributos
module Pepita
@ciudad = GeneralLasHeras
def self.coordenadas
@ciudad.coordenadas
end
end
los parámetros
module Guille
@paginas_leidas
def self.leer!(libro)
end
end
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 11/23
30/8/2021 Argentina Programa
end
Colecciones
Las colecciones son objetos que contienen referencias a otros objetos. Un tipo de colección
son las listas, las cuales se escriben entre corchetes ( [] ) y permiten tener objetos repetidos
con un orden determinado dentro de ellas:
libros = [Fundacion, Socorro, Elevacion, Kriptonita, Socorro]
Otro tipo de colecciones muy común son los sets, los cuales a diferencia de las listas no pueden
tener elementos repetidos y sus elementos no tienen un orden determinado:
numeros_aleatorios = [1,27,8,7,8,27,87,1]
numeros_aleatorios
=> [1,27,8,7,8,27,87,1]
numeros_aleatorios.to_set
Bloques de código
A partir de la Lección 5: Colecciones
Los bloques son objetos que representan un mensaje o una secuencia de envíos de mensajes,
sin ejecutar, lista para ser evaluada cuando corresponda.
anio_actual = 2021
Estos bloques de código pueden tomar parámetros escritos entre || separados por comas.
saludador = proc { |saludo, nombre| saludo + " " + nombre + ", que lindo día para p
rogramar, ¿no?" }
Dentro de cada bloque podemos usar y enviarle mensajes tanto a los parámetros del bloque
( saludo y nombre ) como a las variables declaradas fuera del mismo ( anio_actual ).
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 12/23
30/8/2021 Argentina Programa
Por último, para ejecutar el código dentro del bloque debemos enviarle el mensaje call con
los argumentos correspondientes.
anio_nuevo.call
=> 2022
saludador.call("Hola", "Jor")
Clases e instancias
A partir de la Lección 6: Clases e Instancias
Las clases son objetos que sirven de moldes para crear nuevos objetos que tienen el mismo
comportamiento.
Por ejemplo, si tuvieramos dos perros representados con los objetos Firulais y Stimpy :
class Firulais
@energia = 200
def self.jugar!(un_tiempo)
@energia -= un_tiempo
end
def recibir_duenio!
@energia += 100
end
end
class Stimpy
@energia = 300
def self.jugar!(un_tiempo)
@energia -= un_tiempo
end
def recibir_duenio!
@energia += 100
end
end
Podemos ver que tienen el mismo comportamiento. Para poder solucionar esta repetición
podríamos crear la clase Perro :
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 13/23
30/8/2021 Argentina Programa
class Perro
def initialize(energia)
@energia = energia
end
def jugar!(un_tiempo)
@energia -= un_tiempo
end
def recibir_duenio!
@energia += 100
end
end
El método initialize de las clases permite especificar cómo se inicializan las instancias de
una clase. En este método declararemos los valores iniciales de los atributos. Por último para
crear nuestros objetos debemos hacer:
firulais = Perro.new 200
Estos nuevos objetos creados a partir de una clase ( firulais y stimpy ) son instancias de la
misma. Es importante tener en cuenta que:
Herencia
A partir de la Lección 7: Herencia
Cuando dos objetos repiten lógica, creamos una clase con el comportamiento en común. En el
caso que dos clases repitan lógica deberíamos crear una nueva clase a la cual llamamos
superclase. A esta nueva clase llevaremos los métodos repetidos y haremos que las clases
originales hereden de ella. Estas subclases que heredan de la superclase solo contendrán su
comportamiento particular.
class Gato
def initialize(energia)
@energia = energia
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 14/23
30/8/2021 Argentina Programa
end
def jugar!(un_tiempo)
@energia -= un_tiempo
end
def recibir_duenio!
@energia -= 10
end
end
class Perro
def initialize(energia)
@energia = energia
end
def jugar!(un_tiempo)
@energia -= un_tiempo
end
def recibir_duenio!
@energia += 100
end
end
class Mascota
def initialize(energia)
@energia = energia
end
def jugar!(un_tiempo)
@energia -= un_tiempo
end
end
Por último es necesario hacer que las clases Gato y Perro hereden de Mascota utilizando < :
class Gato < Mascota
def recibir_duenio!
@energia -= 10
end
end
def recibir_duenio!
@energia += 100
end
end
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 15/23
30/8/2021 Argentina Programa
En nuestra nueva jerarquía Mascota es una superclase de la cual heredan las subclases Gato y
Perro .
Redefinición
A partir de la Lección 7: Herencia
class Gallina < Mascota
def jugar!(un_tiempo)
@energia -= 5
end
def recibir_duenio!
@energia *= 2
end
end
Clases abstractas
A partir de la Lección 7: Herencia
Las clases abstractas son clases que no se desea instanciar. Sirven para abstraer la lógica
repetida de otras clases pero no las usaremos como molde de otros objetos. En contraposición,
aquellas que sí instanciaremos son las llamadas clases concretas. En el ejemplo anterior
Mascota es una clase abstracta mientras que Gato y Perro son clases concretas.
super
super nos permite redefinir un método pero sólo agregar una parte nueva a la funcionalidad,
reutilizando la lógica común que está definida en la superclase. Al utilizar super en el método
de una subclase, se evalúa el método con el mismo nombre de su superclase.
Por ejemplo:
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 16/23
30/8/2021 Argentina Programa
class Pichicho < Perro
def recibir_duenio!
super
self.ladrar!
end
end
Excepciones
A partir de la Lección 8: Excepciones
Una excepción es una indicación de que algo salió mal. Cuando lanzamos una excepción
provocamos un error explícito que interrumpe el flujo de nuestro programa. La excepción no
solo aborta el método en el cual la lanzamos sino también la ejecución de todos los métodos de
la cadena de envío de mensajes pero no descarta los cambios realizados anteriormente; es por
este motivo que es importante saber en qué momento debemos hacerlo. Por último, para
lanzar excepciones utilizaremos raise con un mensaje expresivo para entender por qué se
interrumpió el flujo.
raise "No se puede realizar esta acción"
Operadores
Operadores matemáticos
A partir de la Lección 1: Objetos y mensajes
8 + 7
32 - 9
2 * 3
4 / 2
Operadores lógicos
A partir de la Lección 1: Objetos y mensajes
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 17/23
30/8/2021 Argentina Programa
true && false
true || false
! false
Comparaciones
A partir de la Lección 1: Objetos y mensajes
Pepita == Norita
"ser" != "estar"
7 >= 5
7 > 5
7 <= 5
7 < 5
Metodos usuales
A lo largo del capítulo "Programación con Objetos" utilizamos algunos métodos en la
resolución de ejercicios. A continuación te los listamos en el orden que aparecen.
numero.abs
8.abs
=> 8
(-8).abs
=> 8
(3 - 7).abs
=> 4
numero.times bloque
Pepita.energia = 5
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 18/23
30/8/2021 Argentina Programa
Pepita.energia
=> 40
string.upcase
"libro".upcase
=> "LIBRO"
string.size
"camino".size
=> 6
numero.even?
Lección 4: Referencias
Nos permite saber si numero es par.
8.even?
=> true
7.even?
=> false
objeto.equal? otro_objeto
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 19/23
30/8/2021 Argentina Programa
un_string = "lamparita"
otro_string = un_string
un_string.equal? "lamparita"
=> false
un_string.equal? otro_string
=> true
coleccion.push elemento
numeros_de_la_suerte = [8, 7, 42]
numeros_de_la_suerte.push 9
numeros_de_la_suerte
coleccion.delete elemento
numeros_de_la_suerte = [8, 7, 42]
numeros_de_la_suerte.delete 7
numeros_de_la_suerte
coleccion.include? elemento
[25, 87, 776].include? 8
=> true
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 20/23
30/8/2021 Argentina Programa
=> false
coleccion.size
["hola", "todo", "bien", "por", "acá"].size
=> 5
coleccion.select bloque_con_condicion
[1, 2, 3, 5, 7, 11, 13].select { |un_numero| un_numero > 5 }
coleccion.find bloque_con_condicion
[1, 2, 3, 5, 7, 11, 13].find { |un_numero| un_numero > 15 }
=> nil
coleccion.all? bloque_con_condicion
[1, 2, 3, 5, 7, 11, 13].all? { |un_numero| un_numero > 5 }
=> false
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 21/23
30/8/2021 Argentina Programa
=> true
coleccion.map bloque
[1, 2, 3, 4, 5].map { |un_numero| un_numero * 2 }
coleccion.count bloque_con_condicion
[1, 2, 3, 5, 7, 11, 13].count { |un_numero| un_numero > 3 }
=> 4
coleccion.sum bloque
juegos_de_mesa = [Ajedrez, Damas, Ludo]
coleccion.each bloque
retorna una nueva colección sino que tiene efecto sobre la original.
golondrinas = [Pepita, Norita, Mercedes]
Clase.new
guitarra = Instrumento.new
piano = Instrumento.new
Bibliografía complementaria
http://rubysur.org/aprende.a.programar/capitulos/acerca.html
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_Ruby
https://poignant.guide/ (en inglés)
© 2015-2021
Mumuki
Información importante
Términos y Condiciones
Reglas del Espacio de Consultas
https://mumuki.io/argentina-programa/chapters/532-programacion-con-objetos/appendix 23/23