Faça um diagrama de caso de uso e de classes para cada um dos casos abaixo:
Para produção de um filme devemos ter o registro de todas as cenas filmadas, quais os atores que participaram na cena, todos os funcionários que participaram (câmeras, iluminadores, contra-regras, dublês) e o local das filmagens. Cada cena pode ter sido filmada muitas vezes e futuramente será escolhida uma. O filme é composto das cenas escolhidas numa sequência determinada. Cada cena tem uma duração em minutos. Depois do filme montado, o percentual de participação de cada funcionário, incluindo os atores será calculado. O sistema também deve produzir um relatório de cenas, atores e funcionários em cada locação.
Para produção de um filme devemos ter o registro de todas as cenas filmadas, quais os atores que participaram na cena, todos os funcionários que participaram (câmeras, iluminadores, contra-regras, dublês) e o local das filmagens. Cada cena pode ter sido filmada muitas vezes e futuramente será escolhida uma. O filme é composto das cenas escolhidas numa sequência determinada. Cada cena tem uma duração em minutos. Depois do filme montado, o percentual de participação de cada funcionário, incluindo os atores será calculado. O sistema também deve produzir um relatório de cenas, atores e funcionários em cada locação.
Passo 1
O que o enunciado pede (objetivos claros):
- Criar um diagrama de caso de uso para o sistema que suporta a produção de um filme.
- Criar um diagrama de classes para esse mesmo sistema.
Informações dadas pelo enunciado (pontos relevantes que vamos usar):
- Deve haver registro de todas as cenas filmadas.
- Para cada cena é preciso registrar:
- quais atores participaram,
- todos os funcionários que participaram (ex.: câmeras, iluminadores, contra-regras, dublês),
- o local das filmagens.
- Cada cena pode ter sido filmada muitas vezes (várias tomadas) e, futuramente, será escolhida uma tomada (take) para ser usada.
- O filme é composto das cenas escolhidas em uma sequência determinada.
- Cada cena tem uma duração em minutos.
- Depois do filme montado, calcular o percentual de participação de cada funcionário, incluindo os atores.
- O sistema deve produzir um relatório de cenas, atores e funcionários por locação.
O que será entregue ao final:
- Um diagrama de caso de uso (lista de atores, casos e relacionamentos).
- Um diagrama de classes (classes, atributos, métodos principais, associações e multiplicidades).
- Código PlantUML para cada diagrama (para você gerar a imagem rápido, se desejar).
Passo 2
Identificação dos atores (quem interage com o sistema)
- Produtor/Diretor: decide seleção final das tomadas e ordem do filme, solicita relatórios.
- Editor/Montador: monta o filme (seleciona tomadas, monta sequência).
- Assistente de Produção / Registrador: insere dados sobre cenas, tomadas, participantes e locações (entrada de dados).
- Gerente de Locação: consulta relatórios por locação e atualiza dados de locações.
- Administrador do Sistema: gerencia cadastros (atores, funcionários, locações).
Observação: “Atores” no enunciado são objetos do sistema (pessoas que participam), não atores UML. Aqui tratamos “Atores” como pessoas registradas.
Passo 3
Lista de casos de uso (o que o sistema precisa suportar)
- Registrar Cena
- Registrar Tomada (Take) para uma Cena
- Registrar Pessoa (Ator ou Funcionário)
- Registrar Participação (associar Pessoa a uma Tomada com função)
- Registrar Locação
- Selecionar Tomada para Cena (decisão de qual tomada será usada no filme)
- Montar Filme (criar sequenciamento de cenas escolhidas)
- Calcular Percentual de Participação por Pessoa (após montagem)
- Gerar Relatório por Locação (cenas, atores e funcionários em cada locação)
- Consultar Cenas / Tomadas / Pessoas / Locações
- Gerenciar Cadastros (CRUD de pessoas, funções, locações) — para o Administrador
Relações importantes entre casos de uso:
- Registrar Cena inclui Registrar Locação (ao criar cena, informa-se onde foi filmada).
- Registrar Cena inclui Registrar Tomada (pelo menos opcionalmente; podem vir várias tomadas).
- Registrar Tomada inclui Registrar Participação (cada tomada precisa listar participantes).
- Selecionar Tomada faz parte do fluxo de Montar Filme (o editor escolhe tomadas e monta sequência).
- Calcular Percentual depende do Filme montado (usa cenas selecionadas e suas durações).
Passo 4
Descrição didática do Diagrama de Caso de Uso — como montar e interpretar
- Cada ator (Produtor, Editor, Assistente, Gerente, Administrador) é ligado por uma linha aos casos de uso que ele executa.
- “Inclusão” (<<include>>) é usada quando um caso sempre chama outro (ex.: Registrar Cena <<include>> Registrar Locação).
- “Extensão” (<<extend>>) é usada para comportamento opcional/alternativo (ex.: Registrar Tomada <<extend>> Registrar Take de Emergência).
- Use casos centrais ao sistema: entrada de dados (registro), montagem (seleção e ordenação), relatórios e cálculo de participação.
- O diagrama deve ser legível: agrupe casos por responsabilidade (cadastros, montagem, relatórios).
Passo 5
Modelagem conceitual para o Diagrama de Classes — escolha de classes e justificativa
Classes principais identificadas:
Classes principais identificadas:
- Filme (Movie)
- Atributos essenciais: id, titulo, dataVersao, totalDuracao (minutos)
- Relação: compõe-se de SequenciaDeCenas (ordered association para CenaSelecionada)
- Cena (Scene)
- Atributos: id, nome, descricao
- Relação: tem muitas Tomadas (Take). Pode ter uma duração “esperada” mas a duração real vem da tomada selecionada.
- Tomada (Take)
- Atributos: id, numeroTake, duracaoMinutos, dataHora, observacoes
- Relação: pertence a uma Cena; tem participações (Participation).
- Pessoa (Person) — classe geral
- Atributos: id, nome, tipoPessoa (enum: ATOR, FUNCIONARIO), contato
- Subclasses possíveis: Ator (Actor) e Funcionario (Employee) — se precisar de campos específicos.
- Funcao (Role) ou Cargo (JobRole)
- Atributos: id, nome (ex.: câmera, iluminador, contra-regra, dublê)
- Participacao (Participation) — associação/association-class entre Tomada e Pessoa
- Atributos: papel (ex.: personagem ou função), minutosParticipadosNaTomada (opcional), observacao
- Justificativa: uma mesma pessoa pode participar de muitas tomadas e com papéis diferentes; precisamos registrar o papel em cada tomada.
- Locacao (Location)
- Atributos: id, nome, endereco, descricao
- Relação: Cena tem uma Locacao (onde foi filmada).
- CenaSelecionada (SceneInMovie) — associação entre Filme e Cena, com sequencia
- Atributos: ordemNoFilme (integer), duracaoUtilizada (minutos) — geralmente igual à duracao da tomada selecionada.
Decisões de projeto e explicações práticas:
- Modelar Tomada separadamente de Cena porque “cada cena pode ter sido filmada muitas vezes”.
- Incluir uma entidade Participacao para poder calcular facilmente os minutos totais que cada pessoa aparece/influencia no filme (somando durações das tomadas selecionadas onde participou).
- Guardar qual Tomada foi selecionada para cada Cena (atributo selectedTake em Cena ou fazer uma associação Cena -> Tomada com
isSelected=true). No diagrama proponho: Cena tem many Tomadas; Cena possui selectedTake (0…1). - Para representar a sequência do filme, usar uma classe associação CenaSelecionada com um atributo ordemNoFilme. Assim o Filme mantém a ordem.
Passo 6
Como calcular o percentual de participação (explicação passo a passo — você vai conseguir fazer isso na prova)
- Ideia: percentual de participação de uma pessoa = (tempo total em que essa pessoa participou do filme / duração total do filme) × 100.
- Como obter o tempo total em que a pessoa participou:
- Para cada Cena incluída no Filme, identificar a Tomada selecionada e usar sua duração.
- Se a pessoa participou dessa tomada (há um registro de Participacao), some a duração da tomada.
- Some todas essas durações para obter
.
- Duração total do filme: somatório das durações das tomadas selecionadas para todas as cenas incluídas no filme, denotar
. - Fórmula final:
- Observação prática: se existir participação parcial (por exemplo, a pessoa aparece apenas em parte da tomada), então na Participacao pode haver um campo
específico que se soma em vez de usar a duração inteira da tomada.
Passo 7
Apresentação final dos diagramas em PlantUML (pronto para gerar imagens)
- Abaixo eu disponibilizo dois blocos PlantUML:
- um para o Diagrama de Casos de Uso,
- outro para o Diagrama de Classes.
- Você pode colar cada bloco em um gerador PlantUML (ex.: https://www.plantuml.com/plantuml) para obter as figuras.
Resposta
Diagrama de Casos de Uso (PlantUML):
@startuml
left to right direction
actor "Assistente de Produção" as Assistente
actor "Editor / Montador" as Editor
actor "Produtor / Diretor" as Produtor
actor "Gerente de Locação" as GerenteLoc
actor "Administrador" as Admin
rectangle "Sistema de Produção de Filme" {
usecase "Registrar Cena" as UC_RegCena
usecase "Registrar Tomada (Take)" as UC_RegTake
usecase "Registrar Pessoa (Ator/Fun.)" as UC_RegPessoa
usecase "Registrar Participação" as UC_RegParticip
usecase "Registrar Locação" as UC_RegLoc
usecase "Selecionar Tomada para Cena" as UC_SelTake
usecase "Montar Filme (ordenar cenas)" as UC_Montar
usecase "Calcular % de Participação" as UC_CalcPerc
usecase "Gerar Relatório por Locação" as UC_RelLoc
usecase "Gerenciar Cadastros" as UC_GestCad
usecase "Consultar Cenas/Tomadas/Pessoas" as UC_Consultar
}
Assistente --> UC_RegCena
Assistente --> UC_RegTake
Assistente --> UC_RegPessoa
Assistente --> UC_RegParticip
Assistente --> UC_RegLoc
Editor --> UC_SelTake
Editor --> UC_Montar
Produtor --> UC_Montar
Produtor --> UC_CalcPerc
GerenteLoc --> UC_RelLoc
Admin --> UC_GestCad
Admin --> UC_RegPessoa
Admin --> UC_RegLoc
Assistente --> UC_Consultar
Editor --> UC_Consultar
Produtor --> UC_Consultar
GerenteLoc --> UC_Consultar
UC_RegCena .down.> UC_RegLoc : <<include>>
UC_RegTake .down.> UC_RegParticip : <<include>>
UC_Montar .down.> UC_SelTake : <<include>>
UC_CalcPerc .left.> UC_Montar : <<extend>>
@enduml
Diagrama de Classes (PlantUML):
@startuml
' Classes principais
class Movie {
+movieId : Long
+title : String
+versionDate : Date
+totalDurationMin : Integer
+calculateTotalDuration() : Integer
+addSceneInOrder(sceneInMovie : SceneInMovie)
}
class Scene {
+sceneId : Long
+name : String
+description : String
+selectedTakeId : Long
+getSelectedTake() : Take
}
class Take {
+takeId : Long
+takeNumber : Integer
+durationMin : Integer
+recordDate : Date
+notes : String
}
class Person {
+personId : Long
+name : String
+personType : String ' ATOR or FUNCIONARIO
+contact : String
}
class Role {
+roleId : Long
+name : String ' ex: Camera, Iluminador, ContraRegra, Duble
}
class Participation {
+participationId : Long
+roleName : String
+minutesParticipated : Integer ' opcional: se só participou parte da tomada
+notes : String
}
class Location {
+locationId : Long
+name : String
+address : String
+description : String
}
class SceneInMovie {
+id : Long
+orderInMovie : Integer
+durationUsedMin : Integer
}
' Relações e multiplicidades
Movie "1" o-- "0..*" SceneInMovie : contains
SceneInMovie "*" --> "1" Scene : refers_to
Scene "1" o-- "0..*" Take : has
Scene "1" --> "1" Location : filmed_at
Take "1" --> "0..*" Participation : has
Participation "*" --> "1" Person : person
Participation "*" --> "1" Role : role
' Para selecionar a tomada escolhida para a cena:
Scene "1" --> "0..1" Take : selectedTake
' Observações de composição: cena possui tomadas (dependência forte)
Scene *-- Take
@enduml