Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2024-2025 (rascunho): Difference between revisions

From Wiki**3

Root (talk | contribs)
Root (talk | contribs)
 
(359 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{PRJPOAvisosEN20242025}}
#REDIRECT [[Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2024-2025]]
{{PRJPOMandatory20242025}}
{{TOCright}}
'''<font color="red">EM PREPARAÇÃO</font>'''
<!--
'''<font color="red">ÉPOCA NORMAL</font>'''-->
 
O objectivo do projecto é desenvolver uma aplicação de gestão de um hotel veterinário que dispões de tratadores, veterinários e ecossistemas com árvores.
 
= Propriedades e funcionalidade =
 
Os animais de várias espécies são mantidos por tratadores que são responsáveis por distribuir a comida e pela limpeza dos habitats, e por veterinários, que têm a responsabilidade de zelar pela saúde dos animais. Quando um animal recebe uma vacina não apropriada à sua espécie, por causa de um erro veterinário, por exemplo, fica com a saúde afectada até ao fim da sua vida. Os habitats têm árvores. É possível calcular o grau de satisfação dos animais e dos funcionários.
 
== Espécies ==
 
As espécies são identificadas por uma chave única (cadeia de caracteres definida na altura do registo).
 
Cada espécie tem um nome (cadeia de caracteres; não única) e informação acerca dos animais que têm esta espécie.
 
== Animais ==
 
Os animais são identificados por uma chave única (cadeia de caracteres definida na altura do registo).
 
Cada animal tem um nome (cadeia de caracteres; não única) e informação acerca da sua espécie e do estado de saúde.
 
Cada animal tem um nível de satisfação que depende de vários factores (ver [[#Satisfação dos Animais|Satisfação dos Animais]]).
 
=== Satisfação dos Animais ===
 
A satisfação dos animais é afectada positivamente quando existem mais animais da mesma espécie no mesmo habitat e afectado negativamente quando existem animais de outras espécies. O número total de animais no habitat e o próprio habitat também influenciam a satisfação de todos os animais que lá vivem. Na equação abaixo, '''igual''' conta o número de animais da mesma espécie no habitat, '''diferente''' é o número de animais de espécies diferentes da de '''a''' no seu habitat, '''área''' é a área do habitat e '''população''' é a população total do habitat, '''adequação''' é '''20''' se a influência do habitat for positiva, '''-20''' se for negativa e '''0''' se a influência for neutra.
 
A satisfação de um animal '''a''' no seu habitat é calculada pela fórmula:
 
* '''satisfação(a) = 20 + 3 * igual(a, habitat(a)) - 2 * diferente(a, habitat(a)) + round(área(habitat(a)) / população(habitat(a))) + adequação(a, habitat(a))'''
 
== Funcionários ==
 
Os funcionários são identificados por uma chave única (cadeia de caracteres definida na altura do registo). Os funcionários têm um nome (cadeia de caracteres; não única).
 
Existem dois tipos de funcionários: tratadores e veterinários. Cada tratador possui informação acerca dos habitats da sua responsabilidade (zero ou mais). Cada veterinário tem informação relativa às espécies que sabe medicar e cujas doenças sabe diagnosticar.
 
=== Satisfação dos Veterinários ===
A satisfação dos veterinários é afectada positivamente pela existência de outros veterinários com a mesma responsabilidade ('''n_veterinários(e)''') e negativamente pelo número de animais que estão sobre a sua responsabilidade. Apenas se contabilizam as espécies que o veterinário pode tratar ('''espécies(v)''').
 
A satisfação para um veterinário '''v''' é calculada pela fórmula:
* '''satisfação(v) = 20 - trabalho(v)'''
* '''trabalho(v) = Σ (população(e) / n_veterinários(e)), e ∈ espécies(v)'''
 
=== Satisfação dos Tratadores ===
A satisfação dos tratadores é afectada negativamente pelo trabalho que lhes é atribuído. Apenas se contabilizam os habitats que o tratador pode limpar ('''habitats(t)'''). O trabalho é também influenciado pelas árvores existentes no habitat ('''árvores(h)''') (ver também secção sobre habitats e árvores).
 
A satisfação para um tratador '''t''' é calculada pela fórmula:
* '''satisfação(t) = 300 - trabalho(t)'''
* '''trabalho(t) = Σ (trabalho_no_habitat(h) / número_de_tratadores_podem_cuidar_habitat(h)), h ∈ habitats(t)'''
* '''trabalho_no_habitat(h) = área(h) + 3 * população(h) + Σ (dificuldade_árvore(p) * factor_multiplicativo(p)), p ∈ árvores(h)'''
 
== Habitats ==
 
Os habitats são identificados por uma chave única (cadeia de caracteres definida na altura do registo).
 
Cada habitat tem um nome (cadeia de caracteres; não única) e informação sobre a área (número inteiro). Os habitats possuem informação acerca das árvores que contêm e informação relativa às espécies que residem nesse habitat e cuja satisfação este influencia.
 
Os habitats podem ser mais (ou menos) adequados para determinadas espécies. A adequação tem impacto no grau de satisfação dos animais. Por omissão, um habitat tem um impacto neutro para cada espécie. Mas um habitat pode ser mais adequado a um determinado conjunto de espécies e/ou menos adequado a outro subconjunto de espécies.
 
== Árvores ==
 
As árvores são identificadas por uma chave única (cadeia de caracteres definida na altura do registo). Cada árvore tem ainda nome (cadeia de caracteres; não única) e idade (número inteiro).
 
As árvores podem ser de folha caduca ou perene e são caracterizadas pela dificuldade de limpeza (número inteiro) que colocam no recinto onde estão implantadas.
 
A vida das árvores segue o ciclo definido pelas estações do ano. Assim, por exemplo, as árvores de folha caduca perdem as folhas principalmente durante o Outono, ficando
sem folhas no Inverno. As árvores de folha perene perdem algumas folhas durante todas as estações, mas mais durante o Inverno. O esforço de limpeza de uma árvore é determinado, em parte, pelo produto de dois factores. O primeiro corresponde ao tipo de árvore e à sua dificuldade intrínseca de manutenção. O segundo depende da estação do ano e do tipo de árvore, tal como indicado na tabela seguinte. O esforço de limpeza é ainda proporcional ao logaritmo da idade da árvore (crescente, mas não muito rápido).
 
{|
| '''Estação »'''
! style="text-align: center; font-weight: normal;" | Inverno
! style="text-align: center; font-weight: normal;" | Primavera
! style="text-align: center; font-weight: normal;" | Verão
! style="text-align: center; font-weight: normal;" | Outono
|-
| '''Folha caduca »'''
! style="text-align: center; font-weight: normal;" | 0
! style="text-align: center; font-weight: normal;" | 1
! style="text-align: center; font-weight: normal;" | 2
! style="text-align: center; font-weight: normal;" | 5
|-
| '''Folha perene »'''
! style="text-align: center; font-weight: normal;" | 0
! style="text-align: center; font-weight: normal;" | 1
! style="text-align: center; font-weight: normal;" | 1
! style="text-align: center; font-weight: normal;" | 2
|}
 
== Vacinas ==
 
As vacinas são identificadas por uma chave única (cadeia de caracteres definida na altura do registo).
 
Cada vacina tem um nome (cadeia de caracteres; não única) e possui informação acerca das espécies a que pode ser aplicada e do número de vezes que foi aplicada a cada animal pelos veterinários (ver a seguir).
 
=== Problemas associados à vacinação ===
 
Quando é ministrada uma vacina que não é adequada um animal, este fica coma sua fala danificada de modo permanente, ou seja, sem qualquer possibilidade de voltar ao seu estado normal.
 
Os danos causados pela má administração de uma vacina dependem do número de letras distintas entre o nome da espécie do animal que recebeu a vacina e o nome da espécie a que se destinava a vacina. Considera-se que os nomes '''aab''' e '''ba''' têm apenas 1 carácter distinto, sendo a ordem irrelevante. Por exemplo, quando uma '''ave''' recebe uma vacina destinada a um '''mamífero''', o número de caracteres distintos é 6, sendo calculado por:
* '''max(length(ave), length(mamífero)) - caracteres_comuns(ave, mamífero) = 8 - 2'''
 
A seguinte tabela descreve os problemas causados por uma má vacinação:
{|
| '''Caracteres distintos'''
| '''Problema'''
|-
| 1 a 4
| inicia qualquer frase com um pequeno catarro
|-
| 5 ou mais
| termina qualquer frase com um espirro
|}
 
Por exemplo, um animal que tenha recebido 2 vacinas que provocaram o problema do catarro ('''RR..''') e três vacinas que provocaram o aparecimento dos espirros ('''..Atchim'''), ao tentar produzir '''estou a falar''', produz '''RR..RR..estou a falar..Atchim..Atchim..Atchim''' (i.e., concatenação de problemas).
 
Este exemplo mostra que um problema é agravado sempre que ocorrer um erro, mesmo que já tenha sido cometido no passado.
 
= Funcionalidade da aplicação =
 
A aplicação além de permitir gerir informação relativa a todos aos conceitos acima, permite ainda calcular o estado de satisfação (um número inteiro) dos animais e funcionários, assim como a satisfação global (i.e., somatório da satisfação de todos os animais e funcionários: também um número inteiro).
 
Possui ainda a capacidade de preservar o seu estado (não é possível manter várias versões do estado da aplicação em simultâneo).
 
Deve ser possível efectuar pesquisas sujeitas a vários critérios e sobre as diferentes entidades geridas pela aplicação.
 
Uma base de dados textual com conceitos pré-definidos pode ser [[#Inicialização por Ficheiro de Dados Textuais|carregada no início da aplicação]].
 
{{Suggestion|Note-se que não é necessário nem desejável implementar de raiz a aplicação: já existem classes que representam e definem a interface geral da funcionalidade do ''core'' da aplicação, tal como é visível pelos comandos da aplicação.}}
{{CVSCode|A interface geral do ''core'' já está parcialmente implementada na classe '''hva.HotelManager''' e outras fornecidas (cujos nomes devem ser mantidos), devendo ser adaptadas onde necessário. É ainda necessário criar e implementar as restantes classes que suportam a operação da aplicação.}}
 
== Operações sobre animais ==
 
É possível registar, visualizar, e operar sobre animais.
 
As operações são as seguintes: (i) visualizar um animal; (ii) registar um novo animal; (iii) transferir um animal para outro habitat; (iv) fazer um animal falar; (v) calcular a satisfação de um animal.
 
Não é possível remover animais.
 
== Operações sobre funcionários ==
 
É possível registar, visualizar, e operar sobre funcionários.
 
As operações são as seguintes: (i) visualizar um funcionário; (ii) registar um novo funcionário; (iii) atribuir uma nova responsabilidade a um funcionário; (iv) retirar uma responsabilidade a um funcionário; (v) calcular a satisfação de um funcionário.
 
Não é possível remover funcionários.
 
== Operações sobre habitats e árvores ==
 
É possível registar, visualizar, e operar sobre habitats.
 
As operações são as seguintes: (i) visualizar um habitat; (ii) registar um novo habitat; (iii) alterar a área de um habitat; (iv) associar a um habitat as espécies que aumentam/diminuem a sua satisfação por residir nele; (v) plantar uma árvore; (vi) provocar uma alteração no ciclo biológico de uma árvore.
 
Não é possível remover habitats nem árvores
 
== Operações sobre vacinas e vacinações ==
 
É possível registar, visualizar, e operar sobre vacinas e vacinações.
 
As operações são as seguintes: (i) visualizar uma vacina; (ii) registar uma nova vacina; (iii) ministrar uma vacina a um animal; (iv) consultar o histórico de vacinação de uma dada vacina.
 
Não é possível remover vacinas nem registos de vacinação.
 
== Pesquisas ==
 
É possível efectuar pesquisas sob vários critérios e sobre as diferentes entidades geridas: (i) animais que residem num determinado habitat; (ii) animais que tomaram uma determinada vacina; (iii) vacinas que foram dadas a um determinado animal; (iv) habitats da responsabilidade de um tratador; (v) árvores que pertencem a um determinado habitat.
 
== Serialização ==
 
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relevante, descrita acima.
 
= Requisitos de desenho =
 
Devem ser possíveis extensões ou alterações de funcionalidade com impacto mínimo no código produzido: em particular, deve ser simples definir novos tipos de problemas decorrentes da aplicação incorrecta de vacinas. A definição de árvores com novos estados e diferentes formas de estimar a sua evolução; e novas políticas de cálculo da satisfação dos funcionários e animais.
 
Deve ser possível introduzir novos métodos de pesquisa com um impacto mínimo na implementação desenvolvida.
 
= Interação com o utilizador =
 
Descreve-se nesta secção a '''funcionalidade máxima''' da interface com o utilizador. Em geral, os comandos pedem toda a informação antes de procederem à sua validação (excepto onde indicado). Todos os menus têm automaticamente a opção '''Sair''' (fecha o menu).
 
As operações de pedido e apresentação de informação ao utilizador '''devem''' realizar-se através dos objectos ''form'' e ''display'', respectivamente, presentes em cada comando. As mensagens são produzidas pelos métodos das [[Programação com Objectos/Projecto de Programação com Objectos/Material de Apoio ao Desenvolvimento|bibliotecas de suporte]] ('''po-uilib''' e '''hva-app'''). As mensagens não podem ser usadas no núcleo da aplicação ('''hva-core'''). Além disso, não podem ser definidas novas. Potenciais omissões devem ser esclarecidas antes de qualquer implementação.
 
A apresentação de listas (e.g., animais, funcionários, vacinas, etc.) faz-se por ordem crescente da respectiva chave. A ordem deve ser lexicográfica (UTF-8), não havendo distinção entre maiúsculas e minúsculas.
 
De um modo geral, sempre que no contexto de uma operação com o utilizador aconteça alguma excepção, então a operação não deve ter qualquer efeito no estado da aplicação, excepto se indicado em contrário na operação em causa. As excepções estão na package '''hva.app.exceptions''', excepto se houver indicação contrária.
 
As excepções usadas na interacção (subclasses de '''pt.tecnico.uilib.menus.CommandException'''), excepto se indicado, são lançadas pelos comandos (subclasses de '''pt.tecnico.uilib.menus.Command''') e tratadas pelos menus (instâncias de subclasses de '''pt.tecnico.uilib.menus.Menu'''). Outras excepções não devem substituir as fornecidas nos casos descritos.
 
{{CVSCode|Note-se que o programa principal e os comandos e menus, a seguir descritos, já estão parcialmente implementados nas ''packages'' '''hva.app''', '''hva.app.main''', '''hva.app.edit''', '''hva.app.search'''. Estas classes são de uso obrigatório e estão disponíveis no [[Programação com Objectos/Projecto de Programação com Objectos/Repositório GIT|GIT]] (módulo '''hva-app''').}}
 
== Menu Principal ==
As acções deste menu permitem gerir a salvaguarda do estado da aplicação, abrir submenus e aceder a alguma informação global. A lista completa é a seguinte: [[#Salvaguarda do estado actual da aplicação|Criar]], [[#Salvaguarda do estado actual da aplicação|Abrir]], [[#Salvaguarda do estado actual da aplicação|Guardar]], [[#Gestão e consulta de dados da aplicação|Menu de Operação]].
 
As etiquetas das opções deste menu estão definidas na classe '''hva.app.main.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em  '''hva.app.main.Prompt''' e '''hva.app.main.Message'''.
 
{{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''xxl.app.main''' (disponível no GIT), respectivamente: '''DoNew''', '''DoOpen''', '''DoSave''', '''DoOpenOperationMenu'''.}}
 
=== Salvaguarda do estado actual da aplicação ===
 
Inicialmente, a aplicação não tem nenhuma folha, excepto quando usada a propriedade '''import''' (ver abaixo) para pré-carregar dados iniciais. Na situação em que a aplicação começa sem nenhuma folha, apenas são apresentadas as opções Criar e Abrir, pois as restantes necessitam da existência de uma folha. As opções irrelevantes nesta situação devem ser omitidas.
O conteúdo da aplicação (toda a informação actualmente em memória) pode ser guardado para posterior recuperação (via serialização Java: '''java.io.Serializable'''). Na leitura e escrita do estado da aplicação, devem ser tratadas as excepções associadas. A funcionalidade é a seguinte:
 
* '''Criar''' -- Cria uma nova aplicação vazia: a aplicação não fica associada a nenhum ficheiro (é anónima).
* '''Abrir''' -- Carrega os dados de uma sessão anterior a partir de um ficheiro previamente guardado (ficando este ficheiro associado à aplicação, para futuras operações de salvaguarda). Pede-se o nome do ficheiro a abrir ('''Prompt.openFile()'''). Caso ocorra um problema na abertura ou processamento do ficheiro, deve ser lançada a excepção '''FileOpenFailedException'''. A execução bem-sucedida desta opção substitui toda a informação da aplicação.
* '''Guardar''' -- Guarda o estado actual da aplicação no ficheiro associado. Se não existir associação, pede-se o nome do ficheiro a utilizar, ficando a ele associado (para operações de salvaguarda subsequemtes). Esta interacção realiza-se através do método '''Prompt.newSaveAs()'''. Não é executada nenhuma acção se não existirem alterações desde a última salvaguarda.
 
Apenas existe um hotel na aplicação. Quando se abandona uma aplicação com modificações não guardadas (porque se cria ou abre outra), deve perguntar-se se se quer guardar a informação actual antes de a abandonar, através de '''Prompt.saveBeforeExit()''' (a resposta é obtida invocando '''readBoolean()''' ou de '''Form.confirm()''').
 
Note-se que a opção '''Abrir''' não permite a leitura de ficheiros de texto (estes apenas podem ser utilizados no início da aplicação).
 
A opção '''Sair''' nunca implica a salvaguarda do estado da aplicação, mesmo que existam alterações.
 
=== Gestão e consulta de dados da aplicação ===
 
Além das operações de manipulação de ficheiros, existe ainda no menu principal a seguinte opção.
 
* '''Menu de Operação''' -- Abre o menu de operação.
 
Este menu mostra a lista de operações disponíveis sobre os vários grupos de entidades geridas pela aplicação.
 
== Menu de Operação ==
 
O '''Menu de Operação''' permite aceder aos menus relativos a aspectos específicos da informação do hotel: [[#Menu de Gestão de Animais|Gestão de Animais]], [[#Menu de Gestão de Funcionários|Gestão de Funcionários]], [[#Menu de Gestão de Vacinas|Gestão de Vacinas]], [[#Menu de Gestão de Habitats|Gestão de Habitats]], [[#Menu de Consultas|Consultas]] e [[#Ver Estado de Satisfação|Ver Estado de Satisfação]]. As secções abaixo descrevem pormenorizadamente as acções associadas a estas opções.
 
{{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''hva.app.edit''' (disponível no GIT), respectivamente: '''DoOpenAnimalsMenu''', '''DoOpenEmployeesMenu''', '''DoOpenHabitatsMenu''', '''DoOpenVaccinesMenu''', '''DoOpenLookupsMenu''', '''DoShowGlobalSatisfaction'''.}}
 
== Menu de Gestão de Animais ==
 
O menu de edição permite visualizar e alterar o conteúdo das células da folha activa. A lista completa é a seguinte: [[#Visualizar|Visualizar]], [[#Registar|Registar]], [[#Transferir|Transferir]], [[#Falar|Falar]], [[#Calcular Satisfação|Calcular Satisfação]]. As secções abaixo descrevem estas opções.
 
As etiquetas das opções deste menu estão definidas na classe '''hva.app.animal.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em  '''hva.app.animal.Prompt''' e '''hva.app.animal.Message'''.
 
Sempre que o sistema pedir a cadeia de caracteres correspondentes ao identificador de um animal ('''Prompt.animalKeyReq()''') (cadeia de caracteres) e o identificador não existir, deve ser lançada a excepção '''hva.app.animal.UnknownAnimalKeyException''' (excepto no processo de registo). Do mesmo modo, sempre que o sistema pedir a cadeia de caracteres correspondentes ao identificador de uma espécie ('''Prompt.speciesKeyReq()''') (cadeia de caracteres) e o identificador não existir, deve ser lançada a excepção '''hva.app.animal.UnknownSpeciesKeyException''' (excepto no processo de registo).
 
{{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''hva.app.animal''' (disponível no GIT), respectivamente: '''DoShowAllAnimals''', '''DoRegisterAnimal''', '''DoTransferToHabitat''', '''DoSpeak''', '''DoShowSatisfactionOfAnimal'''.}}
 
=== Visualizar ===
Esta opção permite visualizar todos os animais.
 
O formato de apresentação de cada animal é o seguinte:
 
ANIMAL|''idAnimal''|''nomeAnimal''|''idEspécie''|''falaAnimal''|''habitat''
 
=== Registar ===
Esta opção permite registar um novo animal.
 
O sistema pede o identificador que ficará associado ao animal. De seguida pede o nome do animal ('''Prompt.animalName()'''), o identificador da espécie ('''Prompt.speciesKey()'''), a fala do animal ('''Prompt.speech()''') e o identificador do habitat ('''Prompt.habitatKey()''').
 
Quando o identificador da espécie não existe, antes de pedir a fala do animal pede o nome da espécie ('''Prompt.speciesName()''') (uma cadeia de caracteres). Quando o identificador do habitat não existe, lança a excepção '''UnknownHabitatKeyException'''.
 
Se o identificador do animal já existir, lança a excepção '''DuplicateAnimalKeyException''', não se processando o registo.
 
=== Transferir ===
Esta opção permite transferir um animal de um habitat para outro.
 
O sistema pede o identificador do animal e o habitat de destino ('''Prompt.habitatKey()'''). Em caso de erro, o habitat não é alterado.
 
=== Falar ===
Esta opção permite provocar a fala de um animal.
 
O sistema pede o identificador do animal, devendo ser apresentada de imediato a sua fala.
 
=== Calcular Satisfação ===
Esta opção permite apresentar a satisfação de um animal.
 
O sistema pede o identificador do animal, sendo apresentada a sua satisfação (número inteiro arredondado).
 
== Menu de Gestão de Funcionários ==
 
O menu de edição permite visualizar e alterar o conteúdo das células da folha activa. A lista completa é a seguinte: [[#Visualizar|Visualizar]], [[#Registar|Registar]], [[#Atribuir Responsabilidade|Atribuir Responsabilidade]], [[#Retirar Responsabilidade|Retirar Responsabilidade]], [[#Calcular Satisfação|Calcular Satisfação]]. As secções abaixo descrevem estas opções.
 
As etiquetas das opções deste menu estão definidas na classe '''hva.app.employee.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em '''hva.app.employee.Prompt''' e '''hva.app.employee.Message'''.
 
Sempre que for pedido o identificador de um funcionário ('''Prompt.employeeKey()''') e o identificador não existir, deve ser lançada a excepção '''UnknownEmployeeKeyException'''.
 
{{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''hva.app.employee''' (disponível no GIT), respectivamente: '''DoShowAllEmployees''', '''DoRegisterEmployee''', '''DoAddResponsibility''', '''DoRemoveResponsibility''', '''DoShowSatisfactionOfEmployee'''.}}
 
=== Visualizar ===
Esta opção permite visualizar todos os funcionários.
 
O formato de apresentação é o seguinte:
 
''tipo''|''id''|''nome''|''idResponsabilidades''
 
Os valores para o campo ''tipo'' são '''VET''' ou '''TRT'''.
Os valores para o campo ''idResponsabilidades'' são os identificadores, separados por vírgulas, dos habitats que um tratador pode limpar ou das espécies de animais que um veterinário pode tratar.
 
=== Registar ===
Esta opção permite registar um novo funcionário.
 
O sistema pede o tipo de funcionário ('''Prompt.employeeType()'''). A resposta deve ser '''VET''' (é registado um veterinário) ou '''TRT''' (é registado um tratador). Se a resposta não corresponder a nenhum dos dois valores, a pergunta é repetida até se obter uma resposta válida.
 
O sistema pede o identificador do funcionário, assim como o seu nome ('''Prompt.employeeName()''') (cadeia de caracteres) e regista-se o novo funcionário. Quando um funcionário é registado fica sem qualquer responsabilidade.
 
Se já existir um funcionário com o mesmo identificador, deve ser lançada a excepção '''DuplicateEmployeeKeyException''', não se realizando qualquer acção.
 
=== Atribuir Responsabilidade ===
Esta opção permite atribuir nova responsabilidade a um funcionário.
 
O sistema pede o identificador do funcionário e o identificador da nova responsabilidade ('''Prompt.responsibilityKey()'''): o identificador de uma espécie, se for um veterinário, ou o identificador de um habitat se for um tratador.
 
Se o funcionário já tinha essa responsabilidade, não é executada nenhuma acção.
 
=== Retirar Responsabilidade ===
Esta opção permite retirar uma responsabilidade a um funcionário.
 
O sistema pede o identificador do funcionário e o identificador da responsabilidade a retirar ('''Prompt.responsibilityKey()'''): o identificador de uma espécie, se for um veterinário, ou o identificador de um habitat se for um tratador. Se a responsabilidade não estava atribuída ao funcionário é lançada a excepção '''NoResponsabilityException'''.
 
=== Calcular Satisfação ===
Esta opção permite calcular a satisfação de um funcionário.
 
O sistema pede o identificador do funcionário, sendo apresentada a sua satisfação (número inteiro arredondado).
 
== Menu de Gestão de Habitats ==
 
O menu de edição permite visualizar e alterar o conteúdo das células da folha activa. A lista completa é a seguinte: [[#Visualizar|Visualizar]], [[#Registar|Registar]], [[#Alterar área|Alterar área]], [[#Associar espécie|Associar espécie]], [[#Plantar árvore|Plantar árvore]], [[#Alterar árvore|Alterar árvore]], [[#Avançar vida de árvore|Avançar vida de árvore]] e [[#Consultar Árvores|Consultar Árvores]]. As secções abaixo descrevem estas opções.
 
As etiquetas das opções deste menu estão definidas na classe '''hva.app.habitat.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em '''hva.app.habitat.Prompt''' e '''hva.app.habitat.Message'''.
 
Sempre que for pedido o código de um habitat ('''Prompt.habitatKey()''') e o código não existir, deve ser lançada a excepção '''UnknownHabitatKeyException'''. Quando for pedido o código de uma árvore ('''Prompt.treeKey()''') e o código não existir, deve ser lançada a excepção '''UnknownTreeKeyException'''.
 
{{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''hva.app.habitat''' (disponível no GIT), respectivamente: '''DoShowAllHabitats''', '''DoRegisterHabitat''', '''DoChangeHabitatArea''', '''DoAddSpeciesToHabitat''', '''DoRemoveSpeciesFromHabitat''', '''DoAddTreeToHabitat''', '''DoChangeTreeLifecycle''', '''DoAdvanceLifecycleOfTreesInHabitat''', '''DoShowAllTreesInHabitat'''.}}
 
=== Visualizar ===
Esta opção permite visualizar um único habitat.
 
O formato de apresentação é o seguinte:
 
HABITAT|''idHabitat''|''nome''|''área''|''númeroÁrvores''
 
A linha inicial é seguida de várias linhas, cada uma com a descrição de cada árvore pertencente ao habitat:
 
ÁRVORE|''idÁrvore''|''nomeÁrvore''|''dificuldadeLimpeza''|''cicloBiológico''
 
Os possíveis valores para o campo '''cicloBiológico''' são: '''PERENE''', '''COMFOLHAS''', '''SEMFOLHAS''', '''LARGARFOLHAS''' e '''GERARFOLHAS'''.
 
=== Registar ===
Esta opção permite registar um novo habitat.
 
O sistema pede o identificador do habitat. Se não existir nenhum impedimento, pede-se o nome ('''Prompt.habitatName()''') (cadeia de caracteres) e a área do habitat ('''Prompt.habitatArea()''') (número inteiro), sendo registado o novo habitat.
 
Deve ser lançada a excepção '''DuplicateHabitatKeyException''', se existir um habitat com o mesmo identificador, não se realizando qualquer acção.
=== Alterar área ===
Esta opção permite alterar a área de um habitat.
 
O sistema pede o identificador do habitat assim como a nova área desse habitat ('''Prompt.habitatNewArea()''') (número inteiro).
 
=== Associar espécie ===
Esta opção permite associar uma espécie a um habitat.
 
O sistema pede o identificador do habitat assim como o identificador de uma espécie ('''Prompt.speciesKey()''') (cadeia de caracteres). De seguida pergunta ('''Prompt.habitatInfluence()''') se a associação é positiva (resposta: '''POS'''), ou se é negativa (resposta: '''NEG'''). Se a resposta não corresponder a nenhum dos dois valores, a pergunta é repetida até se obter uma resposta válida.
 
=== Plantar árvore ===
Esta opção permite introduzir nova árvore num habitat.
 
O sistema pede o identificador da árvore. De seguida, pede-se o nome ('''Prompt.treeName()''') (cadeia de caracteres), a dificuldade de limpeza associado à árvore ('''Prompt.treeDifficulty()''') (número inteiro), registado-se a nova árvore.
 
Quando uma árvore de folha caduca é registada fica no estado com folhas.
 
Se já existir uma árvore com o mesmo identificador, é lançada a excepção '''DuplicateTreeKeyException''', não se realizando qualquer acção.
 
=== Alterar árvore ===
Esta opção permite alterar o ciclo biológico de uma árvore.
 
O sistema pede o identificador da árvore e a sua nova situação biológica ('''Prompt.treeState()''') (cadeia de caracteres). A resposta deve ser  '''COMFOLHAS''', '''SEMFOLHAS''', '''LARGARFOLHAS''' ou '''GERARFOLHAS'''. Se a resposta não corresponder a nenhum dos dois valores, a pergunta é repetida até se obter uma resposta válida.
 
=== Avançar vida de árvore ===
Esta opção permite avançar o ciclo biológico de uma árvore.
 
O sistema pede o identificador da árvore e avança a sua vida, i.e., faz com que evolua no seu ciclo.
 
=== Consultar Árvores ===
Esta opção permite visualizar todas as árvores de todos os habitats.
 
O sistema apresenta todas as árvores registadas no sistema. O formato de apresentação é como descrito acima.
 
== Menu de Gestão de Vacinas ==
 
O menu de edição permite visualizar e alterar o conteúdo das células da folha activa. A lista completa é a seguinte: [[#Visualizar|Visualizar]], [[#Registar|Registar]], [[#Vacinar|Vacinar]], [[#Consultar vacinações|Consultar vacinações]]. As secções abaixo descrevem estas opções.
 
As etiquetas das opções deste menu estão definidas na classe '''hva.app.vaccine.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em '''hva.app.vaccine.Prompt''' e '''hva.app.vaccine.Message'''.
 
Sempre que o sistema pedir o inteiro correspondente ao identificador de uma vacina ('''Prompt.vaccineKey()''') e ela não existir, deve ser lançada a excepção '''UnknownVaccineKeyException'''.
 
{{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''hva.app.animal''' (disponível no GIT), respectivamente: '''DoShowVaccine''', '''DoRegisterVaccine''', '''DoVaccinateAnimal''', '''DoShowVaccinations'''.}}
 
=== Visualizar ===
Esta opção permite visualizar todas as vacinas.
 
O formato de apresentação de cada vacina, uma por linha, é o seguinte:
 
VACINA|''idVacina''|''nomeVacina''|''númeroAplicações''|''espécies''
 
O campo '''espécies''' contém os identificadores, separados por vírgulas, das espécies de animais que podem receber a vacina.
 
=== Registar ===
Esta opção permite registar nova vacina.
 
O sistema começa por pedir o identificador da vacina. Se já existir uma vacina com o mesmo identificador, deve ser lançada a excepção '''DuplicateVaccineKeyException''', não se realizando qualquer acção. Caso contrário, pede-se o nome ('''Prompt.vaccineName()''') (cadeia de caracteres) da vacina.
 
Antes de criar e registar a nova vacina, são pedidos os identificadores das espécies que podem receber esta vacina ('''Prompt.speciesKey()''') (lista de identificadores separados por vírgulas -- os espaços brancos são irrelevantes nesta resposta).
 
=== Vacinar ===
Esta opção permite registar a vacinação de um animal.
 
O sistema pede o identificador do veterinário ('''Prompt.veterinaryKey()''') e o identificador do animal a vacinar ('''Prompt.animalKey()'''). Se o veterinário não tiver permissão para ministrar a vacina deve ser lançada a excepção '''VeterinaryNotAuthorizedException'''.
 
De seguida é pedido o identificador da vacina a ministrar, e se esta não for adequada ao animal, deve ser apresentada uma mensagem de aviso ('''Message.wrongVaccine()''').
 
=== Consultar vacinações ===
Esta opção permite listar o histórico de vacinações.
 
O sistema lista todas as vacinas ministradas, usando o seguinte formato:
 
REGISTO-VACINA|''idVacina''|''idVeterinário''|''idEspécie''
 
== Menu de Consultas ==
 
O menu de consultas permite efectuar pesquisas sobre as células da folha activa, produzindo listas de células. Sempre que for feita uma consulta e nenhuma entidade satisfizer as condições associadas ao pedido, nada deve ser apresentado.
 
A lista completa das consultas é a seguinte: [[#Consultar animais de um habitat|Consultar animais de um habitat]], [[#Consultar vacinas de um animal|Consultar vacinas de um animal]], [[#Consultar actos médicos de um veterinário|Consultar actos médicos de um veterinário]], [[#Consultar vacinas dadas com incúria|Consultar vacinas dadas com incúria]]. As secções abaixo descrevem estas opções.
 
As etiquetas das opções deste menu estão definidas na classe '''hva.app.search.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em '''hva.app.search.Prompt''' e '''hva.app.search.Message'''.
 
{{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''hva.app.search''' (disponível no GIT), respectivamente: '''DoShowAnimalsInHabitat''', '''DoShowMedicalActsOnAnimal''', '''DoShowMedicalActsByVeterinary''', '''DoShowWrongVaccinations'''.}}
 
=== Consultar animais de um habitat ===
Esta opção permite consultar informação relativa a animais.
 
O sistema pede o código do habitat, apresentando os animais que residem nesse habitat.
 
=== Consultar vacinas de um animal ===
Esta opção permite consultar informação relativa a vacinas.
 
O sistema pede o identificador do animal pretendido ('''Prompt.animalReq()'''), apresentando as vacinas.
 
=== Consultar actos médicos de um veterinário ===
Esta opção permite consultar informação relativa a vacinas.
 
O sistema pede o identificador de um funcionário ('''Prompt.vetReq()'''). Se o identificador não for de um veterinário não faz nada, mas se for o identificador de um veterinário, apresenta todas as vacinas por ele realizadas.
 
=== Consultar vacinas dadas com incúria ===
Esta opção permite consultar informação relativa a vacinas.
 
O sistema apresenta todas as ocorrências que provocaram problemas de fala aos animais.
 
== Ver Estado de Satisfação Global ==
 
O sistema apresenta, de imediato, o somatório dos estados de satisfação de todas as entidades registadas no hotel: animais e funcionários.
 
= Inicialização por Ficheiro de Dados Textuais =
 
Por omissão, quando a aplicação começa, não contém nenhuma informação. No entanto, além das opções de manipulação de ficheiros descritas no [[#Salvaguarda do Documento Actual|menu principal]], é possível iniciar exteriormente a aplicação com um ficheiro de texto especificado pela propriedade Java '''[[#Execução dos Programas e Testes Automáticos|import]]'''. Quando se especifica esta propriedade, a aplicação é povoada com os objectos correspondentes ao conteúdo do ficheiro indicado.
 
No processamento destes dados, assume-se que não existem entradas mal-formadas e assume-se que os identificadores referidos numa entrada já foram previamente descritos. Sugere-se a utilização do método '''String.split()''' para dividir uma cadeia de caracteres em campos.
 
No formato abaixo: para os habitats, só os 4 primeiros campos são obrigatórios, correspondendo os opcionais a árvores implantadas no recinto; para os tratadores, só os 3 primeiros campos são obrigatórios, correspondendo os opcionais a habitats; e, para os veterinários e vacinas, só os 3 primeiros campos são obrigatórios, correspondendo os opcionais a espécies de animais.
 
No seguinte exemplo, o conteúdo do ficheiro inicial ('''test.import''') correspondente à folha apresentada a seguir.
{{CollapsedCode|Exemplo de ficheiro de entrada textual|
<source lang="text">
TREE|T1|Pinheiro 1|20|PERENE
TREE|T4|Pinheiro 4|20|PERENE
TREE|T2|Acácia|10|COMFOLHAS
TREE|T6|Eucalipto|10|SEMFOLHAS
TREE|T3|Oliveira|20|COMFOLHAS
TREE|01|Oliveira preta|20|GERARFOLHAS
TREE|30|Oliveira verde|20|LARGARFOLHAS
HABITAT|AR1|Aldeia dos Macacos|20|T3,01,30,T2
HABITAT|AR2|Floresta tropical|30|T1,T4,T6
HABITAT|AR3|Deserto|3
SPECIES|C10|ave
SPECIES|C8|mamífero
SPECIES|C1|peixe
ANIMAL|A1|Alex|C10|ruuuuuuuuuuuuu|AR1
ANIMAL|A2|Nemo|C1|gluglu|AR2
ANIMAL|AA|Bobi|C8|ãoão rrrrrrrrr|AR1
ANIMAL|MA|Chita|C8|huhu huhu|AR2
VET|V2|Jorge Figueiredo|C10,C8,C1
VET|V4|Filomena Figueiredo
VET|VR|Abdul Figueiredo|C8
KEEPER|W2SO4|John Figueiredo|AR2,AR3
KEEPER|W2O|Rohit Figueiredo|AR1
KEEPER|W24|Rohit Figueiredo
VACCINE|V3|Tétano|C8
VACCINE|V200|Parasitas intestinais|C10,C8,C1
VACCINE|V42172|Tétano|C10
VACCINE|Vexperimental|Gripe A1|C8
</source>
}}
 
A codificação dos ficheiros a ler é garantidamente [[wp:UTF-8|UTF-8]].
 
{{Suggestion|Note-se que o programa nunca produz ficheiros com este formato.}}
 
= Execução dos Programas e Testes Automáticos =
 
Usando os ficheiros '''test.import''', '''test.in''' e '''test.out''', é possível verificar automaticamente o resultado correcto do programa. Note-se que é necessária a definição apropriada da variável '''CLASSPATH''' (ou da opção equivalente '''-cp''' do comando '''java'''), para localizar as classes do programa, incluindo a que contém o método correspondente ao ponto de entrada da aplicação ('''hva.app.App.main'''). As propriedades são tratadas automaticamente pelo código de apoio.
 
        java -Dimport=test.import -Din=test.in -Dout=test.outhyp hva.app.App
 
Assumindo que aqueles ficheiros estão no directório onde é dado o comando de execução, o programa produz o ficheiro de saída '''test.outhyp'''. Em caso de sucesso, os ficheiros das saídas esperada ('''test.out''') e obtida ('''test.outhyp''') devem ser iguais. A comparação pode ser feita com o comando:
 
        diff -b test.out test.outhyp
 
Este comando não deve produzir qualquer resultado quando os ficheiros são iguais. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido, apenas verificando alguns aspectos da sua funcionalidade.
<!--
[[category: Ensino]]
[[category:PO]]
[[category: Projecto de PO]]
[[en:Object-Oriented Programming]]
-->

Latest revision as of 13:48, 6 September 2024