Portanto, não deixe dúvidas para trás, se preciso, volte e leia novamente partes
que você julga necessário antes de prosseguirmos.
25
Capítulo 3
O começo da nossa aplicação
Nos capítulos anteriores, aprendemos algumas funcionalidades básicas da lingua-
gem Ruby. E, como já vimos, uma das suas principais características é ser orientada
a objetos. Neste capítulo focaremos na criação de classes, métodos e objetos usando
todo o poder que a linguagem nos proporciona.
Começaremos construindo uma aplicação que servirá de base para os próximos
capítulos do livro. Portanto, é interessante que você faça os códigos e entenda os
conceitos explicados neste capítulo.
Existem vários assuntos que poderíamos abordar e neste livro construiremos
uma aplicação para controlar uma loja de livros. Controlaremos o seu estoque, quais
são os clientes da loja, faremos algumas vendas e guardaremos todas estas informa-
ções em disco, utilizando a API de arquivos do Ruby.
A grande pergunta que sempre fica quando criamos uma aplicação é: por onde
começar? Temos muitas opções. Podemos iniciar o desenvolvimento pelo domínio
(criando classes), pela interface do usuário, pelo banco de dados e assim por diante.
No nosso caso, começaremos desenvolvendo as classes de domínio da aplicação.
3.1. A definição da classe Livro
Casa do Código
3.1
A definição da classe Livro
Se vamos construir uma aplicação que gerencia uma loja de livros, precisamos man-
ter os dados dos nossos livros em algum lugar. Pensando brevemente neles, teremos:
nome = "Linguagem Ruby"
isbn = "123-45678901-2"
numero_paginas = 245
preco = 69.90
Todos os livros da nossa loja estão com um desconto pré-definido:
desconto = 0.1
Agora precisamos saber qual é o preço do nosso livro com desconto. Uma conta
bem simples pode nos devolver qual o valor com o desconto:
nome = "Linguagem Ruby"
isbn = "342-65675756-1"
numero_paginas = 245
preco = 69.90
desconto = 0.1
preco_com_desconto = preco - (preco * desconto)
O problema deste código, todo espalhado, é que, quando precisarmos calcular
o desconto de qualquer livro, teremos que repetir a mesma operação. Se em algum
momento esta lógica tiver que ser alterada, vamos ter que mudar em N lugares do
nosso código.
Podemos voltar um pouco no tempo e imitar as antigas e clássicas funções que
temos em linguagens como C.
def preco_com_desconto(preco, desconto)
preco - (preco * desconto)
end
Agora, toda vez que precisarmos efetuar o cálculo do preço com desconto, cha-
mamos a função preco_com_desconto passando o preco e o desconto:
nome = "Linguagem Ruby"
isbn = "342-65675756-1"
28
Casa do Código
Capítulo 3. O começo da nossa aplicação
numero_paginas = 245
preco = 69.90
desconto = 0.1
puts preco_com_desconto(preco, desconto) # => 62.90
Caso haja necessidade de alterar algum outro livro, devemos criar as va-
riáveis referentes as informações deste outro livro e então chamar o método
preco_com_desconto para sabermos qual o novo valor:
nome = "Test Driven Development: Teste e Design no Mundo Real"
isbn = "342-65675751-1"
numero_paginas = 212
preco = 89.90
desconto = 0.1
puts
preco_com_desconto(preco, desconto) # => 80.90
O que temos aqui é um típico caso onde os dados e a sua manipulação estão
separados, quando deveriam estar juntos. Esse é um dos princípios por trás da Ori-
entação à Objetos, unir dados e a manipulação dos mesmos, encapsulando o acesso.
A maneira de fazermos isso é colocando este código dentro de uma classe e repre-
sentar cada um dos livros da nossa loja como uma instância desta classe.
Para criar classes usando Ruby, basta usar a palavra reservada class e delimitar
o final da sua classe com a palavra reservada end.
class Livro
end
29
3.1. A definição da classe Livro
Casa do Código
Constantes
O nome de uma classe deve obrigatoriamente começar com uma letra
maiúscula e as outras minúsculas. Por exemplo: Livro. Repare que o
nome Livro não é uma String, já que não está entre aspas ou den-
tro do delimitador de String. O nome Livro é uma constante, que
definimos quando criamos a nossa classe.
Todos os tipos existentes no Ruby como String, Integer, Time
etc, são constantes.
Caso o nome da sua constante seja composto, usamos a notação camel
case, por exemplo: UnidadeDeEstoque.
O que criamos foi uma abstração de um Livro ou seja, um template que dirá do
que um livro é composto. A partir da classe, que é o template, precisamos criar um
novo livro, onde poderemos dizer quais são suas características, como título, isbn,
autor e assim por diante. Para criarmos cada um, usaremos a palavra new:
teste_e_design = Livro.new
web_design_responsivo = Livro.new
Quando usamos o new em uma classe, estamos criando uma instância dela (di-
zemos também que estamos criando um objeto daquele tipo). No código anterior,
criamos duas instâncias e as referenciamos através das variáveis teste_e_design
e web_design_responsivo. Nós não provemos nenhum tipo de informação so-
bre estes livros, como o nome do autor, isbn, quantidade de páginas etc. Esse é um