(→Interação com o Utilizador) |
(→Interação com o utilizador) |
||
Line 87: | Line 87: | ||
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). | 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 ''' | + | 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. |
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. | 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. | ||
Line 93: | Line 93: | ||
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. | 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'' ''' | + | {{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''').}} |
== Endereçamento de Células == | == Endereçamento de Células == | ||
Line 102: | Line 102: | ||
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 Edição]], [[#Gestão e consulta de dados da aplicação|Menu de Consultas]]. | 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 Edição]], [[#Gestão e consulta de dados da aplicação|Menu de Consultas]]. | ||
− | As etiquetas das opções deste menu estão definidas na classe ''' | + | 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''', '''DoMenuOpenEdit''', '''DoMenuOpenSearch'''.}} | {{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''xxl.app.main''' (disponível no GIT), respectivamente: '''DoNew''', '''DoOpen''', '''DoSave''', '''DoMenuOpenEdit''', '''DoMenuOpenSearch'''.}} |
AVISOS - Avaliação em Época Normal |
---|
Esclarecimento de dúvidas:
|
Requisitos para desenvolvimento, material de apoio e actualizações do enunciado (ver informação completa em Projecto de Programação com Objectos):
|
Processo de avaliação (ver informação completa em Avaliação do Projecto):
|
Material de Uso Obrigatório |
---|
As bibliotecas po-uilib e o conteúdo inicial do repositório GIT são de uso obrigatório: |
|
A máquina virtual, fornecida para desenvolvimento do projecto, já contém todo o material de apoio. |
Uso Obrigatório: Repositório GIT |
Apenas se consideram para avaliação os projectos existentes no repositório GIT oficial.
Trabalhos não presentes no repositório no final do prazo têm classificação 0 (zero) (não são aceites outras formas de entrega). Não são admitidas justificações para atrasos em sincronizações do repositório. A indisponibilidade temporária do repositório, desde que inferior a 24 horas, não justifica atrasos na submissão de um trabalho. |
Contents |
EM PREPARAÇÃO
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.
Os animais 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.
Os animais possuem uma chave única (cadeia de caracteres definida na altura do registo).
Cada animal é identificado ainda pelo nome (cadeia de caracteres; não única) e possui ainda informação acerca da sua espécie (cadeia de caracteres) e o estado de saúde (cadeia de caracteres).
Os funcionários possuem uma chave única (cadeia de caracteres definida na altura do registo).
Os tratadores e veterinários são identificados ainda pelo nome (cadeia de caracteres; não única). Cada tratador possui ainda informação acerca dos habitats da sua responsabilidade. Associada a cada veterinário existe ainda informação relativa às espécies que sabe medicar e cujas doenças sabe diagnosticar.
Os habitats uma chave única (cadeia de caracteres definida na altura do registo).
Cada habitat tem ainda um nome (cadeia de caracteres; não única) e uma área (número inteiro). Os habitats são ainda caracterizados pelas árvores que contêm e informação relativa às espécies que residem nesse habitat e cuja satisfação este influencia.
As árvores possuem uma chave única (cadeia de caracteres definida na altura do registo).
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. As árvores de folha perene exigem sempre o mesmo esforço de limpeza do recinto, enquanto que as árvores de folha caduca exigem um esforço diferenciado (factor multiplicativo do grau de dificuldade: um inteiro), consoante o seu ciclo biológico: com folhas, sem folhas, a largar folhas, a gerar folhas.
As vacinas possuem uma chave única (cadeia de caracteres definida na altura do registo).
Cada vacina é identificada ainda pelo nome (cadeia de caracteres; não única) e possui ainda informação acerca das espécies de animais a que pode ser aplicada, e o número de vezes que foi aplicada a cada animal.
A aplicação deve manter um registo da aplicação de vacinas a animais pelos veterinários.
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 carregada no início da aplicação.
É possível registar, visualizar, e operar sobre animais. As operações podem corresponder a alteração da relação dos animais com outras entidades, como transferir animais entre habitats ou vacinar um animal, ou operar sobre um animal específico, e.g., consultar o estado de saúde ou a satisfação do animal num dado momento.
Não é possível remover animais.
É possível registar, visualizar, e operar sobre funcionários. As operações podem corresponder a alteração da relação dos funcionários com outras entidades, como atribuir ou retirar responsabilidades, ou operar sobre um funcionário específico, e.g., consultar a satisfação do funcionário num dado momento.
Não é possível remover funcionários.
É 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.
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relevante, descrita acima.
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.
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 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.
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 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.
Para o pedido de uma gama, utiliza-se a mensagem Prompt.address(). A excepção xxl.app.edit.InvalidCellRangeException é lançada se forem especificados endereços inválidos (excedem o limite da folha de cálculo ou representam gamas de células que não são intervalos verticais ou horizontais).
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: Criar, Abrir, Guardar, Menu de Edição, Menu de Consultas.
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.
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:
Apenas existe uma folha na aplicação. Quando se abandona uma folha 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.
Além das operações de manipulação de ficheiros, existem ainda no menu principal as seguintes opções.
Estas opções só estão disponíveis quando existir uma folha activa válida.
O menu de edição permite visualizar e alterar o conteúdo das células da folha activa. A lista completa é a seguinte: Visualizar, Inserir, Copiar, Apagar, Cortar, Colar e Visualizar cut buffer. As secções abaixo descrevem estas opções.
As etiquetas das opções deste menu estão definidas na classe xxl.app.edit.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em xxl.app.edit.Prompt e xxl.app.edit.Message.
Permite visualizar a gama especificada (Endereçamento), de acordo com os formatos abaixo. Se o conteúdo não for um literal, deve ser apresentado o seu valor e a sua expressão. Não deve ser apresentado qualquer conteúdo para células vazias.
Formatos (valor representa o valor final da célula, inteiro ou cadeia de caracteres, depois de efectuadas todas as avaliações):
linha;coluna|
linha;coluna|valor
linha;coluna|valor=expressão
linha1;coluna|conteúdo linha2;coluna|conteúdo linha3;coluna|conteúdo
linha;coluna1|conteúdo linha;coluna2|conteúdo linha;coluna3|conteúdo
É pedida a gama (Endereçamento). É especificado o conteúdo a inserir (Conteúdo), através da mensagem Prompt.contents(). O conteúdo é inserido em todas as células da gama. Se for inserido um nome de função inexistente, é lançada a excepção xxl.app.edit.UnknownFunctionException.
É pedida a gama (Endereçamento) cujo conteúdo deve ser copiado para o cut buffer.
É pedida a gama (Endereçamento) cujo conteúdo deve ser apagado.
É pedida a gama (Endereçamento). Esta acção corresponde à execução sequencial das acções descritas em Copiar e Apagar.
É pedida a gama (Endereçamento). Insere o conteúdo do cut buffer na gama especificada.
Permite visualizar o conteúdo do cut buffer. O formato de apresentação é o descrito em Visualizar.
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: Procurar Valor, Procurar Função. As secções abaixo descrevem estas opções.
As etiquetas das opções deste menu estão definidas na classe xxl.app.search.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos em xxl.app.search.Prompt e xxl.app.search.Message.
Pede-se o valor a procurar (Prompt.searchValue()) e apresentam-se os resultados.
O termo de pesquisa deve ser comparado com o valor avaliado de cada célula. As células que obedecem ao critério de procura devem ser apresentadas por ordem ascendente de linha e coluna e utilizando o formato especificado em Visualizar. Assim, considere-se o exemplo:
1;1|4 1;2|1 1;3|5 2;1|5=ADD(1;1,1;2) 2;2| 2;3|
Neste exemplo, uma pesquisa pelo valor 5 encontraria as células 1;3 e 2;1.
1;3|5 2;1|5=ADD(1;1,1;2)
Pede-se o segmento a procurar num nome de função (Prompt.searchFunction()) e apresentam-se os resultados ordenados (são apresentados como especificado em Visualizar), de forma ascendente, por nome de função, linha e coluna (por esta ordem).
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 menu principal, é possível iniciar exteriormente a aplicação com um ficheiro de texto especificado pela propriedade Java 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. Sugere-se a utilização do método String.split() para dividir uma cadeia de caracteres em campos.
No seguinte exemplo, o conteúdo do ficheiro inicial (test.import) correspondente à folha apresentada a seguir.
Exemplo de ficheiro de entrada textual |
---|
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
|
A codificação dos ficheiros a ler é garantidamente UTF-8.
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.