UMA LOCADORA de veículos necessita de um sistema para facilitar o atendimento a seus clientes. Os carros são classificados por tipo: popular, luxo e utilitário. As informações que interessam à locadora sobre cada um dos veículos são: placa do carro, tipo e valor diário do aluguel. Os funcionários da locadora são responsáveis pelo cadastro dos clientes e dos veículos. Eles também fazem as locações e encerram as mesmas. Há clientes especiais e comuns. Os especiais têm direito a uma taxa de desconto e um valor de quilometragem extra nas suas locações. Um cliente é identificado pelo nome, número do cartão de crédito e data de expiração.
Identifique classes, atributos e métodos.

Passo 1

O enunciado pede que a gente identifique as classes, atributos e métodos necessários para um sistema de locadora de veículos. Vou listar aqui, de maneira bem clara, o que o problema fornece e o que ele quer que o sistema trate.
Informações / dados fornecidos pelo enunciado:
  • Existem três tipos de carros: popular, luxo e utilitário.
  • Para cada veículo a locadora precisa armazenar: placa do carro, tipo e valor diário do aluguel.
  • Há funcionários que fazem cadastro de clientes e veículos, e que também realizam e encerram locações.
  • Existem dois tipos de clientes: especiais e comuns. Clientes especiais têm direito a uma taxa de desconto e a um valor de quilometragem extra nas locações.
  • Um cliente é identificado por nome, número do cartão de crédito e data de expiração do cartão.
O que o enunciado pede:
  • Identificar (listar) as classes necessárias.
  • Para cada classe, identificar os atributos (informações que precisam ser guardadas).
  • Para cada classe, identificar os métodos (as operações que cada classe precisa oferecer).

Passo 2

Vou propor as classes centrais do sistema. Aqui estou pegando as informações do enunciado e transformando em peças de projeto (cada classe corresponde a um “objeto” do domínio):
  • Veículo
  • Cliente
  • ClienteEspecial (subclasse de Cliente)
  • Funcionário
  • Locação (contrato de aluguel)
  • TipoVeículo (enumeração ou campo com conjunto de valores)
  • Repositório/Gerenciador de dados (opcional: para operações de salvar/consultar)
  • Pagamento (opcional, para registrar pagamentos)
Agora explico em passos detalhados os atributos e métodos de cada uma — do jeito que você consegue escrever numa prova.

Passo 3

Classe Veículo — quais atributos e por quê:
  • placa: identificador único do carro (string). A placa é usada para localizar o veículo.
  • tipo: indica se é popular, luxo ou utilitario. Pode ser uma enumeração.
  • valor\_diario: preço por dia (número, ex.: decimal).
  • quilometragem\_atual: odômetro atual (número). Útil para calcular km rodado na locação.
  • estatus: indica se está disponivel, alugado, manutencao (string ou enum).
Métodos essenciais da classe Veículo (assinaturas explicativas):
  • alocar(): marca o veículo como alugado (muda estatus).
  • liberar(): marca o veículo como disponível.
  • atualizar\_quilometragem(\,km\_novo\,): atualiza quilometragem\_atual.
  • dados(): retorna os atributos principais (útil para listagem).
Explicação didática: um veículo precisa guardar o que o identifica (placa), quanto custa por dia, e seu estado. Os métodos mudam esse estado (alocar/liberar) e atualizam quilometragem.

Passo 4

Classe Cliente — atributos e motivos:
  • nome: nome do cliente (string).
  • numero\_cartao: número do cartão de crédito (string, com validação).
  • validade: data de expiração do cartão (data).
  • telefone: telefone (opcional).
  • email: e-mail (opcional).
  • id: identificador interno (inteiro ou UUID).
Métodos da classe Cliente:
  • atualizar\_dados(\,novos\_dados\,): atualiza telefone, e-mail, etc.
  • validar\_cartao(): checa se a data de validade não passou e se o formato do número é plausível.
  • obter\_historico\_locacoes(): retorna lista de locações já realizadas pelo cliente (pode obter via repositório).
Explicação didática: cliente precisa ser identificado e ter meios de pagamento válidos. Método de validação evita iniciar locação com cartão vencido.

Passo 5

Classe ClienteEspecial — herança de Cliente:
Atributos adicionais:
  • taxa\_desconto: percentual de desconto sobre o total ou sobre a diária (ex.: 0{,}10 para 10%).
  • km\_extra: quilometragem gratuita extra por locação (número de km).
Métodos adicionais:
  • aplicar\_desconto(\,valor\_bruto\,): retorna o valor após desconto.
  • obter\_km\_extra(): retorna o limite de km extra disponível.
Explicação didática: usar herança aqui é natural: ClienteEspecial “é um” Cliente, com atributos e comportamentos extras. Na prova, desenhe ClienteEspecial com linha de herança para Cliente e mostre os atributos extras.

Passo 6

Classe Funcionário — atributos e métodos:
Atributos:
  • nome
  • matricula (id do funcionário)
  • login / senha (para sistema)
  • cargo (opcional)
Métodos:
  • cadastrar\_cliente(\,dados\_cliente\,): cria um novo Cliente no sistema.
  • cadastrar\_veiculo(\,dados\_veiculo\,): registra novo Veículo.
  • iniciar\_locacao(\,locacao\,): executa os passos para iniciar uma locação (verificar cliente, veículo, criar registro).
  • encerrar\_locacao(\,locacao\,): encerra uma locação (fechar valores, atualizar quilometragem, liberar veículo).
Explicação didática: o funcionário é ator que executa operações do sistema. Métodos representam ações que, na prova, você descreve como procedimentos que chamam métodos de outras classes.

Passo 7

Classe Locação (contrato) — atributos e por quê:
  • id: identificador da locação.
  • veiculo: referência ao objeto Veículo.
  • cliente: referência ao objeto Cliente (ou ClienteEspecial).
  • funcionario\_responsavel: referência ao Funcionário que criou a locação.
  • data\_inicio: data de início da locação.
  • data\_fim: data prevista de devolução (pode ser nula até encerrar).
  • km\_inicio: quilometragem do veículo no início.
  • km\_fim: quilometragem no encerramento (pode ser nulo até encerrar).
  • valor\_diario: copiado do veículo no momento da locação (para histórico).
  • valor\_km: valor por km excedente (padrão do sistema ou por tipo de veículo).
  • status: ativa/ encerrada.
  • total\_a\_pagar: valor final calculado no encerramento.
Métodos essenciais da Locação:
  • iniciar(): marca status como ativa, registra km\_inicio e data.
  • encerrar(\,km\_fim,\;data\_real\_fim\,): define km\_fim, calcula total, libera veículo e marca status=encerrada.
  • calcular\_total(): aplica a fórmula de cobrança (vou detalhar abaixo).
  • calcular\_dias(): calcula número de dias entre data\_inicio e data\_fim (com regra de arredondamento se necessário).
  • obter\_km\_rodados(): retorna km\_fim - km\_inicio.

Passo 8

Fórmula de cobrança — explicação passo a passo (muito importante para prova)
Definimos as variáveis:
  • d = número de dias de locação (inteiro).
  • v_d = valor diário ( valor\_diario).
  • v_{km} = valor cobrado por km extra além do permitido (por exemplo, R$ 0,50/km).
  • km_{rod} = quilometragem rodada = km\_fim - km\_inicio.
  • km\_gratuito = quilometragem inclusa (padrão) + km\_extra se cliente for especial.
  • desconto = valor absoluto subtraído por ser cliente especial (ou percentual aplicado ao subtotal).
Cálculo genérico do total padrão (sem descontos):
\text{subtotal} = v_d \times d + v_{km} \times \max(0,\,km_{rod} - km_{gratuito})
Se cliente especial com desconto percentual p (por ex. p=0{,}10 para 10%):
\text{total} = \text{subtotal} \times (1 - p)
Se o desconto for um valor fixo D:
\text{total} = \max(0,\,\text{subtotal} - D)
Explicação didática: na prova, escreva as variáveis, explique cada termo e mostre a fórmula final. Sempre cheque se km_{rod} \le km_{gratuito} — então não cobra km extra.

Passo 9

Exemplo numérico (modelo que você pode reproduzir em prova)
Suponha:
  • v_d = 100 (R$ 100 por dia)
  • d = 3 dias
  • v_{km} = 0{,}50 R$ por km extra
  • km\_inicio = 20\,000, km\_fim = 20\,350 km_{rod}=350
  • Cliente especial com km\_extra = 100 km e p = 0{,}10 (10% desconto)
  • Suponha quilometragem gratuita padrão =0 (ou algum valor; aqui vamos considerar só o extra do cliente)
Calculamos:
km_{rod} = 350
km_{gratuito} = 100
km\_excedente = \max(0,\,350 - 100) = 250
\text{subtotal} = 100 \times 3 + 0{,}50 \times 250 = 300 + 125 = 425
\text{total} = 425 \times (1 - 0{,}10) = 425 \times 0{,}90 = 382{,}50
Mostre um cálculo assim na prova: é o que o fiscal espera — números claros, etapas, aplicação do desconto.

Passo 10

Relações entre classes e multiplicidades (como desenhar num diagrama ou descrever em prova)
  • Um Veiculo pode ter 0…* Locacao no histórico, mas no máximo 1 locação ativa. (multiplicidade histórica: 0…*)
  • Um Cliente pode ter 0…* Locacao.
  • Um Funcionario pode criar/encerrar 0…* Locacao.
  • Locacao referencia exatamente 1 Veiculo e 1 Cliente.
  • ClienteEspecial herda de Cliente (seta de herança).
Na prova, desenhe linhas entre classes com as multiplicidades (ex.: Cliente 1 — 0…* Locacao).

Passo 11

Validações e regras de negócio importantes para anotar na prova
  • Placa placa deve respeitar formato (validação por regex).
  • valor\_diario e valor\_km não podem ser negativos.
  • Cartão de crédito: validade deve ser posterior à data atual para permitir locação.
  • Ao iniciar locação, verificar veiculo.estatus == disponivel.
  • Ao encerrar, atualizar veiculo.quilometragem com km\_fim e veiculo.estatus = disponivel.
  • Registrar quem (funcionário) iniciou e encerrou a locação (auditoria).

Passo 12

Classes auxiliares e persistência (boa prática — mencionar em prova se pedir arquitetura)
  • Repositório/DAO: VeiculoRepository, ClienteRepository, LocacaoRepository com métodos como salvar(), buscarPorId(), listarDisponiveis().
  • Serviço de cobrança/pagamento: Pagamento ou CobrancaService com método processar\_pagamento(\,locacao\,).
  • Em prova, diga que persistência pode ser feita em banco de dados; mostre métodos básicos CRUD.

Passo 13

Dicas finais para responder em prova
  • Comece listando as classes principais (como eu fiz).
  • Para cada classe, escreva 3–6 atributos relevantes e 3–6 métodos principais.
  • Mostre relações (herança ClienteEspecial → Cliente; associação Locacao ↔ Veiculo, Cliente, Funcionário).
  • Se der tempo, escreva a fórmula de cálculo do valor da locação com variáveis e um exemplo numérico (isso soma muitos pontos).
  • Termine citando validações importantes (cartão vencido, veículo não disponível).
Força aí — descrevendo as classes e pegando um exemplo numérico você resolve essa questão na prova sem drama. Agora, na seção seguinte eu coloco apenas o resultado final pedido (classes com atributos e métodos) de forma compacta para você colar na sua folha.

Resposta

Veículo — Atributos: placa, tipo, valor\_diario, quilometragem\_atual, estatus. Métodos: alocar(), liberar(), atualizar\_quilometragem(\,km\_novo\,), dados().
Cliente — Atributos: id, nome, numero\_cartao, validade, telefone, email. Métodos: atualizar\_dados(\,novos\_dados\,), validar\_cartao(), obter\_historico\_locacoes().
ClienteEspecial (herda Cliente) — Atributos: taxa\_desconto, km\_extra. Métodos: aplicar\_desconto(\,valor\_bruto\,), obter\_km\_extra().
Funcionário — Atributos: matricula, nome, login, senha, cargo. Métodos: cadastrar\_cliente(\,dados\_cliente\,), cadastrar\_veiculo(\,dados\_veiculo\,), iniciar\_locacao(\,locacao\,), encerrar\_locacao(\,locacao\,).
Locação — Atributos: id, veiculo, cliente, funcionario\_responsavel, data\_inicio, data\_fim, km\_inicio, km\_fim, valor\_diario, valor\_km, status, total\_a\_pagar. Métodos: iniciar(), encerrar(\,km\_fim,\;data\_real\_fim\,), calcular\_total(), calcular\_dias(), obter\_km\_rodados().
TipoVeículo (enum) — Valores: popular, luxo, utilitario.
Repositório (ex.: VeiculoRepository / ClienteRepository / LocacaoRepository) — Métodos: salvar(\,obj\,), buscarPorId(\,id\,), listarDisponiveis(), atualizar(\,obj\,), remover(\,id\,).
Pagamento / CobrancaService — Métodos: calcular\_subtotal(\,locacao\,), processar\_pagamento(\,locacao,\;dados\_pagamento\,).
(Fórmula de cobrança a mencionar se pedir cálculo)
\text{subtotal} = valor\_diario \times dias + valor\_km \times \max(0,\,km_{rod} - km_{gratuito})
Se cliente especial com desconto percentual p:
\text{total} = \text{subtotal} \times (1 - p)

Exercícios relacionados