Provinha 1
Escreva um conjunto de classes em Smalltalk para implementar um catálogo de DVDs. O catálogo deve permitir 3 oparações básicas: inserção de um novo DVD no catálogo (incluindo informações como título, diretor, atores, ano), remoção e busca. A interface do seu sistema deverá permitir buscas por título, por ator e por ano. Ao realizar uma busca, todos os DVDs que atenderem ao critério de busca devem ser localizados.
Por fim, mostre um pequeno exemplo de uso de seu catálogo com algumas adições, uma busca e uma remoção.
Solução
Meu design é composto por duas classes, DVD e Catalogo. A classe DVD modela um DVD real. Como este é um sistema muito simples, a única responsabilidade da classe DVD é a de agrupar o subconjunto de atributos de um DVD real requeridos pelo restante do sistema. A classe Catalogo funciona como um contêiner de DVDs e tem como responsabilidades oferecer as operações de inserção, remoção e busca.
Classe: DVD Variáveis de instância: titulo, atores, diretor, ano - Métodos de instância: DVD>>ano ^ano DVD>>ano: umAno ano := umAno.
DVD>>atores ^atores DVD>>atores: umaColecaoDeAtores atores := umaColecaoDeAtores DVD>>diretor ^diretor DVD>>diretor: umDiretor diretor := umDiretor
- Métodos de classe: DVD>>novoDVDComTitulo: umTitulo atores: umaCollection diretor:umDiretor ano:umAno "Cria a inicializa um novo DVD." |dvd| dvd := super new. dvd titulo: umTitulo. dvd atores: umaCollection. dvd diretor: umDiretor. dvd ano: umNumero. ^dvd.
Classe: Catalogo Variáveis de instância: dvds Catalogo>>adiciona: umDVD dvds add: umDVD. Catalogo>>remove: umDVD dvds remove: umDVD ifAbsent: [^false]. ^true. Catalogo>>DVDsComTitulo: umTitulo atores: umaOrderedCollection diretor: umDiretor datadoDe: umNumero "Busca pelos DVDs que se encaixem nos critérios especificados. Permite o uso de coringas simples '*' para especificar cada critério" ^dvds select: [:umDVD | (umDVD titulo = umTitulo or: [umTitulo = '*']) and: [umaOrderedCollection = '*' or: [umDVD atores includesAllOf: umaOrderedCollection]] and: [umDVD diretor = umDiretor or: [umDiretor = '*']] and: [umDVD ano = umNumero or: [umNumero = '*']]]
Exemplo de uso:
dvd1 := DVD novoDVDComTitulo: 'Eyes Wide Shut' atores: #('Tom Cruise', 'Nicole Kidman') diretor: 'Stanley Kubrick' datadoDe: 1999. dvd2 := DVD novoDVDComTitulo: 'Dogville' atores: #('Nicole Kidman', 'Jean-Marc Barr') diretor: 'Lars von Trier' datadoDe: 2004. catalogo := Catalogo new. catalogo insere: dvd1. catalogo insere: dvd2. catalogo DVDsComTitulo: '*' atores: #('Nicole Kidman') diretor: '*' datadoDe: '*'. "Devolve uma coleção contendo os dois DVDs" catalogo remove: dvd1. "Remove o dvd 1 do catálogo"