Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2026-2027 (rascunho)
From Wiki**3
| 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. |
EM PREPARAÇÃO
ÉPOCA NORMAL
O objectivo do projecto é desenvolver um sistema de gestão de entregas rápidas de produtos (ERP). O sistema deverá permitir, entre outras operações, (i) registar dados de empresas; (ii) registar dados de clientes; (iii) consultar e pesquisar produtos; e (iv) efectuar compras e gerir as entregas correspondentes.
Neste texto, o tipo negrito indica um literal (i.e., é exactamente como apresentado); o símbolo ␣ indica um espaço; e o tipo itálico indica uma parte variável (i.e., uma descrição).
Conceitos e Relações do Modelo
Existem vários conceitos importantes neste contexto: empresas, produtos, clientes, compras e entregas.
Os conceitos listados não são os únicos possíveis no modelo e as suas relações (assim como relações com outros conceitos não mencionados) podem depender das escolhas do projecto.
Os clientes e os produtos são independentes das empresas: existem por si e podem relacionar-se com várias empresas. Cada empresa, no entanto, mantém registo dos clientes com que interage, dos produtos que vende e das entregas que efectua.
Empresas
O sistema mantém um registo das empresas que operam na plataforma. Cada empresa é identificada por um número de empresa. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Cada empresa tem ainda um nome (cadeia de caracteres não vazia).
Cada empresa é responsável por manter actualizada informação sobre:
- os produtos que vende;
- os clientes com que já interagiu (i.e., que lhe fizeram compras);
- as entregas que efectuou.
Note-se que a mesma informação global (produtos e clientes) pode ser partilhada por várias empresas. Deve ser possível adicionar outras propriedades às empresas sem impacto para o código já desenvolvido.
Produtos
O sistema mantém um registo de produtos. Cada produto é identificado por um número de produto. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Todos os produtos têm um nome/descrição (cadeia de caracteres), um preço unitário (número inteiro, por simplicidade), um prazo de entrega (número inteiro de dias) e um número de exemplares em stock.
Cada produto tem uma categoria, de acordo com a sua natureza. Inicialmente, consideram-se as seguintes categorias: (i) alimentar; (ii) electrónica; e (iii) vestuário. Deve ser possível adicionar novas categorias com impacto mínimo na aplicação já desenvolvida.
Os produtos a considerar inicialmente são de dois tipos. As propriedades específicas de cada um (além das gerais) são as seguintes:
- Produto fabricado – nome do fabricante (cadeia de caracteres) e um código de fabrico (cadeia de caracteres).
- Produto importado – país de origem (cadeia de caracteres) e uma taxa alfandegária (número inteiro).
Deve ser possível criar novos tipos de produto. O impacto da introdução dos novos tipos na implementação desenvolvida deve ser mínimo.
Clientes
O sistema mantém um registo de clientes. Cada cliente é identificado por um número de cliente. O identificador é atribuído automaticamente e incrementalmente (a partir de 1 ou do último valor atribuído, caso o estado do sistema tenha sido recuperado). Cada cliente tem ainda informação sobre o seu nome e endereço de correio electrónico. Estes campos não podem ser vazios.
Assume-se que os clientes têm sempre dinheiro, i.e., uma compra nunca é recusada por falta de fundos. Deve, no entanto, ser possível discriminar os clientes segundo outros critérios (por exemplo, o volume de compras), com um impacto mínimo na implementação desenvolvida.
Compras
O sistema regista as compras efectuadas pelos clientes. Cada compra é identificada por um número de compra, atribuído automaticamente e incrementalmente. Uma compra é sempre feita por um único cliente a uma única empresa e regista a data em que foi efectuada.
Uma compra é constituída por um conjunto de linhas (um "cabaz"). Cada linha corresponde a:
- um produto;
- uma quantidade (número de exemplares adquiridos desse produto);
- um preço unitário (o preço do produto no momento da compra);
- um preço total da linha (quantidade × preço unitário).
O preço total dos itens de uma compra é a soma dos preços totais das suas linhas. A cada compra está ainda associada uma sobretaxa de entrega, correspondente a 10% do preço total dos itens (i.e., 10% por item). O preço total da compra é, assim, o preço total dos itens acrescido da sobretaxa de entrega.
Como se descreve na secção seguinte, uma compra pode dar origem a mais do que uma entrega. A divisão de uma compra em várias entregas não acrescenta qualquer custo: a sobretaxa de entrega é sempre 10% do preço total dos itens, independentemente do número de entregas.
Entregas
A cada compra correspondem uma ou mais entregas. As entregas são determinadas a partir dos prazos de entrega dos produtos que constam da compra.
Calcula-se a média dos prazos de entrega dos produtos das linhas da compra. Então:
- todas as linhas cujo produto tem prazo menor ou igual à média são agrupadas numa única entrega (a entrega "conjunta");
- cada linha cujo produto tem prazo estritamente maior do que a média é enviada separadamente, numa entrega própria (uma entrega "conjunta" pode não existir se todas as linhas forem enviadas separadamente).
Cada entrega tem uma data de chegada, calculada a partir da data da compra e do prazo aplicável: uma entrega separada usa o prazo do respectivo produto; a entrega conjunta usa o maior dos prazos dos seus produtos. Como referido acima, o envio separado é feito sem custo adicional.
Por exemplo, considere-se uma compra com três linhas cujos produtos têm os prazos de entrega 3 (P1), 8 (P2) e 2 (P3). A média dos prazos é (3 + 8 + 2) / 3 ≈ 4,33. Logo, P1 e P3 (prazos ≤ 4,33) seguem juntos numa entrega e P2 (prazo > 4,33) segue numa entrega separada:
Entrega A: {P1, P3} (prazo = 3)
Entrega B: {P2} (prazo = 8) -- enviada separadamente
Pesquisas
Para permitir que o sistema ajude os clientes a determinar a existência de um produto, deverá ser possível efectuar pesquisas. As pesquisas consideram os campos relevantes dos vários produtos (por exemplo, o nome e a categoria). O termo de pesquisa deve ser comparado sem distinção entre letras maiúsculas e minúsculas. Deve ser possível introduzir novos métodos de pesquisa de um produto com um impacto mínimo na implementação desenvolvida.
Alterações de Inventário de Produtos
O stock de um produto pode ser alterado, através da especificação de um valor a somar/subtrair ao número de exemplares: se a quantidade indicada for um valor positivo, aumenta-se o número de exemplares disponíveis; se for um valor negativo, decrementa-se o número de exemplares disponíveis desde que o número de exemplares disponíveis não fique negativo.
Caso o número de exemplares de um produto chegue a 0, então o produto deve ser removido do sistema.
Gestão de Tempo
A unidade de tempo do sistema é o dia. A data do sistema começa no dia 1 (um) e faz parte do estado persistente. Sempre que a data é alterada, deve ser verificada a situação das entregas: uma entrega considera-se entregue quando a data actual atinge (ou ultrapassa) a sua data de chegada. Devem ainda ser actualizados outros aspectos que da data dependam.
Notificações
Deve existir um mecanismo de notificações que permita avisar eventuais interessados quando os produtos ficam em determinadas situações:
- Quando um produto sem qualquer exemplar disponível passa a ter pelo menos um exemplar disponível, quer-se enviar uma notificação a todas as entidades que demonstraram interesse nesta situação.
As notificações de um cliente apenas devem ser apresentadas uma única vez. Após esta visualização, considera-se que o cliente fica sem notificações. As notificações devem ser apresentadas pela mesma ordem em que foram enviadas pelo sistema.
No caso de uma entidade interessada em ser avisada da disponibilidade de um produto, isto significa que, sempre que o produto em causa passar da situação de indisponível (todos os exemplares esgotados) para disponível (pelo menos um exemplar), a entidade deve receber uma notificação. Deve ser possível definir novas entidades interessadas e novos tipos de notificação, com impacto mínimo no código do domínio da aplicação.
Requisitos de Desenho
A aplicação a desenvolver deve seguir o princípio de desenho aberto-fechado, por forma a aumentar a extensibilidade do seu código. Por exemplo, deve ser possível adicionar novos tipos de produto com um impacto mínimo no código já existente da aplicação.
Devem ser possíveis extensões ou alterações de funcionalidade com impacto mínimo no código já produzido para a aplicação. O objectivo é aumentar a flexibilidade da aplicação relativamente ao suporte de novas funções. Assim, deve ser possível:
- Adicionar novos tipos de produto (e.g., produtos digitais ou perecíveis);
- Adicionar novas categorias de produto;
- Definir novas entidades que desejem ser notificadas da disponibilidade de produtos;
- Introduzir novos critérios de discriminação/classificação dos clientes;
- Introduzir novos métodos de pesquisa de produtos;
- Alterar a regra de cálculo das entregas e da sobretaxa de entrega com um impacto mínimo no código existente.
Funcionalidade da aplicação
A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir empresas, produtos, clientes e compras. 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).
A aplicação deve estar preparada para que se possa remover qualquer entidade (não apenas produtos).
No início, a aplicação está vazia, mas pode ser carregada uma base de dados textual com conceitos pré-definidos. Neste caso, a aplicação começará com um estado referente às entidades que foram carregadas no arranque da aplicação.
Serialização
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relacionada com o ERP e que foi descrita acima.
Interacçã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 bibliotecas de suporte (po-uilib e erp-app). As mensagens não podem ser usadas no núcleo da aplicação (erp-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 em caso de indicação contrária na operação em causa. As excepções estão na package erp.app.exceptions, excepto em caso de indicação contrária.
As excepções usadas na interacção (subclasses de pt.tecnico.uilib.menus.CommandException), excepto em caso de indicação contrária, 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.
Nos pedidos e usos dos vários identificadores, podem ocorrer as seguintes excepções, caso o identificador indicado não corresponda a um objecto conhecido (excepto no processo de registo ou em caso de indicação contrária). Note-se que estas excepções não são utilizáveis no núcleo da aplicação.
| Tipo de dados | Classe | Pedido a apresentar | Excepção a lançar se desconhecido |
|---|---|---|---|
| Empresa | Company | erp.app.company.Prompt.companyId() | erp.app.exceptions.UnknownCompanyKeyException |
| Produto | Product | erp.app.product.Prompt.productId() | erp.app.exceptions.UnknownProductKeyException |
| Cliente | Client | erp.app.client.Prompt.clientId() | erp.app.exceptions.UnknownClientKeyException |
| Compra | Purchase | erp.app.purchase.Prompt.purchaseId() | erp.app.exceptions.UnknownPurchaseKeyException |
Alguns casos particulares podem usar pedidos específicos não apresentados nesta tabela.
Menu Principal
As acções deste menu permitem gerir a salvaguarda do estado da aplicação e abrir submenus. A lista completa é a seguinte: Abrir, Guardar, Mostrar data actual, Avançar data actual, Menu de Gestão de Empresas, Menu de Gestão de Produtos, Menu de Gestão de Clientes e Menu de Gestão de Compras. Inicialmente, a aplicação apenas tem informação sobre as entidades que foram carregadas no arranque.
Salvaguarda do estado actual da aplicação
O conteúdo da aplicação (toda a informação detida pelo ERP 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:
- 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.
Quando se abandona uma aplicação com modificações não guardadas (porque se abre outra e existem alterações não guardadas), deve perguntar-se ao utilizador se quer guardar a informação actual antes de a abandonar, através de Prompt.saveBeforeExit() (a resposta é obtida via Form.confirm()).
- 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 subsequentes). 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.
Mostrar data actual
A data actual do sistema é apresentada através da mensagem Message.currentDate().
Avançar data actual
O número de dias a avançar é pedido através de Prompt.daysToAdvance(). O valor indicado deve ser positivo. Caso contrário, a operação não tem efeito.
Além da data, o sistema deve actualizar, caso seja necessário, outros aspectos que dela dependam, designadamente, a situação das entregas relativa às suas datas de chegada.
Gestão e consulta de dados da aplicação
- Menu de Gestão de Empresas -- Abre o menu de gestão de empresas e operações associadas.
- Menu de Gestão de Produtos -- Abre o menu de gestão de produtos e operações associadas.
- Menu de Gestão de Clientes -- Abre o menu de gestão de clientes e operações associadas.
- Menu de Gestão de Compras -- Abre o menu de gestão de compras e operações associadas.
Menu de Gestão de Empresas
Este menu permite efectuar operações sobre a base de dados de empresas. A lista completa é a seguinte: Registar empresa, Mostrar empresa, Mostrar empresas, Mostrar produtos de uma empresa, Mostrar clientes de uma empresa.
Registar empresa
Pede o nome (Prompt.companyName()). O registo bem sucedido é assinalado através da mensagem Message.registrationSuccessful(); caso contrário, é lançada a excepção CompanyRegistrationFailedException.
Note-se que a atribuição do identificador da empresa é automática.
Mostrar empresa
É pedido o identificador da empresa, sendo apresentadas as informações sobre essa empresa, de acordo com o seguinte formato:
| Formato de apresentação de uma empresa |
|---|
id - nome |
Mostrar empresas
Apresenta informações sobre todas as empresas, ordenando-as pelos seus identificadores. O formato é o descrito em Mostrar empresa.
Mostrar produtos de uma empresa
É pedido o identificador da empresa e apresentam-se os produtos que essa empresa vende, ordenados pelos seus identificadores, utilizando o formato descrito em Mostrar produto.
Mostrar clientes de uma empresa
É pedido o identificador da empresa e apresentam-se os clientes que já interagiram com essa empresa, ordenados pelos seus identificadores, utilizando o formato descrito em Mostrar cliente.
Menu de Gestão de Produtos
Este menu apresenta as operações disponíveis sobre produtos. A lista completa é a seguinte: Mostrar produto, Mostrar produtos, Alterar inventário de um produto e Efectuar pesquisa.
Mostrar produto
É pedido o identificador do produto. Se o produto existir, é apresentado de acordo com o seguinte formato. O formato genérico de apresentação de um produto é como se segue:
| Formato de apresentação de produtos |
|---|
id - stock - tipo - nome - preço - categoria - informação adicional |
Para produtos fabricados, a informação adicional corresponde ao nome do fabricante e ao código de fabrico (separados pelo carácter ;); para produtos importados, a informação adicional corresponde ao país de origem e à taxa alfandegária.
| Exemplos de apresentação de produtos |
|---|
3 - 20 - FABRICADO - Farinha - 15 - ALIMENTAR - Moageira Nacional; F-0091
4 - 2 - IMPORTADO - Telemóvel - 200 - ELECTRONICA - China - 30
5 - 0 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120
|
Mostrar produtos
Apresenta informações sobre todos os produtos, ordenando-os pelos seus identificadores. O formato de apresentação é como descrito em Mostrar produto.
Alterar inventário de um produto
É pedido o identificador de um produto e uma quantidade (Prompt.amountToUpdate()) e actualizado o número de exemplares disponíveis do produto indicado somando a quantidade indicada ao número de exemplares disponíveis. No caso de não ser possível actualizar o número de exemplares devido ao facto de a quantidade indicada ser inválida, então a operação não deve ter qualquer efeito e deve ser apresentada a mensagem Message.notEnoughInventory().
Efectuar pesquisa
Esta opção realiza uma procura por termo (cadeia de caracteres), pedido através de Prompt.searchTerm(). Como resultado, deve ser apresentada uma lista dos produtos encontrados pela pesquisa, ordenados por ordem crescente do seu identificador, utilizando o formato descrito para Mostrar produto.
O termo de pesquisa deve ser comparado (sem distinção entre letras maiúsculas e minúsculas) com os campos relevantes de cada produto: o nome e a categoria. Só devem ser apresentados produtos que contenham o termo de pesquisa num dos campos relevantes. Caso não sejam encontrados produtos, não deve ser produzido qualquer resultado.
Menu de Gestão de Clientes
Este menu permite efectuar operações sobre a base de dados de clientes. A lista completa é a seguinte: Registar cliente, Mostrar cliente, Mostrar clientes, Mostrar notificações do cliente.
Registar cliente
Pede o nome (Prompt.clientName()) e o endereço de correio electrónico (Prompt.clientEMail()). O registo bem sucedido é assinalado através da mensagem Message.registrationSuccessful(); caso contrário, é lançada a excepção ClientRegistrationFailedException.
Note-se que a atribuição do identificador do cliente é automática e que clientes diferentes são registados em cada operação de registo.
Mostrar cliente
É pedido o identificador do cliente, sendo apresentadas as informações sobre esse cliente, de acordo com o seguinte formato. O valor apresentado após o email corresponde ao total gasto pelo cliente em compras (um valor inteiro).
| Formato de apresentação de um cliente |
|---|
id - nome - email - gasto total |
| Exemplos de apresentação de clientes |
|---|
2 - Alberto Meireles - ameireles@mymail.com - 275
1 - Fernando Meireles - fmeireles@mymail.com - 0
|
Mostrar clientes
Apresenta informações sobre todos os clientes, ordenando-os lexicograficamente pelo nome. Caso existam clientes com o mesmo nome, devem ser ordenados por ordem crescente dos seus identificadores. O formato é o descrito em Mostrar cliente.
Mostrar notificações do cliente
É pedido o identificador do cliente, sendo apresentadas as notificações para esse cliente, de acordo com o seguinte formato:
| Formato de apresentação das notificações de um cliente |
|---|
DISPONIBILIDADE: descrição de produto disponível |
| Exemplos de notificações |
|---|
DISPONIBILIDADE: 5 - 4 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120
|
Note-se que a descrição é idêntica à que é realizada para mostrar cada produto. No entanto, a solução deve ser suficientemente flexível para permitir outros formatos de apresentação das notificações (sem impacto no código do domínio da aplicação).
Menu de Gestão de Compras
Este menu apresenta as operações relacionadas com compras e entregas. A lista completa é a seguinte: Efectuar compra, Mostrar compra, Mostrar compras, Mostrar entregas de uma compra.
Efectuar compra
No processo de efectuar uma compra, o sistema pede, primeiro, a identificação do cliente; de seguida, a identificação da empresa a que a compra é feita; e, finalmente, para cada linha, o identificador do produto e a quantidade pretendida (Prompt.productId() e Prompt.amountToBuy()). O processo de adição de linhas termina de acordo com a interacção definida no comando.
Se não houver exemplares suficientes de um produto para satisfazer a quantidade pretendida, deve ser apresentada a mensagem Message.notEnoughInventory() e essa linha não é adicionada. Concluída a compra, o stock dos produtos é decrementado, a empresa passa a seguir o cliente e são determinadas as entregas correspondentes. A data limite de chegada de cada entrega é comunicada através da mensagem Message.deliveryDate().
Mostrar compra
É pedido o identificador da compra. Na primeira linha apresenta-se a informação da compra; de seguida, apresentam-se as suas entregas em detalhe — cada entrega (identificador da compra e data de chegada) seguida da descrição completa de cada um dos seus produtos (o mesmo formato de Mostrar produto). O formato é o seguinte:
| Formato de apresentação de uma compra (com entregas em detalhe) |
|---|
id - idCliente - idEmpresa - data - preço total dos itens - sobretaxa de entrega - preço total idCompra - data de chegada descrição de produto ... |
| Exemplos de apresentação de compras |
|---|
7 - 3 - 1 - 4 - 90 - 9 - 99
7 - 7
1 - 18 - FABRICADO - Farinha - 15 - ALIMENTAR - Moageira Nacional; F-0091
3 - 2 - FABRICADO - Camisa - 45 - VESTUARIO - Confeccoes Sul; C-1120
7 - 12
2 - 1 - IMPORTADO - Telemovel - 200 - ELECTRONICA - China - 30
|
Mostrar compras
Apresenta informações sobre todas as compras, ordenando-as pelos seus identificadores. O formato é o descrito em Mostrar compra.
Mostrar entregas de uma compra
É pedido o identificador da compra e são apresentadas as entregas correspondentes, ordenadas pela data de chegada e, em caso de empate, pelos identificadores dos produtos. Ao contrário de Mostrar compra (que apresenta as entregas em detalhe), aqui cada entrega é apresentada de forma resumida (uma linha, apenas com os identificadores dos produtos), de acordo com o seguinte formato:
| Formato de apresentação de uma entrega |
|---|
idCompra - data de chegada - lista de identificadores de produtos |
| Exemplos de apresentação de entregas (compra do exemplo da secção Entregas) |
|---|
7 - 7 - 1, 3
7 - 12 - 2
|
Leitura de Dados a Partir de Ficheiros Textuais
Além das opções de manipulação de ficheiros descritas no menu principal, é possível iniciar a aplicação com um ficheiro de texto especificado pela propriedade Java import.
Cada linha tem uma descrição distinta mas que segue o seguinte formato geral. É possível registar empresas, clientes e produtos, e definir os produtos que cada empresa vende. Assume-se que os campos de texto não podem conter o carácter : e que os preços são números inteiros. Não existem entradas mal-formadas.
Os produtos têm o formato descrito abaixo, respectivamente, para produtos fabricados e importados. O campo stock indica o número de exemplares disponíveis do produto.
MANUFACTURED:idEmpresa:nome:preço:categoria:prazo:stock:fabricante:codigo IMPORTED:idEmpresa:nome:preço:categoria:prazo:stock:paisOrigem:taxa
O registo de empresas e de clientes segue os formatos:
COMPANY:nome CLIENT:nome:email
Um exemplo de conteúdo do ficheiro inicial é como se segue:
| Exemplo de ficheiro de entrada textual |
|---|
COMPANY:Moageira Nacional
COMPANY:Importadora Atlantico
CLIENT:Obi-Wan Kenobi:obiwan@jedi.org
MANUFACTURED:1:Farinha:15:ALIMENTAR:3:23:Moageira Nacional:F-0091
IMPORTED:2:Telemovel:200:ELECTRONICA:8:2:China:30
MANUFACTURED:1:Camisa:45:VESTUARIO:2:4:Confeccoes Sul:C-1120
|
A codificação dos ficheiros a ler é garantidamente UTF-8.
Execução do Programa 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 (erp.app.App.main). As propriedades são tratadas automaticamente pelo código de apoio.
java -Dimport=test.import -Din=test.in -Dout=test.outhyp erp.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.
Notas de Implementação
Tal como indicado acima, algumas classes fornecidas como material de apoio, são de uso obrigatório e não podem ser alteradas. Outras dessas classes são de uso obrigatório e têm de ser alteradas.
A serialização Java usa as classes da package java.io, em particular, a interface java.io.Serializable e as classes de leitura java.io.ObjectInputStream e escrita java.io.ObjectOutputStream (entre outras).