1.4 - Criação do seu ambiente
4.17 - Exercício M04-E01
Objetivos
- Aplicar conceitos básicos de Programação Orientada a Objetos (POO) usando a linguagem Ruby:
- Classes
- Métodos e variáveis de instância
- Encapsulamento com getters e setters (accessors)
- Constantes
Instruções
Nos exercícios deste módulo, você irá modificar e extender o código de um sistema de e-commerce simplificado de uma loja fictícia, a SimpleStore.
Configuração do projeto
-
Crie o diretório
~/ep/exercicios/m4para a resolução dos exercícios deste módulo. -
Baixe o código da SimpleStore com os comandos abaixo:
curl https://infosimples.github.io/estagio-em-programacao/assets/supplies/m04/simple_store.zip -o ~/ep/exercicios/m4/simple_store.zip unzip ~/ep/exercicios/m4/simple_store.zip -d ~/ep/exercicios/m4/ rm ~/ep/exercicios/m4/simple_store.zip -
Verifique se o projeto foi baixado corretamente executando o seguinte comando no terminal:
tree ~/ep/exercicios/m4/simple_storeA saída deverá ser parecida com a figura abaixo:
-
Configure as gems de Ruby do projeto executando os comandos abaixo:
cd ~/ep/exercicios/m4/simple_store bundle install
Exercícios
-
Crie uma nova classe, com nome
Product, no projeto. Para fazer isso, siga os seguintes passos:-
Crie um arquivo chamado
product.rbdentro do diretório~/ep/exercicios/m4/simple_store/lib. -
Defina uma classe chamada
Productnesse arquivo.
-
-
Nesta classe, defina o método
initialize. Este método deverá ter um único parâmetro: um hash (isto é, o método irá receber um objeto da classe Hash). -
Dentro do
initialize, inicialize as seguintes variáveis de instância:@title,@price,@manufacturer,@barcodee@code. Os valores para estas variáveis serão passados no hash que o método irá receber.-
Você pode assumir que as chaves do hash serão strings iguais aos nomes das variáveis de instância. Por exemplo: chave
'barcode'para a variável de instância@barcode. As exceções são as variáveis@manufacturere@code, e estão explicadas a seguir. -
A variável
@manufactureré uma exceção à regra acima. Para essa variável, você utilizará a chave'manufacturer_code'do hash para obter o código do fabricante. Em seguida, precisará acessar a constanteSimpleStore::AUTHORIZED_MANUFACTURERSe usar o código obtido para então obter o nome do fabricante e armazenar este nome na variável@manufacturer. -
A variável
@codedeve conter um código único que identifica o produto. Este código deverá ser obtido chamando o métodoProduct#generate_control_codecom os valores das outras características do produto, conforme descrito mais abaixo.
-
-
Cada variável de instância possui regras de validação, usadas para definir se um determinado valor é válido. Portanto, antes de inicializar cada variável de instância, você deverá fazer as seguintes verificações:
title(título do produto): não pode ser nulo nem vazio. Caso a validação falhe, use o seguinte trecho de código para lançar um erro e interromper a execução do programa:
fail SimpleStore::Error, "O título do produto não pode ser vazio"price(preço): deve ser um valor numérico maior ou igual a zero. Caso a validação falhe, use o código:
fail SimpleStore::Error, "O preço do produto deve ser >= 0.0"manufacturer(fabricante): o código do fabricante informado deve estar incluído na lista de fabricantes autorizados (ver constanteSimpleStore::AUTHORIZED_MANUFACTURERS). Caso a validação falhe, use o código:
fail SimpleStore::Error, "O fabricante não está autorizado"-
barcode(código de barras): sem validação. -
code(código do produto): sem validação.
Note que colocar o código que realiza estas validações diretamente no método
initializenão é uma boa organização do código. Portanto, você deverá definir os setters apropriados para cada variável, e fazer a verificação dentro de cada setter. -
Defina getters para cada variável de instância. Você pode definir esses métodos explicitamente ou, de maneira mais concisa, usar o método
attr_readerdo Ruby. -
Defina e implemente um método privado chamado
generate_control_codeque retorna a string que será usada como um “identificador único” de produto (isto é, não podem existir dois produtos na nossa loja com o mesmo código). Esta string deve ser construída a partir de outros atributos do produto, da seguinte forma:"{PRODUCT_TYPE_CODE}--{MANUFACTURER_CODE}--{BARCODE}" # Por exemplo, um código válido é: "0--2--abcdef".-
Veja as constantes
SimpleStore::PRODUCT_TYPESeSimpleStore::AUTHORIZED_MANUFACTURERSpara descobrir como conseguir estes códigos. -
Neste exercício,
PRODUCT_TYPE_CODEdeverá ser sempre o código correspondente ao tipo:Product, ou seja, ainda não vamos usar os diferentes tipos de produto existentes.
-
Testando o seu código
Testando no IRB
Você pode testar o seu código no irb (interpretador de Ruby) da seguinte forma:
- Abra um terminal e vá até o diretório
~/ep/exercicios/m4/simple_store. - Execute o comando
bundle exec irbpara iniciar o interpretador. - Dentro do console execute:
load 'irb_helper.rb'. - Agora, você está dentro de um terminal Ruby que já conhece as classes e objetos do projeto. Você pode usar este ambiente para testar o seu código, conforme os exemplos abaixo:
2.3.0 :001 > Product.new()
SimpleStore::Error: O título do produto não pode ser vazio
2.3.0 :002 > Product.new('title' => 'Teste', 'barcode' => 'aaa111', 'manufacturer_code' => 0, 'price' => 10.50)
=> #<Product:0x007f986a0b71d8 @title="Teste", @price=10.5, @manufacturer_code=0, @manufacturer="OReillyMedia", @barcode="aaa111", @code="0--0--aaa111">
OBSERVAÇÃO: o código do projeto é carregado uma única vez, quando você carrega o arquivo irb_helper.rb. Por isso, sempre que você alterar qualquer arquivo do projeto, precisará salvar os arquivos e abrir o irb novamente, para que as modificações tenham efeito no terminal.
Testando pelo terminal
Outra forma de testar o código é executar a aplicação da “loja virtual” no terminal, executando o seguinte comando, supondo que o seu diretório atual seja ~/ep/exercicios/m4/simple_store. No entanto, esta forma só estará 100% funcional após a implementação dos 3 exercícios.
bundle exec ruby -e "load 'cli.rb'".
Correção do exercício
-
Quando você estiver satisfeito com a sua resposta, utilize a ferramenta
eppara executar a correção do exercício.ep 4.1