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/productsusando 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.rbno diretório~/ep/exercicios/m4/simple_store/lib/products. -
Nesse arquivo, defina a classe
FreshProduct, que deve herdar da classeProduct. -
Defina o método
initializenesta 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
initializedeve atribuir o valor da nova variável em adição às outras variáveis deProductque já estavam sendo atribuídas na classe-pai. Portanto, não se esqueça de chamar oinitializeda classe-pai também! -
Crie um getter para o novo atributo desta classe (
expiration_date).
DigitalProduct
-
Crie o arquivo
digital_product.rbno 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
initializenesta 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_dateeurl).
Product
-
Altere o método
Product#generate_control_codepara 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_TYPESsã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_dateserá 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
FreshProducteDigitalProductdeverá 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 classeDatepara 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
eppara executar a correção do exercício.ep 4.2