Introdução do Ruby e OOP
O que é Ruby?
Ruby é uma linguagem de programação dinâmica de propósito geral orientada a objetos. Ela é muito utilizada para back-end com a famosa framework Ruby on Rails
Variáveis
Funcionam como em outras linguagens dinâmicas, como o Javascript e Python, simplesmente damos o nome e o valor, sem o tipo, pois é uma linguagem dinâmica:
# Em ruby, tudo o que estiver na frente de uma #(Hashtag) é comentário
a = "Rapaiz" #string
b = 10 #int
c = true #boolean
d = [1, 2, 3] #array
Ifs
Funcionam de maneira muito parecida com outras linguagens, só que não precisamos colocar os parêntesis e como não usamos os colchetes {}
pra blocos de códigos nessa linguagem e sim end
o usamos aqui também:
condicao1 = false
if condicao1
puts "condicao1: verdade"
end
#Agora com else if e else:
condicao2 = 2
if condicao2 == 1
puts "condicao2: 1"
elsif condicoa2 == 2
puts "condicao2: 2"
else
puts "condicao2: alguma outra coisa"
end
Loops
Como em outras linguagens, temos acesso aos clássicos, for
e while
, os usamos assim:
#repetir 10 vezes usando for:
for i in 0..10
puts "For: " + i.to_s()
end
#repetir 20 vezes com while
condicao = true
contWhile = 0
while condicao
puts "while: " + contWhile.to_s()
contWhile += 1
if contWhile == 20
condicao = false
end
end
Funções
Mais parecido com o python, simplesmente usamos a palavra-chave def
para definirmos funções próprias:
def algumaCoisa()
puts "Alguma coisa muito importante. Mais alguma coisa também importante. Mais alguma outra coisa, absolutamente essencial"
end
algumaCoisa()
#Agora com parâmetros
def outraCoisa(coisa)
puts "outraCoisa é " + coisa
end
outraCoisa("abobrinha")
OOP (Object oriented Programming)
Antes de aprendermos o que é OOP, precisamos entender o que é um paradigma da programação, que nada mais é do que uma maneira de escrever código, ou seja, um padrão seguido em linguagens e bibliotecas para ajudar um programador a resolver um problema, sendo o mais famoso dos paradigmas, o OOP.
OOP (Object oriented programming) é um paradigma da programação que se baseia na ideia de separar código em objetos (não se preocupe, isso ainda fará sentido). Um objeto é uma coleção de propriedades e funções que fazem sentido juntos. Por exemplo: até agora no Javascript que fizemos no navegador, nós usamos o console.log(mensagem)
para nos comunicarmos com o console do navegador certo? Bem, preste atenção no que você estava digitando, você estava falando pro console
fazer um log
com a mensagem que você definiu, você estava falando pro objeto console
executar a função log
.
Ainda não ficou muito claro? Então vamos para uns exemplos usando Ruby que mostrarão a praticidade da programação orientada a objetos na prática:
RPG com personagens, versão 1 (Sem objetos)
Observe o seguinte código, nele criamos um personagem com vários atributos usando variáveis e fazemos um puts
para criar um parágrafo descrevendo todos os atributos do personagem:
nome = "Roberto"
idade = 20
vida = 100
inteligencia = 70
forca = 10
destreza = 20
sabedoria = 40
carisma = 50
inventar\io = [ "espada", "pocao", "botas", "calcas", "chapeu", "escudo"]
puts "O " + nome + " tem " + idade.to_s() + " anos e está com " + vida.to_s() + " pontos de vida. Os atributos dele sao: " + inteligencia.to_s() + " de inteligencia, " + forca.to_s() + " de força, " + destreza.to_s() + " de destreza, " + carisma.to_s() + " de carisma. " + nome + " tem " + inventario.to_s() + " no inventário dele"
Se você executar esse código, aparecerá no console a seguinte mensagem:
O Roberto tem 20 anos e está com 100 pontos de vida. Os atributos dele sao: 70 de inteligencia, 10 de força, 20 de destreza, 50 de carisma. Roberto tem [“espada”, “pocao”, “botas”, “calcas”, “chapeu”, “escudo”] no inventário dele
Bem, o código funciona e não tem nada de errado nele, então vamos adicionar mais um personagem:
nome1 = "Rodolfo"
idade1 = 30
vida1 = 150
inteligencia1 = 80
forca1 = 20
destreza1 = 5
sabedoria1 = 50
carisma1 = 1
inventario1 = [ "Machado", "pocao", "sapato", "calcas sociais", "cartola", "camisa social"]
puts "O " + nome1 + " tem " + idade1.to_s() + " anos e está com " + vida1.to_s() + " pontos de vida. Os atributos dele sao: " + inteligencia1.to_s() + " de inteligencia, " + forca1.to_s() + " de força, " + destreza1.to_s() + " de destreza, " + carisma1.to_s() + " de carisma. " + nome1 + " tem " + inventario1.to_s() + " no inventário dele"
Se executarmos esse novo código, aparecerá além do parágrafo do nosso primeiro personagem:
O Rodolfo tem 30 anos e está com 150 pontos de vida. Os atributos dele sao: 80 de inteligencia, 20 de força, 5 de destreza, 1 de carisma. Rodolfo tem [“Machado”, “pocao”, “sapato”, “calcas sociais”, “cartola”, “camisa social”] no inventário dele
Então… a partir daqui as coisas começam a ficar meio feias. Se queremos criar um segundo personagem, repetimos bastante código e temos que modificar o nome das variáveis para que não se repitam com o do nosso primeiro personagem. E se quisermos adicionar mais personagens, mudar os atributos deles ou mudar o parágrafo gerado para cada personagem, vamos ter que modificar muito código em vários lugares. Tem que ter um jeito melhor… e tem, com OOP
RPG com personagens, versão 2 (Com classes)
Agora vamos modificar nosso código para utilizar classes, classes são basicamente modelos para objetos, eles definem o que objetos terão, o que poderemos fazer com objetos, como serão criados, etc.
class Personagem
attr_accessor :nome, :idade, :vida, :destreza, :inteligencia, :forca, :sabedoria, :carisma, :inventario
def initialize(nome, idade, vida, inteligencia, forca, destreza, carisma, inventario)
@nome = nome
@idade = idade
@vida = vida
@inteligencia = inteligencia
@forca = forca
@destreza = destreza
@carisma = carisma
@inventario = inventario
end
end
roberto = Personagem.new("Roberto", 20, 100, 70, 10, 20, 40, [ "espada", "pocao", "botas", "calcas", "chapeu", "escudo"])
rodolfo = Personagem.new("Rodolfo", 30, 150, 80, 20, 5, 50, [ "Machado", "pocao", "sapato", "calcas sociais", "cartola", "camisa social"])
Mas ainda temos um problema, precisamos fazer aquele parágrafo gigantesco para cada personagem e modificar para cada um deles. Ou usar o poder das classes:
class Personagem
#...
def falarStats()
puts "O " + self.nome + " tem " + self.idade.to_s() + " anos e está com " + self.vida.to_s() + " pontos de vida. Os atributos dele sao: " + self.inteligencia.to_s() + " de inteligencia, " + self.forca.to_s() + " de força, " + self.destreza.to_s() + " de destreza, " + self.carisma.to_s() + " de carisma. " + self.nome + " tem " + self.inventario.to_s() + " no inventário dele"
end
end
roberto = Personagem.new("Roberto", 20, 100, 70, 10, 20, 40, [ "espada", "pocao", "botas", "calcas", "chapeu", "escudo"])
rodolfo = Personagem.new("Rodolfo", 30, 150, 80, 20, 5, 50, [ "Machado", "pocao", "sapato", "calcas sociais", "cartola", "camisa social"])
roberto.falarStats()
rodolfo.falarStats()
Com esse nosso novo código o resultado será:
Roberto tem 100 pontos de vida O Roberto tem 20 anos e está com 100 pontos de vida. Os atributos dele sao: 70 de inteligencia, 10 de força, 20 de destreza, 40 de carisma. Roberto tem [“espada”, “pocao”, “botas”, “calcas”, “chapeu”, “escudo”] no inventário dele
O Rodolfo tem 30 anos e está com 150 pontos de vida. Os atributos dele sao: 80 de inteligencia, 20 de força, 5 de destreza, 50 de carisma. Rodolfo tem [“Machado”, “pocao”, “sapato”, “calcas sociais”, “cartola”, “camisa social”] no inventário dele
Tudo isso de maneira mais fácil de criar novos personagens e mudarmos como eles se comportam, basta modificar a classe em si