Normalmente un problema de mediana complejidad resuelto con la metodología de programación orientada a objetos no interviene una sola clase, sino que hay muchas clases que interactúan y se comunican.
Plantearemos un problema separando las actividades en dos clases.
Un banco tiene 3 clientes que pueden hacer depósitos y extracciones. También el banco requiere que al final del día calcule la cantidad de dinero que hay depositado.
Lo primero que hacemos es identificar las clases:
Podemos identificar la clase Cliente y la clase Banco.
Luego debemos definir los atributos y los métodos de cada clase:
Cliente atributos nombre monto métodos initialize depositar extraer Banco atributos 3 Cliente (3 objetos de la clase Cliente) métodos initialize operar depositos_totales
class Cliente attr_reader :monto def initialize(nombre) @nombre = nombre @monto = 0 end def depositar(monto) @monto = @monto + monto end def extraer(monto) @monto = @monto - monto end def imprimir puts "#{@nombre} tiene depositado la suma de #{@monto}" end end class Banco def initialize @cliente1 = Cliente.new "Juan" @cliente2 = Cliente.new "Ana" @cliente3 = Cliente.new "Diego" end def operar @cliente1.depositar 100 @cliente2.depositar 150 @cliente3.depositar 200 @cliente3.extraer 150 end def depositos_totales total = @cliente1.monto + @cliente2.monto + @cliente3.monto puts "El total de dinero del banco es: #{total}" @cliente1.imprimir @cliente2.imprimir @cliente3.imprimir end end # bloque principal banco1=Banco.new banco1.operar banco1.depositos_totales
Primero hacemos la declaración de la clase Cliente, en el método inicializate cargamos los atributos @nombre con el valor que llega como parámetro y el atributo @monto con el valor cero:
class Cliente attr_reader :monto def initialize(nombre) @nombre = nombre @monto = 0 end
Para poder acceder desde otra clase al atributo @monto llamamos a attr_reader:
attr_reader :monto
El método que aumenta el atributo @monto es:
def depositar(monto) @monto = @monto + monto end
Y el método que reduce el atributo @monto del cliente es:
def extraer(monto) @monto = @monto - monto end
Para mostras los datos del cliente tenemos el método:
def imprimir puts "#{@nombre} tiene depositado la suma de #{@monto}" end
La segunda clase de nuestro problema es el Banco. Esta clase define tres atributos de la clase Cliente (la clase Cliente colabora con la clase Banco):
class Banco def initialize @cliente1 = Cliente.new "Juan" @cliente2 = Cliente.new "Ana" @cliente3 = Cliente.new "Diego" end
El método operar realiza una serie de depósitos y extracciones de los clientes:
def operar @cliente1.depositar 100 @cliente2.depositar 150 @cliente3.depositar 200 @cliente3.extraer 150 end
El método que muestra cuanto dinero tiene depositado el banco se resuelve pidiendo a cada cliente que retorne el monto que tiene (recordemos que podemos acceder al atributo @monto del cliente gracias a que definimos en la otra clase attr_reader :monto):
def depositos_totales total = @cliente1.monto + @cliente2.monto + @cliente3.monto puts "El total de dinero del banco es: #{total}" @cliente1.imprimir @cliente2.imprimir @cliente3.imprimir end
Plantear un programa que permita jugar a los dados. Las reglas de juego son:
se tiran tres dados si los tres salen con el mismo valor mostrar un mensaje que "gano", sino "perdió".
Lo primero que hacemos es identificar las clases:
Podemos identificar la clase Dado y la clase JuegoDeDados.
Luego los atributos y los métodos de cada clase:
Dado atributos valor métodos initialize tirar imprimir JuegoDeDados atributos 3 Dado (3 objetos de la clase Dado) métodos initialize jugar
class Dado attr_reader :valor def initialize @valor = 1 end def tirar @valor = 1 + rand(6) end def imprimir puts "Valor del dado: #{@valor}" end end class JuegoDeDados def initialize @dado1 = Dado.new @dado2 = Dado.new @dado3 = Dado.new end def jugar @dado1.tirar @dado1.imprimir @dado2.tirar @dado2.imprimir @dado3.tirar @dado3.imprimir if @dado1.valor == @dado2.valor && @dado1.valor == @dado3.valor puts "Gano" else puts "Perdio" end end end # bloque principal del programa juego_dados = JuegoDeDados.new juego_dados.jugar
La clase Dado define un método tirar que almacena en el atributo valor un número aleatorio comprendido entre 1 y 6:
def tirar @valor = 1 + rand(6) end
Llamamos al método attr_reader pasando el atributo valor para tener acceso desde fuera de la clase al número que se generó
attr_reader :valor
La clase JuegoDeDados define tres atributos de la clase Dado, en el método initialize donde se crean dichos objetos:
class JuegoDeDados def initialize @dado1 = Dado.new @dado2 = Dado.new @dado3 = Dado.new end
En el método jugar de la clase JuegoDeDados procedemos a pedir a cada dado que se tire, imprima y verificamos si los tres valores son iguales:
def jugar @dado1.tirar @dado1.imprimir @dado2.tirar @dado2.imprimir @dado3.tirar @dado3.imprimir if @dado1.valor == @dado2.valor && @dado1.valor == @dado3.valor puts "Gano" else puts "Perdio" end end
En el bloque principal de nuestro programa creamos un objeto de la clase JuegoDeDados:
# bloque principal del programa juego_dados = JuegoDeDados.new juego_dados.jugar
ejercicio146.rb class Socio attr_reader :antiguedad def initialize print "Ingrese el nombre del socio:" @nombre = gets.chomp print "Ingrese la antiguedad:" @antiguedad = gets.to_i end def imprimir puts "#{@nombre} tiene una antiguedad de #{@antiguedad}" end end class Club def initialize @socio1 = Socio.new @socio2 = Socio.new @socio3 = Socio.new end def mayor_antiguedad puts "Socio con mayor antiguedad" if @socio1.antiguedad > @socio2.antiguedad && @socio1.antiguedad > @socio3.antiguedad @socio1.imprimir elsif @socio2.antiguedad > @socio3.antiguedad @socio2.imprimir else @socio3.imprimir end end end # bloque principal club = Club.new club.mayor_antiguedad