|
|
| (141 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| {{PRJPOAvisosEN20172018}}
| | #REDIRECT [[ist:Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2017-2018 (rascunho de Agosto)]] |
| {{PRJPOMandatory20172018}}
| |
| {{TOCright}}
| |
| <!--'''<font color="red">ÉPOCA NORMAL</font>'''-->
| |
| | |
| O objectivo do projecto é criar uma aplicação que gere os itinerários de passageiros que usam comboios.
| |
| | |
| Os itinerários são constituídos por um ou mais segmentos, realizados por comboios que cumprem horários pré-definidos.
| |
| | |
| Neste texto, o tipo '''negrito''' indica um literal (i.e., é exactamente como apresentado); o símbolo <amsmath>\verb*| |</amsmath> indica um espaço; e o tipo ''itálico'' indica uma parte variável (i.e., uma descrição).
| |
| | |
| = Estrutura dos serviços, dos passageiros e dos itinerários =
| |
| | |
| Existem três conceitos básicos: serviços, passageiros e itinerário.
| |
| | |
| == Estrutura de um serviço ==
| |
| | |
| Um serviço é um percurso realizado por um comboio ao longo de vários locais. A cada local está associado o momento de partida do comboio. <!--Por simplicidade, considera-se que a hora de partida é sempre igual à de chegada.--> Além dos locais de paragem, o serviço tem um identificador numérico único.
| |
| | |
| <!--{{CollapsedCode|Exemplo de horário com duas classes de serviço: Serviço 131: Lisboa >> Braga|
| |
| Serviço #131 - Conforto 46.50 / Turística 32.80
| |
| 07:00 Lisboa - Santa Apolónia
| |
| 07:09 Lisboa - Oriente
| |
| 08:45 Coimbra-B
| |
| 09:12 Aveiro
| |
| 09:39 Vila Nova de Gaia
| |
| 09:46 Porto - Campanhã
| |
| 10:09 Famalicão
| |
| 10:15 Nine
| |
| 10:25 Braga
| |
| }}
| |
| -->
| |
| {{CollapsedCode|Exemplo de horário com duas classes de serviço: Serviço 180: Porto >> Faro|
| |
| Serviço #180 - Conforto 70.70 / Turística 51.50
| |
| 05:47 Porto - Campanhã
| |
| 05:52 Vila Nova de Gaia
| |
| 06:21 Aveiro
| |
| 06:46 Coimbra-B
| |
| 08:23 Lisboa - Oriente
| |
| 08:31 Lisboa - Entrecampos
| |
| 09:06 Pinhal Novo
| |
| 10:54 Tunes
| |
| 11:01 Albufeira - Ferreiras
| |
| 11:13 Loulé
| |
| 11:23 Faro
| |
| }}
| |
| | |
| {{CollapsedCode|Exemplo de horário com uma classe de serviço: Serviço 850: Valença >> Porto|
| |
| Serviço #850 - Única 10.95
| |
| 07:36 Valença
| |
| 07:47 Vila Nova de Cerveira
| |
| 07:56 Caminha
| |
| 08:03 Âncora Praia
| |
| 08:16 Viana do Castelo
| |
| 08:20 Areia-Darque
| |
| 08:30 Barroselas
| |
| 08:37 Tamel
| |
| 08:53 Barcelos
| |
| 09:05 Nine
| |
| 09:13 Famalicão
| |
| 09:21 Trofa
| |
| 09:35 Ermesinde
| |
| 09:45 Porto - Campanhã
| |
| }}
| |
| | |
| Cada segmento de um serviço tem um custo base, que depende da distância entre os locais e do tipo de serviço. A distância entre estações corresponde ao tempo gasto na viagem entre essas estações. Assim, considerando que a totalidade do custo do serviço 850 (acima) é de €10.95 (para 129 minutos), o custo do segmento Viana do Castelo >> Nine (para 49 minutos) é de 10.95 * 49 / 129 = €4.16.
| |
| | |
| O preço pago pelo passageiro depende ainda do tipo de cliente, que pode ser normal ou de outros tipos (a adição de novos tipos deve ter impacto reduzido no código da aplicação).
| |
| | |
| Cada serviço suporta uma ou mais classes de serviço. As classes de serviço são "conforto", "turística" e "única".
| |
| | |
| == Estrutura de um passageiro ==
| |
| | |
| Um passageiro tem um identificador único (número inteiro), um nome (cadeia de caracteres) e um tipo a que correspondem descontos na compra de itinerários.
| |
| | |
| Os passageiros normais não dispõem de qualquer tipo de desconto. Os passageiros frequentes (já compraram mais de <!--50000 km em mais de -->10 itinerários) dispõem de 25% de desconto. Se o passageiro já tiver gasto mais de €10000, o desconto é de 50%, mantendo-se as condições anteriores.
| |
| | |
| Passageiros que viajam em classe '''turística''' não têm direito a descontos, independentemente do tipo de passageiro.
| |
| | |
| == Estrutura de um itinerário ==
| |
| | |
| Um itinerário é um conjunto de segmentos, correspondentes a partes de serviços. Cada segmento tem um local e hora de partida e um local e uma hora de chegada. É possível saber, através do serviço associado, qual o percurso a realizar nesse segmento. O custo de cada segmento é o do percurso realizado no serviço e classe correspondente.
| |
| | |
| O custo do itinerário é a soma dos custos dos segmentos individuais. Dependendo do tipo de cliente, podem ser realizados descontos em algumas classes de serviço. A classe de serviço está associada a cada segmento e não ao itinerário em si.
| |
| | |
| = Funcionalidade da aplicação =
| |
| | |
| A aplicação permite manter informação sobre serviços. Permite ainda registar e gerir passageiros e criar novos itinerários para eles. 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).
| |
| | |
| == Consultas de Serviços ==
| |
| | |
| A base de dados de serviços é carregada no início da aplicação, constituindo um grafo lógico. É possível fazer várias consultas sobre serviços (ver abaixo).
| |
| | |
| Não é possível adicionar ou remover serviços durante a execução da aplicação.
| |
| | |
| Deve ser possível adicionar novas consultas sobre serviços sem impacto no código já realizado para a aplicação.
| |
| | |
| == Manipulação de Passageiros ==
| |
| | |
| A aplicação permite realizar várias operações sobre passageiros. É possível obter a lista completa de passageiros conhecidos, assim como informação detalhada sobre passageiros individuais. É ainda possível registar novos passageiros e alterar o nome dos passageiros.
| |
| | |
| Os passageiros podem estar activos (podem adquirir itinerários) ou inactivos (não podem adquirir itinerários).
| |
| | |
| Deve ser possível adicionar novas consultas sobre passageiros sem impacto no código já realizado para a aplicação.
| |
| | |
| == Manipulação de Itinerários ==
| |
| | |
| A aplicação permite obter informações sobre todos os itinerários já comprados ou, em pormenor, sobre os itinerários de passageiros específicos. Permite ainda criar novos itinerários.
| |
| | |
| Deve ser possível adicionar novas consultas sobre itinerários sem impacto no código já realizado para a aplicação.
| |
| | |
| == Serialização ==
| |
| | |
| É possível reiniciar (ou seja, mantendo a informação sobre serviços, eliminar a informação sobre passageiros e itinerários), guardar e recuperar o estado actual da aplicação, preservando todos a informação de horários e itinerários.
| |
| | |
| {{Suggestion|Note-se que não é necessário implementar de raiz a aplicação: já existe uma classe que representa uma fachada para o resto das classes. É esta classe que recebe as solicitações das opções do menu de interacção com o utilizador (abaixo). A fachada já está implementada na class '''mmt.TicketOffice''' e não pode ser alterada. É, no entanto, necessário criar e implementar as classes que suportam a sua operação.}}
| |
| | |
| = 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 proceder à 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-uuilib''' e '''mmt-app'''). As mensagens não podem ser usadas no núcleo da aplicação ('''mmt-core'''). Além disso, não podem ser definidas novas. Potenciais omissões devem ser esclarecidas antes de qualquer implementação.
| |
| | |
| As excepções usadas na interacção, excepto se indicado, são subclasses de '''pt.tecnico.po.ui.DialogException''', são lançadas pelos comandos e tratadas por '''pt.tecnico.po.ui.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 implementados nas ''packages'' '''mmt.app''', '''mmt.app.main''', '''mmt.app.service''', '''mmt.app.passenger''' e '''mmt.app.itinerary'''. 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 CVS|CVS]] (módulo '''mmt-app''').}}
| |
| | |
| == Menu Principal ==
| |
| | |
| As acções do menu permitem gerir a salvaguarda do estado da aplicação e abrir submenus. A lista completa é a seguinte: [[#Salvaguarda do estado actual da aplicação|Reiniciar]], [[#Salvaguarda do estado actual da aplicação|Abrir]], [[#Salvaguarda do estado actual da aplicação|Guardar]] e [[#Gestão e consulta de dados da apliacação|Consulta de Horários]], [[#Gestão e consulta de dados da apliacação|Manipulação de Passageiros]] e [[#Gestão e consulta de dados da apliacação|Manipulação de Itinerários]]. Inicialmente, a aplicação apenas tem informção sobre os serviços que foram carregados no arranque.
| |
| | |
| As etiquetas das opções deste menu estão definidas na classe '''mmt.app.main.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''mmt.app.main.Message'''.
| |
| | |
| {{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''mmt.app.main''' (disponível no CVS), respectivamente: '''DoReset''', '''DoOpen''', '''DoSave''', '''DoOpenServicesMenu''', '''DoOpenPassengersMenu''', '''DoOpenItinerariesMenu'''.}}
| |
| | |
| === Salvaguarda do estado actual da aplicação ===
| |
| | |
| O conteúdo da aplicação (inclui todos os serviços, passageiros e itinerários 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:
| |
| | |
| * '''Reiniciar''' -- Reinicia a aplicação: destrói toda a informação sobre passageiros e itinerários; mantém toda a informação sobre horários.
| |
| * '''Abrir''' -- Carrega os dados de uma sessão anterior a partir de um ficheiro (ficando associado à aplicação). A informação a carregar compreende horários, passageiros e itinerários. Pede-se o nome do ficheiro a abrir ('''openFile()'''). Caso o ficheiro não exista, é apresentada a mensagem '''fileNotFound()'''.
| |
| * '''Guardar''' -- Guarda o estado actual da aplicação (horários, passageiros e itinerários) no ficheiro associado. Se não existir associação, pede-se o nome do ficheiro a utilizar, ficando a ele associado. Esta interacção realiza-se através do método '''newSaveAs()'''. Não é executada nenhuma acção se não existirem alterações desde a última salvaguarda.
| |
| | |
| As opções '''Reiniciar''' e '''Abrir''' substituem a informação na aplicação nas condições indicadas acima.
| |
| | |
| A opção '''Sair''' nunca guarda o estado da aplicação, mesmo que existam alterações.
| |
| | |
| === Gestão e consulta de dados da aplicação ===
| |
| | |
| * '''Consulta de Serviços''' -- Abre o menu de consulta de serviços (se existirem serviços registados).
| |
| * '''Gestão de Passageiros''' -- Abre o menu de gestão de passageiros (se existirem passageiros registados).
| |
| * '''Gestão de Itinerários''' -- Abre o menu de gestão de itinerários (se existirem itinerários registados).
| |
| | |
| == Menu de Consulta de Serviços ==
| |
| | |
| Este menu permite efectuar consultas sobre a base de dados de serviços. A lista completa é a seguinte: [[#Mostrar todos os serviços|Mostrar todos os serviços]], [[#Mostrar serviço com um dado número|Mostrar serviço com um dado número]], [[#Mostrar serviços com origem numa estação dada|Mostrar serviços com origem numa estação dada]], [[#Mostrar serviços com término numa estação dada|Mostrar serviços com término numa estação dada]].
| |
| | |
| As etiquetas das opções deste menu estão definidas na classe '''mmt.app.service.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''mmt.app.service.Message'''.
| |
| | |
| Sempre que for pedido o identificador de um serviço ('''requestServiceId()''') e o serviço não existir, é lançada a excepção '''mmt.app.NoSuchServiceException'''.
| |
| Sempre que for pedido o nome de uma estção ('''requestStationName()''') e a estação não existir, é lançada a excepção '''mmt.app.NoSuchStationException'''.
| |
| | |
| {{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''mmt.app.service''' (disponível no CVS), respectivamente: '''DoShowAllServices''', '''DoShowServiceByNumber''', '''DoShowServicesDepartingFromStation''', '''DoShowServicesArrivingAtStation'''.}}
| |
| | |
| === Mostrar todos os serviços ===
| |
| | |
| Apresenta informações sobre todos os serviços conhecidos. A lista é ordenada pelo identificador do serviço e o formato é o descrito em [[#Mostrar serviço com um dado número|Mostrar serviço com um dado número]].
| |
| | |
| === Mostrar serviço com um dado número ===
| |
| | |
| Apresenta informações sobre um serviço. Depois de pedir o identificador do serviço ('''requestServiceId()'''), apresenta a informação sobre o serviço, tal como indicado no formato seguinte, para um serviço com X classes e N paragens (HH;MM representa o tempo em horas e minutos).
| |
| | |
| {{CollapsedCode|Formato de apresentação de serviço|
| |
| Serviço #''número-do-serviço'' - ''classe-1'' ''preço-da-classe-1'' / ... / ''classe-X'' ''preço-da-classe-X''
| |
| ''HH:MM'' ''nome-de-estação-1''
| |
| ...
| |
| ''HH:MM'' ''nome-de-estação-N''
| |
| }}
| |
| | |
| {{CollapsedCode|Exemplo de apresentação de serviço: Serviço 180: Porto >> Faro|
| |
| Serviço #180 - Conforto 70.70 / Turística 51.50
| |
| 05:47 Porto - Campanhã
| |
| 05:52 Vila Nova de Gaia
| |
| 06:21 Aveiro
| |
| 06:46 Coimbra-B
| |
| 08:23 Lisboa - Oriente
| |
| 08:31 Lisboa - Entrecampos
| |
| 09:06 Pinhal Novo
| |
| 10:54 Tunes
| |
| 11:01 Albufeira - Ferreiras
| |
| 11:13 Loulé
| |
| 11:23 Faro
| |
| }}
| |
| | |
| === Mostrar serviços com origem numa estação dada ===
| |
| | |
| Apresenta os números e estações terminais dos serviços com origem na estação indicada como resposta a '''requestStationName()''', de acordo com o seguinte formato e ordenado por número de serviço:
| |
| | |
| ''número'' ''término''
| |
| | |
| Exemplo (resposta com 2 serviços com origem em Lisboa - Santa Apolónia):
| |
| | |
| 131 Braga
| |
| 4445 Tomar
| |
| | |
| === Mostrar serviços com término numa estação dada ===
| |
| | |
| Apresenta os números e estações de origem dos serviços com término na estação indicada como resposta a '''requestStationName()''', de acordo com o seguinte formato e ordenado por número de serviço:
| |
| | |
| ''número'' ''origem''
| |
| | |
| Exemplo (resposta com 2 serviços com término em Porto - Campanhã):
| |
| | |
| 182 Faro
| |
| 856 Valença
| |
| | |
| == Menu de Gestão de Passageiros ==
| |
| | |
| Este menu permite efectuar operações sobre um passageiro. A lista completa é a seguinte: [[#Mostrar passageiros|Mostrar passageiros]], [[#Mostrar passageiro|Mostrar passageiro]], [[#Registar passageiro|Registar passageiro]], [[#Alterar nome de passageiro|Alterar nome de passageiro]], [[#Suspender passageiro|Suspender passageiro]], [[#Activar passageiro|Activar passageiro]].
| |
| | |
| As etiquetas das opções deste menu estão definidas na classe '''mmt.app.passenger.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''mmt.app.passenger.Message'''.
| |
| | |
| Sempre que for pedido o identificador de um passageiro ('''requestPassengerId()''') e o passageiro não existir, é lançada a excepção '''mmt.app.NoSuchPassengerException'''.
| |
| | |
| {{CVSCode|Estes comandos já estão implementados nas classes da ''package'' '''mmt.app.passenger''' (disponível no CVS), respectivamente: '''ShowPassengers''', '''ShowPassengerDetails''', '''RegisterPassenger''', '''ChangePassengerName''', '''SuspendPassenger''', '''EnablePassenger'''.}}
| |
| | |
| === Mostrar passageiros ===
| |
| | |
| Apresenta informações sobre todos os passageiros conhecidos. A lista é ordenada pelo identificador e o formato é o descrito em [[#Mostrar passageiro|Mostrar passageiro]].
| |
| | |
| === Mostrar passageiro ===
| |
| | |
| Apresenta informações sobre um passageiro. Depois de pedir o identificador do passageiro ('''requestPassengerId()'''), apresenta o nome, o tipo de passageiro, o número de itinerários adquiridos<!--, o valor acumulado de distâncias correspondentes aos itinerários adquiridos--> e o valor pago por esses itinerários. É ainda indicado se o passageiro está activo ('''ACTIVO''') ou inactivo ('''INACTIVO''').
| |
| | |
| Exemplo:
| |
| | |
| <!-- 1234|John Doe|Normal|123|98765|9876.54|ACTIVO-->
| |
| 1234|John Doe|Normal|123|9876.54|ACTIVO
| |
| | |
| === Registar passageiro ===
| |
| | |
| Permite registar um passageiro no sistema. É pedido o nome do passageiro ('''requestPassengerName()'''). O novo passageiro é do tipo '''Normal'''.
| |
| | |
| === Alterar nome de passageiro ===
| |
| | |
| Permite alterar o nome do passageiro. Para tal, pede-se o identificador do passageiro cujo nome deve ser alterado ('''requestPassengerId()''') e o novo nome ('''requestPassengerName()''').
| |
| | |
| === Suspender passageiro ===
| |
| | |
| Permite suspender (temporariamente) o passageiro indicado através do identificador pedido ('''requestPassengerId()'''). A suspensão de um passageiro apenas impede que reserve itinerários, mas não elimina os seus itinerários nem restante informação, sendo possível continuar a fazer consultas,
| |
| | |
| === Activar passageiro ===
| |
| | |
| Permite activar o passageiro indicado através do identificador pedido ('''requestPassengerId()'''). O passageiro volta a poder adquirir itinerários.
| |
| | |
| == Menu de Gestão de Itinerários ==
| |
| | |
| Este menu permite efectuar operações sobre itinerários. A lista completa é a seguinte: [[#Mostrar todos os itinerários|Mostrar todos os itinerários]], [[#Mostrar itinerários associados a um passageiro|Mostrar itinerários associados a um passageiro]], [[#Registar itinerário para um passageiro|Registar itinerário para um passageiro]]<!--, [[#Mostrar histogramas por serviço|Mostrar histogramas por serviço]]-->.
| |
| | |
| As etiquetas das opções deste menu estão definidas na classe '''mmt.app.itinerary.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''mmt.app.itinerary.Message'''.
| |
| | |
| {{CVSCode|Estes comandos já estão parcialmente implementados nas classes da ''package'' '''mmt.app.passenger''' (disponível no CVS), respectivamente: '''DoShowAllItineraries''', '''DoShowPassengerItineraries''', '''DoRegisterItinerary''', '''DoShowTotalValue''', '''DoShowServiceHistograms'''.}}
| |
| | |
| === Mostrar todos os itinerários ===
| |
| | |
| Apresenta todos os itinerários registados para todos os passageiros. O formato de apresentação é como para os serviços, mas apenas se apresenta o segmento viajado e a classe seleccionada no segmento e o respectivo custo. A lista é ordenada pelo número de passageiro e, para cada passageiro, pela estação de partida do itinerário.
| |
| | |
| {{CollapsedCode|Exemplo de apresentação de itinerário: Évora >> Silves|
| |
| Serviço #690 - Turística 5.23
| |
| 07:06 Évora
| |
| 07:17 Casa Branca
| |
| 07:31 Vendas Novas
| |
| 07:52 Pinhal Novo
| |
| Serviço #180 - Turística 5.15
| |
| 09:06 Pinhal Novo
| |
| 10:52 Tunes
| |
| Serviço #5904 - Única 1.83
| |
| 11:06 Tunes
| |
| 11:12 Algoz
| |
| 11:18 Alcantarilha
| |
| 11:23 Poço Barreto
| |
| 11:30 Silves
| |
| }}
| |
| | |
| === Mostrar itinerários associados a um passageiro ===
| |
| | |
| Apresenta os itinerários do passageiro cujo identificador é pedido através de '''requestPassengerId()'''. A lista é ordenada pela estação de origem do itinerário.
| |
| | |
| === Registar itinerário para um passageiro ===
| |
| | |
| Permite registar um novo itinerário para um passageiro. Para tal, pede-se o identificador do passageiro ('''requestPassengerId()'''), a nome da estação de partida ('''requestDepartureStationName()'''), o nome da estação de destino ('''requestArrivalStationName()'') e a hora mínima para a partida ('''requestDepartureTime()'''). Como resultado, o sistema apresenta uma lista com todos os candidatos encontrados (ordenados hierarquicamente pelos seguintes critérios: hora de partida, hora de chegada e tempo de viagem). Se forem encontradas múltiplas alternativas com o mesmo serviço de partida, apenas se apresenta a que chega mais cedo. De seguida, o sistema pede o número da alternativa ('''requestItineraryChoice()''') a guardar (1 para a primeira alternativa, etc.) no registo dos itinerários adquiridos pelo passageiro, actualizando-se o estado correspondente. Se a escolha não corresponder a um número válido, é lançada a excepção '''mmt.app.NoSuchItineraryException''', não sendo realizada nenhuma acção.
| |
| | |
| O formato de apresentação das escolhas é como definido para os itinerários, precedido da linha com o número da escolha (''N'' representa a escolha):
| |
| | |
| <nowiki>===</nowiki> Itinerário ''N'' <nowiki>===</nowiki>
| |
| | |
| {{CollapsedCode|Exemplo de apresentação de hipótese de itinerário: Évora >> Silves (hipótese 17)|
| |
| <nowiki>=== Itinerário 17 ===</nowiki>
| |
| Serviço #690 - Turística 5.23
| |
| 07:06 Évora
| |
| 07:17 Casa Branca
| |
| 07:31 Vendas Novas
| |
| 07:52 Pinhal Novo
| |
| Serviço #180 - Turística 5.15
| |
| 09:06 Pinhal Novo
| |
| 10:52 Tunes
| |
| Serviço #5904 - Única 1.83
| |
| 11:06 Tunes
| |
| 11:12 Algoz
| |
| 11:18 Alcantarilha
| |
| 11:23 Poço Barreto
| |
| 11:30 Silves
| |
| }}
| |
| <!--
| |
| === Mostrar histogramas por serviço ===
| |
| -->
| |
| | |
| = Leitura de Dados a Partir de Ficheiros Textuais =
| |
|
| |
| Além das opções de manipulação de ficheiros descritas no [[#Salvaguarda do Documento Actual|menu principal]], é possível iniciar a aplicação com um ficheiro de texto especificado pela propriedade Java '''[[#Execução dos Programas e Testes Automáticos|import]]'''. Este ficheiro contém um programa que é avaliado pelo interpretador. <!-- Se não existirem definições de variáveis, a avaliação não deixa traços na memória da calculadora. Apenas é lida a primeira expressão presente no ficheiro.--> O programa fica registado com o nome '''import'''.
| |
| | |
| == Exemplo de ficheiro a importar ==
| |
| | |
| O formato é como exemplificado a seguir. A notação "..." significa repetição de formato.
| |
| <text>
| |
| SERVICE|180|CONFORTO=70.7/TURÍSTICA=51.5|05:47|Porto - Campanhã|...|11:23|Faro
| |
| SERVICE|694|CONFORTO=16.2/TURÍSTICA=12.2|16:57|Évora|17:08|Casa Branca|...|18:36|Lisboa - Oriente
| |
| SERVICE|420|ÚNICA=11.45|08:36|Valença|09:09|Viana do Castelo|09:50|Nine|10:18|Porto - Campanhã
| |
| SERVICE|5500|ÚNICA=11.35|15:48|Elvas|...|18:25|Entroncamento
| |
| PASSENGER|Obi-Wan|ACTIVE
| |
| PASSENGER|Yoda|INACTIVE
| |
| ITINERARY|0|690/Turística/07:06/07:52|180/Turística/09:06/10:52|5904/Única/11:06/11:30
| |
| </text>
| |
| | |
| Embora o interpretador de expressões tenha de assinalar problemas relativos à interpretação de expressões mal especificadas, assume-se que não existem entradas mal-formadas nestes ficheiros (embora tenham de ser detectadas).
| |
| | |
| = Considerações sobre Flexibilidade e Eficiência =
| |
|
| |
| 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. Em particular, a solução encontrada para salvaguardar textualmente o conteúdo do documento deve ser suficientemente flexível de modo a permitir visualizar o conteúdo de um documento noutro formato (por exemplo, XML) sem que isso implique alterações no código ''core'' da aplicação.
| |
| | |
| = 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 ('''mmt.app.App.main'''). As propriedades são tratadas automaticamente pelo código de apoio.
| |
| | |
| java -Dimport=test.import -Din=test.in -Dout=test.outhyp mmt.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]]
| |