Exercícios comentados

1️⃣ Exercício: Gerenciamento de Mudanças em Requisitos

Enunciado

Uma clínica médica está implementando um sistema de prontuário eletrônico. Durante o desenvolvimento, um novo requisito surge: permitir que os pacientes consultem seus exames online.

Tarefas:

  1. Elaborar um plano de gerenciamento de mudanças.
  2. Criar um fluxo UML para análise/aprovação da mudança.
  3. Explicar como métodos ágeis poderiam ajudar.

Resolução

Plano de Gerenciamento de Mudanças:

  • Identificação da Mudança: Inclusão do módulo de consulta de exames online.
  • Justificativa: Aumentar a autonomia dos pacientes e reduzir demanda no atendimento.
  • Avaliação de Impacto:
    • Custo: Necessidade de servidor seguro e integração com o laboratório.
    • Prazo: Estimativa de +3 sprints no Scrum.
    • Segurança: Implementação de autenticação multifator.
    • Usabilidade: Interface simplificada para acesso via celular.
  • Prioridade: Alta (impacto direto no valor para o cliente).
  • Controle de Versão: Atualização do documento de requisitos (IEEE 830).

Fluxo UML (atividade simplificada):

[Solicitação de Mudança] → [Análise de Impacto] → [Aprovação do Comitê] → 
[Planejamento no Backlog] → [Implementação e Testes] → [Deploy e Feedback]

Métodos Ágeis:

  • Scrum permite ajustes rápidos via backlog.
  • Cada sprint incorpora incrementos pequenos (entrega contínua).
  • Feedback dos usuários nas revisões ajuda a validar rapidamente.

2️⃣ Exercício: Herança e Encapsulamento

Enunciado

Crie uma classe Pessoa com atributos comuns (nome, idade e CPF), e duas subclasses: Aluno e Professor, que herdam atributos e adicionam informações específicas.


Resolução em Python

class Pessoa:
def __init__(self, nome, idade, cpf):
self._nome = nome
self._idade = idade
self._cpf = cpf

def get_nome(self):
return self._nome

def set_nome(self, nome):
self._nome = nome

def get_idade(self):
return self._idade

def set_idade(self, idade):
self._idade = idade

def get_cpf(self):
return self._cpf

def set_cpf(self, cpf):
self._cpf = cpf


class Aluno(Pessoa):
def __init__(self, nome, idade, cpf, serie):
super().__init__(nome, idade, cpf)
self.serie = serie

def exibir_informacoes(self):
return f"Aluno: {self.get_nome()}, Idade: {self.get_idade()}, Série: {self.serie}"


class Professor(Pessoa):
def __init__(self, nome, idade, cpf, disciplina):
super().__init__(nome, idade, cpf)
self.disciplina = disciplina

def exibir_informacoes(self):
return f"Professor: {self.get_nome()}, Idade: {self.get_idade()}, Disciplina: {self.disciplina}"


# Teste
aluno1 = Aluno("Carlos", 15, "123.456.789-00", "9º Ano")
prof1 = Professor("Ana", 35, "987.654.321-00", "Matemática")

print(aluno1.exibir_informacoes())
print(prof1.exibir_informacoes())

Saída esperada:

yamlCopiarEditarAluno: Carlos, Idade: 15, Série: 9º Ano
Professor: Ana, Idade: 35, Disciplina: Matemática

3️⃣ Exercício: Polimorfismo em um Sistema de Entregas

Enunciado

Implemente classes de transporte (Moto, Caminhao, Drone) que calculam o tempo de entrega de forma distinta, utilizando polimorfismo.


Resolução em Python

from abc import ABC, abstractmethod

class Transporte(ABC):
@abstractmethod
def calcular_tempo(self, distancia):
pass


class Moto(Transporte):
def calcular_tempo(self, distancia):
velocidade = 60 # km/h
return distancia / velocidade


class Caminhao(Transporte):
def calcular_tempo(self, distancia):
velocidade = 40 # km/h
return distancia / velocidade


class Drone(Transporte):
def calcular_tempo(self, distancia):
velocidade = 80 # km/h
return distancia / velocidade


# Teste com polimorfismo
transportes = [Moto(), Caminhao(), Drone()]
distancia = 120 # km

for t in transportes:
print(f"{t.__class__.__name__}: Tempo estimado = {t.calcular_tempo(distancia):.2f} horas")

Saída esperada:

Moto: Tempo estimado = 2.00 horas
Caminhao: Tempo estimado = 3.00 horas
Drone: Tempo estimado = 1.50 horas