dos princípios da orientação a objetos, guardar dados sobre uma determinada enti-
dade do nosso sistema.
A melhor maneira de provermos estas informações é no momento que criamos
nossos objetos do tipo Livro. Para isso existe o método initialize que é cha-
mado toda vez que executamos o método new afim de criar um objeto.
teste_e_design = Livro.new("Mauricio Aniche", 247, "123454")
web_design_responsivo = Livro.new("Tárcio Zemel", 189, "452565")
Podemos até mesmo remover os parênteses:
teste_e_design = Livro.new "Mauricio Aniche", 247, "123454"
web_design_responsivo = Livro.new "Tárcio Zemel", 189, "452565"
30
Casa do Código
Capítulo 3. O começo da nossa aplicação
Quando criamos uma classe,
ganhamos automaticamente um método
initialize default, para que o objeto possa ter suas informações inicializadas.
Como queremos passar dados para inicializar nosso objeto de uma maneira
diferente, no caso passando o nome do autor, número de páginas e ISBN, devemos
implementar nosso próprio método initialize em nossa classe Livro:
class Livro
def initialize(autor, numero_de_paginas, isbn)
end
end
Sobrescrevemos o método initialize default, criando um método cujo
nome deve ser initialize. O método initialize é um método especial do
Ruby, invocado pelo Livro.new para criar um novo objeto. Nesse momento, o
Ruby aloca espaço em memória e depois invoca o método initialize passando
os parâmetros necessários para criar o objeto.
Agora vamos imaginar que existem alguns livros que não possuem o atributo
isbn, o natural seria omitir o valor do isbn:
teste_e_design = Livro.new "Mauricio Aniche", 247
Isso não funciona, pois para a linguagem Ruby, a aridade do método é impor-
tante, ou seja, devemos passar exatamente a quantidade de argumentos definido no
método initialize.
Se pensarmos em linguagens como Java, podemos definir um outro método
initialize que recebe apenas o nome do autor e o número de páginas, recurso
conhecido como sobrecarga :
class Livro
def initialize(autor, numero_de_paginas, isbn)
end
def initialize(autor, numero_de_paginas)
end
end
Mas isso também não funcionará, pois o interpretador do Ruby considera apenas
o último método
definido na classe. Ruby não suporta sobrecarga. Para essa situação,
a linguagem suporta o uso de argumentos com valores padrão:
31
3.1. A definição da classe Livro
Casa do Código
class Livro
def initialize(autor, numero_de_paginas, isbn = "1")
end
end
Quando declaramos o argumento isbn = "1", definimos que no momento da
inicialização dos objetos do tipo Livro, podemos omitir o último argumento:
Livro.new "Lucas Souza", 198
O valor do argumento isbn é 1.
Agora vamos inverter a ordem dos argumentos do método initialize, colo-
cando o atributo isbn antes do atributo numero_de_paginas e vamos também
imprimir os valores de cada um dos argumentos:
class Livro
def initialize(autor, isbn = "1", numero_de_paginas)
puts "Autor: #{autor}, ISBN: #{isbn}, Pág: #{numero_de_paginas}"
end
end
Livro.new "Lucas Souza", 200
E o resultado é:
Autor: Lucas Souza, ISBN: 1, Páginas: 200.
Veja que o Ruby é esperto e consegue atribuir o valor 200 ao atributo
numero_de_paginas e não ao atributo isbn. Isso ocorre porque a linguagem
Ruby possui três tipos de argumentos:
Obrigatórios;
Com valores padrão;
Opcionais.
Vimos dois deles até o momento: Obrigatório e com valores padrão. Veremos
sobre os atributos opcionais nos próximos capítulos. Mas vamos ao que interessa,
como o Ruby consegue descobrir para qual atributo deve atributo os valores da cha-
mada ao método initialize?
Quando um método recebe a chamada, o interpretador divide a atribuição dos
valores em alguns passos. Primeiro ele procura todos argumentos obrigatórios e
32
Casa do Código
Capítulo 3. O começo da nossa aplicação
associa os valores a estes, caso não encontre valor para algum destes atributos um
erro do tipo ArgumentException acontece. Em seguida, se ainda existirem valo-
res sobrando, estes são atribuídos aos argumentos default que existirem no método.
Caso sobre apenas 1 valor, e existirem dois argumentos com valores default, o Ruby
atribuirá o valor restante para o primeiro argumento com valor default.
3.2
Crie a estrutura do projeto
O código final do projeto que será construído foi disponibilizado no meu github:
https://github.com/lucasas/projeto-ruby
Agora, é importante que seja criada a estrutura básica do projeto, que facilitará a
alteração das classes que serão criadas ao longo dos capítulos. O ideal é que somente
os testes sejam feitos utilizando o IRB e todas as outras classes e códigos fiquem
dentro do projeto.
Crie uma pasta chamada loja_virtual em um diretório de sua preferência
e dentro deste diretório loja_virtual crie uma pasta chamada lib. Dentro do
diretório lib serão criados os arquivos que representam as classes do sistema, como
por exemplo, a classe Livro que podemos transferir para lá agora mesmo.
Crie um arquivo chamado livro.rb dentro da pasta lib com o conteúdo