Partilhar: WhatsApp
aulify
UC UC04372 · T. Produção de Conteúdos I

Ficha 01 · Programação genérica, patterns e metaprogramação

Genéricos, herança, polimorfismo, design patterns, metaprogramação e tipagem dinâmica
Versão · Aluno
Tempo · 4 horas
Aluno(a)
Turma
Data

Exercício 1 · Genérico ou específico

Para cada função abaixo, diz se é específica de um tipo ou genérica, e reescreve a específica de forma genérica usando <T>.

(a) function primeiroNumero(lista: number[]): number { return lista[0]; } (b) function primeiro<T>(lista: T[]): T { return lista[0]; }

Exercício 2 · Tipos de linguagens de programação genérica

Classifica cada linguagem quanto ao tipo de genericidade que usa e explica em uma frase a diferença prática entre elas: (a) TypeScript; (b) C++; (c) JavaScript.

Exercício 3 · Identificar o design pattern

Lê as três descrições e identifica o padrão de projeto (Factory, Observer ou Strategy) em cada uma:

(a) Um sistema de pontuação de quiz troca o algoritmo de cálculo consoante o modo escolhido (fácil, difícil). (b) Um componente de UI avisa vários outros sempre que os dados mudam, e cada um reage à sua maneira. (c) Uma função recebe um tipo de componente ("quiz", "video") e devolve a instância certa, sem o código chamador saber a classe concreta.

Exercício 4 · Herança bem e mal aplicada

Um colega cria class Botao extends Cor porque "o botão tem uma cor". Explica porque esta herança está mal desenhada e propõe uma alternativa.

Exercício 5 · Polimorfismo em ação

Dado o código abaixo, explica o que acontece quando se acrescenta uma nova classe Enquete extends ComponenteInterativo e se ela obriga a alterar a função mostrarTodos.

function mostrarTodos(itens: ComponenteInterativo[]) {
  itens.forEach(i => i.render());
}

Exercício 6 · Metaprogramação: o que faz este decorator

Explica, linha a linha, o que o decorator log faz ao método corrigir.

function log(target, key, descriptor) {
  const original = descriptor.value;
  descriptor.value = function (...args) {
    console.log(`A chamar ${key}`, args);
    return original.apply(this, args);
  };
}

Exercício 7 · Duck typing e o seu risco

Explica porque a função tocar(objeto) abaixo funciona com vídeos e áudios sem verificação de tipo, e qual o risco de a chamar com um objeto sem método play().

function tocar(objeto) {
  objeto.play();
}

Exercício 8 · Validar antes de usar

Escreve uma função validarPreco(valor: unknown): number que garante que o valor é um número positivo antes de o devolver, lançando erro caso contrário.