Programação orientada a objetos - Aula 14A - Aprendendo a programar com Ruby: O Básico para iniciantes

:warning: Material da aula 14.A! Veja mais informações sobre o curso e a lista completa das aulas em: http://cursoprogramacao.rafaelbiriba.com/ :warning:

14.A. Programação orientada a objetos

Nessa aula eu faço uma breve introdução a programação orientada a objetos. Explicando o conceito com exemplos. Também abordo classes e instâncias, além de métodos de classe e métodos de instâncias.

Não deixe de tentar resolver os exercícios da aula e investir algum tempo estudando mais sobre o assunto.

Vídeo da aula

Conteúdo da aula

  • Programação orientada a objetos

  • Classes e instâncias

  • Métodos de classe

  • Métodos de instância

Programação orientada a objetos

A orientação a objetos é um paradigma de programação que considera cada instância de um objeto de forma única, de acordo com as suas características.

O Ruby é considerado uma linguagem orientada a objetos, visto que tudo é considerado um objeto, até mesmo os tipos básicos da linguagem.

Exemplo prático: Quando você vai comprar uma pizza, ela pode ser de muitos sabores diferentes. Nesse caso Pizza seria a classe. Ela possui métodos/atributos para dizer se tem azeitona ou não, o tipo de queijo e etc.

Se você pega 2 caixas de pizzas no mercado, mesmo que sejam do mesmo sabor, elas não vão ser as mesmas pizzas. Elas podem ter as mesmas características, porém dentro da caixa, elas são duas pizzas diferentes.

Em casa, você pode remover o queijo de uma das pizzas, e isso não vai afetar a outra pizza.

Na orientação a objeto, o mesmo conceito é aplicado. Você tem classes (como a Pizza) e você tem as instâncias dessa classe (como a Pizza de mussarela e Pizza de peperoni).

Trazendo esse conceito para o Ruby:

"Rafael".size #6
"Oi".size #2

Dessa forma "Rafael" e "Oi" são da classe String, porém são duas instâncias diferentes, possuem valores diferentes e por isso que o método size retorna valores diferentes.

Tudo no Ruby são objetos

nome = "Rafael"
nome.size # 6
nome.split("") # ["R", "a", "f", "a", "e", "l"]
nome.class # String
nome.object_id # 200

nome = "Rodrigo"
nome.object_id # 220

# Textos iguais tem IDs diferentes, pois são instâncias diferentes.
"Rafael".object_id
"Rafael".object_id
"Rafael".object_id

Classe e Instancias

class Pizza
end
class Pizza
end

Pizza.new # Cria uma nova instancia da classe Pizza

pizza1 = Pizza.new # Cria uma nova instancia da classe Pizza e atribui pra variável pizza1
pizza1.object_id

pizza2 = Pizza.new # Cria uma nova instancia da classe Pizza e atribui pra variável pizza2
pizza2.object_id

Pizza.new.object_id # Vai sempre ter IDs diferentes, pois são novas instâncias

Métodos de classe e métodos de instância

# Métodos de classe

class Pizza
  def self.tem_gluten?
    true
  end
end

Pizza.tem_gluten? # true
# Métodos de classe

class Pizza
  def self.nome
    "Pizza de #{sabor}"
  end

  def self.sabor
    "mussarela"
  end
end

Pizza.nome # "Pizza de mussarela"
# Métodos de instância

class Pizza
  def tem_gluten?
    true
  end
end

Pizza.tem_gluten? # (undefined method `tem_gluten?' for Pizza:Class)
Pizza.new.tem_gluten? #true
# Métodos de instância

class Pizza
  def tem_gluten?
    true
  end

  def gluten_info
    if tem_gluten?
      "Tem glúten!"
    end
  end
end

pizza = Pizza.new
pizza.tem_gluten? # true
pizza.gluten_info # Tem glúten!
# Métodos de classe com métodos de instância

class Pizza
  def tipo_de_queijo
    "Mussarela"
  end

  def self.tempo_de_preparo
    5
  end
end

Pizza.tempo_de_preparo # 5
Pizza.tipo_de_queijo # undefined method `tipo_de_queijo`

pizza = Pizza.new # Cria uma instância
pizza.tipo_de_queijo? # Mussarela
pizza.tempo_de_preparo # undefined method `tempo_de_preparo' for #<Pizza:0x00007fdf07942378>)

pizza.class # Pizza
pizza.class.tempo_de_preparo # 5

Mais exemplos

class Carro
  def self.km_por_litro(km, litros)
    "#{km / litros} km/l"
  end
end

Carro.km_por_litro(125.0, 8.0) # 15.625 km/l
class Carro
  def self.consumo
    12
  end

  def self.calculo_abastecimento(km)
    "Você precisa abastecer #{km / consumo} litros"
  end
end

Carro.calculo_abastecimento(245.0) # "Você precisa abastecer 20.416666666666668 litros"

Exercícios

1.

Considerando o código abaixo:

# Colocar a classe Calculadora aqui em cima!

puts Calculadora.ao_quadrado(3)

Criar uma classe chamada Calculadora e um método chamado ao_quadrado, que calcule o valor quadrado de um número.

2.

Considerando o código abaixo:

# Colocar a classe Carro aqui em cima!

  carro1 = CarroAzul.new
  carro2 = CarroPreto.new
  carro3 = CarroBranco.new

  [carro1, carro2, carro3].each do |carro|
    puts carro.cor
  end

  # Azul
  # Preto
  # Branco

Implemente 3 diferentes classes CarroAzul, CarroPreto, CarroBranco. Essas 3 classes, vão ter o mesmo método de instância cor retornando a respectiva cor.

3.

Utilizando classes, implementar o exercício 2 da aula 13A, calculando o IMC de cada paciente.

Considerando o código abaixo:

# Colocar a classe Imc aqui em cima!

Imc.calcular(200.2, 1.75, "Mario")
Imc.calcular(65.6, 1.65, "Roberta")
Imc.calcular(79.7, 1.77, "Pedro")
Imc.calcular(35.3, 1.60, "Ana")

Escreva a uma classe Imc que implemente o método calcular que calcula o imc de cada paciente e imprime o resultado.

Nota: Formula do IMC: Peso / (Altura metros * Altura metros)

IMC:
<18.5 - Abaixo do peso
18.5 ~ 24.99 - Normal
> 25 - Acima do peso
> 30 - Obeso

4.

Utilizando classes, implementar o exercício 3 da aula 13A, para buscar telefones em um agenda telefonica.

Os dados são:

[{nome: "Rafael", telefone: "5566"}, {nome: "Rodolfo", telefone: "9988"}, {nome: "Romário", telefone: "2299"}, {nome: "Ana", telefone: "1634"}, {nome: "Rodrigo", telefone: "9533"}]

Considerando o código abaixo:

# Colocar a classe Agenda aqui em cima!

puts Agenda.dados
puts Agenda.procurar_numero("Rodrigo")
puts Agenda.procurar_numero("Ana")
  • Agenda.dados deve retornar o array de dados (disponível acima)

  • Agenda.procurar_numero deve retornar o número de uma pessoa na agenda


Correção dos exercícios


Comments & Social
comments powered by Disqus