4.17 Exercício M04-E01 Aula anterior
1.4 - Criação do seu ambiente
4.18 - Exercício M04-E02
Objetivos
- Aplicar conceitos básicos de Programação Orientada a Objetos (POO) usando a linguagem Ruby:
- Herança
- Encapsulamento
- Polimorfismo
Instruções
Nesse exercício, vamos criar novas classes para conseguir representar produtos de diferentes tipos na nossa loja virtual. Os 3 tipos de produtos que queremos representar são: produtos físicos comuns (roupas, móveis, etc), produtos frescos (frutas, legumes, etc) e produtos digitais (e-books, arquivos de música, etc).
Cada um destes tipos possui características específicas e, por isso, vamos precisar criar as seguintes classes: PhysicalProduct
, FreshProduct
e DigitalProduct
.
PhysicalProduct
-
Crie o diretório
~/ep/exercicios/m4/simple_store/lib/products
usando o comandomkdir
. -
Dentro desse diretório, crie o arquivo
physical_product.rb
. -
Nesse arquivo, defina a classe
PhysicalProduct
, que deve herdar da classeProduct
, já que um produto físico continua sendo um produto, apenas de um tipo mais específico. -
Essa classe não precisará de nenhum código adicional. Portanto, ela já está pronta e terá exatamente o mesmo comportamento da classe
Product
.
FreshProduct
-
Crie o arquivo
fresh_product.rb
no diretório~/ep/exercicios/m4/simple_store/lib/products
. -
Nesse arquivo, defina a classe
FreshProduct
, que deve herdar da classeProduct
. -
Defina o método
initialize
nesta classe para podermos atribuir o valor de uma nova variável de instância:@expiration_date
(data de vencimento): deve ser uma data maior que a data de hoje. Caso a validação falhe, utilize o código abaixo para lançar um erro e interromper a execução do programa:
fail SimpleStore::Error, 'O produto não pode estar vencido'
Atenção: este método
initialize
deve atribuir o valor da nova variável em adição às outras variáveis deProduct
que já estavam sendo atribuídas na classe-pai. Portanto, não se esqueça de chamar oinitialize
da classe-pai também! -
Crie um getter para o novo atributo desta classe (
expiration_date
).
DigitalProduct
-
Crie o arquivo
digital_product.rb
no diretório~/ep/exercicios/m4/simple_store/lib/products
. -
Nesse arquivo, defina a classe
DigitalProduct
, que deve herdar da classeProduct
. -
Novamente, sobrescreva o método
initialize
nesta classe para atribuir o valor de duas variáveis adicionais de instância:@expiration_date
(data de vencimento): deve ser uma data maior que a data de hoje. Caso a validação falhe, utilize o código:
fail SimpleStore::Error, 'O produto não pode estar vencido'
@url
: deve ser uma string iniciada por “http”. Caso a validação falhe, utilize o código:
fail SimpleStore::Error, 'A URL do produto deve ser válida'
-
Crie dois getters para os novos atributos desta classe (
expiration_date
eurl
).
Product
-
Altere o método
Product#generate_control_code
para que a geração do código do produto utilize a constanteSimpleStore::PRODUCT_TYPES
, agora que temos outros tipos de produtos além deProduct
.Dica: Perceba que as chaves o hash
SimpleStore::PRODUCT_TYPES
são exatamente os nomes das diferentes classes que você criou. Isso significa que você poderia utilizar algum método de Ruby para obter a classe de um objeto e usar o nome da classe para acessar o hash.
Observações
-
O argumento
expiration_date
será informado na forma de uma string com o formato:'AAAA-MM-DD'
. Por exemplo:args = { ... 'expiration_date' => '2016-07-20' # 20 de Julho de 2017 ... }
Seu código nas classes
FreshProduct
eDigitalProduct
deverá encontrar uma maneira de transformar este valor, que é uma string, em um objeto do tipoDate
, para que você consiga validar a data informada. Consulte a documentação da classeDate
para pesquisar como fazer isso.
Testando seu código
Você pode testar o seu código usando as mesmas duas formas que utilizou no exercício M04-E01.
Correção do exercício
-
Quando você estiver satisfeito com a sua resposta, utilize a ferramenta
ep
para executar a correção do exercício.ep 4.2