MAC 413/5715 - Galeria


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"

Página de MAC 441/5714
Página do Fabio
Página do DCC