Mini-Projecto · Biblioteca genérica de conteúdos interativos
Contexto
A "Escola Digital", um centro de formação, quer um pequeno módulo de código que sirva de base a vários produtos: uma plataforma de e-learning, um museu virtual e um catálogo de uma loja. Em vez de construir três soluções separadas, pediram-te uma biblioteca genérica de conteúdos interativos: uma base comum, escrita uma vez, que qualquer um dos três produtos pode estender sem alterar o núcleo.
Trabalhas individualmente ou a pares, em JavaScript, e entregas o código a funcionar mais um pequeno dossiê (requisitos analisados, decisões de design e testes realizados).
Requisitos
Funcionais
- Classe base
ConteudoDigital, comtituloe um método genéricorender(). - No mínimo três subclasses por herança (por exemplo
Imagem,Video,Quiz), cada uma comrender()próprio (polimorfismo). - Uma estrutura de dados genérica (array de objetos) para gerir uma coleção de conteúdos de tipos diferentes.
- Uma função Factory (
criarConteudo(tipo, ...)) que centraliza a criação das instâncias. - Um ciclo genérico que percorre a coleção e chama
render()em cada item, sem verificar o tipo comif/else. - Uma função de tratamento de erros genérico (
renderSeguro) que isola falhas de um item sem parar o programa. - Testes (
console.assertou equivalente) que cubram, no mínimo, um caso válido e um caso-limite por funcionalidade.
Não-funcionais
- Código sem duplicação evidente entre subclasses (o que é comum vive na classe base).
- Sem valores fixos (hardcoding) onde deveria haver um parâmetro configurável.
- Comentários que expliquem decisões, não o óbvio.
- Nenhuma alteração à classe base para acrescentar um tipo de conteúdo novo (extensão, não modificação).
Fases
Fase 1 · Análise de requisitos (2h) Listar os tipos de conteúdo a suportar e o que têm em comum. Esboçar, em papel ou texto, a árvore de classes.
Fase 2 · Classe base e primeira subclasse (2h)
Implementar ConteudoDigital e uma subclasse, com herança e super() corretos.
Fase 3 · Polimorfismo com todas as subclasses (3h)
Implementar as restantes subclasses e o ciclo genérico que chama render() sem verificar o tipo.
Fase 4 · Factory e estrutura de dados (2h)
Implementar criarConteudo(tipo, ...) e a coleção (array) que gere os conteúdos.
Fase 5 · Adaptação e extensão (2h) Acrescentar um tipo de conteúdo novo (não previsto na Fase 1) só por extensão, sem tocar na classe base.
Fase 6 · Testes e tratamento de erros (2h)
Escrever renderSeguro e os testes, incluindo pelo menos um caso-limite por funcionalidade.
Fase 7 · Apresentação (2h) Demonstrar a biblioteca à turma e justificar as decisões de design tomadas no dossiê.
Critérios de avaliação
| Critério | Peso |
|---|---|
| Classe base, herança e polimorfismo corretos | 25% |
| Factory e estrutura de dados genérica | 15% |
| Ciclo genérico sem verificação manual de tipo | 15% |
| Tratamento de erros e testes | 20% |
| Extensão sem alterar a classe base (Fase 5) | 15% |
| Dossiê e apresentação | 10% |
Erros comuns
- Repetir
titulono construtor de cada subclasse em vez de usarsuper(titulo). - Verificar o tipo do item com
if (item instanceof Video)antes de chamarrender(), em vez de confiar no polimorfismo. - Espalhar
new Video(...)pelo código, sem passar pela Factory. - Alterar a classe
ConteudoDigitalna Fase 5, em vez de só estender. - Testar apenas o caso "tudo certo" e esquecer o título vazio ou
null. - Deixar um
catchvazio emrenderSeguro, sem registar o erro.
Bónus (opcional)
- Implementar um padrão Observer: disparar um evento quando um conteúdo é renderizado, e um segundo módulo reagir (por exemplo, contando quantos conteúdos já foram mostrados).
- Acrescentar uma opção de configuração (ex.:
{ idioma: "pt" }) injetada na Factory, sem alterar as subclasses. - Medir e comentar o impacto de otimizar os dados (ex.: não carregar imagens de conteúdos ainda não visíveis) na eficiência e no consumo energético.
Reflexão
No dossiê final, responde: qual foi a decisão de design mais importante para que a Fase 5 (extensão) não exigisse tocar na classe base? E dá um exemplo, fora deste projeto, de um sistema real (aplicação, jogo, site) que provavelmente usa uma classe base genérica com várias subclasses.