Você está na página 1de 6

Universidade Federal de Lavras Departamento de Ciência da Computação GCC – 110 – Programação Orientada a Objetos

I – Observações:

Trabalho Prático:

1) O trabalho pode ser feito em grupo de (no máximo) 4 pessoas. Não é permitido que alunos que cursam a disciplina no período diurno façam trabalhos com alunos do período noturno e vice-versa. É permitido discutir os problemas e estratégias de solução com outros grupos, mas quando se tratar de escrever ou implementar computacionalmente as soluções, isto deve ser feito separadamente. O trabalho deve ser feito em Java ou C++.

2) Forma de entrega: O trabalho deve ser entregue em formato digital por meio do Moodle. Utilizar a opção "Entrega do Trabalho Prático". Anexe um único arquivo .zip contendo todos os arquivos do trabalho (códigos-fonte, executáveis, documentação, etc.). O nome do arquivo .zip a ser enviado deve ser formado pelos nomes de todos os integrantes do grupo. Assim, se o grupo é formado pelos alunos:

Cristiano Leite Castro, Wilian Soares Lacerda e André Pimenta, o nome do arquivo deverá ser: CristianoCL_WilianSL_AndréP.zip.

3) Trabalhos copiados receberão nota zero para todas as cópias. Trabalhos com erros de compilação não serão avaliados e receberão nota zero. O programa deve ser desenvolvido seguindo as boas normas de programação.

Descrição do Trabalho:

Parte I (Peso 60%): Implemente um conjunto de classes para um sistema de controle de oficina mecânica. A oficina necessita manter informações sobre seus clientes, peças, serviços e ordens de serviços (OS). Para isso, foi feito o seguinte projeto (Diagrama de Classes):

OrdemServiço

numeroOSo seguinte projeto (Diagrama de Classes): OrdemServiço dataOS dataPrevTermino dataTermino placaCarro situação * *

dataOSprojeto (Diagrama de Classes): OrdemServiço numeroOS dataPrevTermino dataTermino placaCarro situação * * 1 1

dataPrevTerminoprojeto (Diagrama de Classes): OrdemServiço numeroOS dataOS dataTermino placaCarro situação * * 1 1 Cliente nome

dataTerminode Classes): OrdemServiço numeroOS dataOS dataPrevTermino placaCarro situação * * 1 1 Cliente nome cpf endereço

placaCarroOrdemServiço numeroOS dataOS dataPrevTermino dataTermino situação * * 1 1 Cliente nome cpf endereço fone ItemOS

situaçãonumeroOS dataOS dataPrevTermino dataTermino placaCarro * * 1 1 Cliente nome cpf endereço fone ItemOS tipoItem

* *

1 1

Cliente

dataTermino placaCarro situação * * 1 1 Cliente nome cpf endereço fone ItemOS tipoItem preço qtde

dataTermino placaCarro situação * * 1 1 Cliente nome cpf endereço fone ItemOS tipoItem preço qtde

dataTermino placaCarro situação * * 1 1 Cliente nome cpf endereço fone ItemOS tipoItem preço qtde

dataTermino placaCarro situação * * 1 1 Cliente nome cpf endereço fone ItemOS tipoItem preço qtde

nome

cpf

endereço

fone

ItemOS

tipoItemsituação * * 1 1 Cliente nome cpf endereço fone ItemOS preço qtde * * 0

preço* * 1 1 Cliente nome cpf endereço fone ItemOS tipoItem qtde * * 0 0

qtde* 1 1 Cliente nome cpf endereço fone ItemOS tipoItem preço * * 0 0 1

* *

0

0

1

1

Serviço

codServiçofone ItemOS tipoItem preço qtde * * 0 0 1 1 Serviço descrição preço tempoExecução 11

descriçãotipoItem preço qtde * * 0 0 1 1 Serviço codServiço preço tempoExecução 11 *1 1

preçopreço qtde * * 0 0 1 1 Serviço codServiço descrição tempoExecução 11 *1 1 *

tempoExecuçãoqtde * * 0 0 1 1 Serviço codServiço descrição preço 11 *1 1 * *

11
11

*1

1

*

* *

0 0

1 1

Peça

preço tempoExecução 11 *1 1 * * * 0 0 1 1 Peça codPeça descrição preço

preço tempoExecução 11 *1 1 * * * 0 0 1 1 Peça codPeça descrição preço

preço tempoExecução 11 *1 1 * * * 0 0 1 1 Peça codPeça descrição preço

codPeça

descrição

preço

* *
* *
* * * *
* *
* *
preço tempoExecução 11 *1 1 * * * 0 0 1 1 Peça codPeça descrição preço
* *
* *

qtdeEstoque

Oficina

Classe Cliente:

Atributos: nome (String), cpf (String), endereço (String) e fone (String). Todos com acesso privativo; Método construtor que inicializa todos os atributos através de parâmetros;

Médodos get e set para obter e modificar cada um dos valores dos atributos. Obs.: nem todos os atributos necessitam de métodos acessores e modificadores.

Classe Peça:

Atributos: codPeça (int), descrição (String), preço (double), qtdeEstoque (int). Todos com acesso privativo; Método construtor que inicializa todos os atributos através de parâmetros; Método construtor que inicializa os atributos codPeça, descrição e preço através de parâmetros e o atributo qtdeEstoque com zero; Médodos get e set para obter e modificar os valores dos atributos; Obs.: nem todos os atributos necessitam de métodos acessores e modificadores. Método para incrementar a quantidade em estoque. Parâmetro: a quantidade a ser incrementada; Método para decrementar a quantidade em estoque. Parâmetro: a quantidade

ser decrementada. Não permitir o decremento se a quantidade se tornar menor do que zero.

a

Classe Serviço:

Atributos: codServiço (int), descrição (String), preço (double) e tempoExecução (double, tempo de execução do serviço, em minutos). Todos com acesso

privativo;

Método construtor que inicializa todos os atributos através de parâmetros;

Médodos get e set para obter e modificar os valores dos atributos; Obs.: nem

todos os atributos necessitam de métodos acessores e modificadores.

Classe OrdemServiço:

Atributos: numeroOS (int), dataOS (GregorianCalendar), dataPrevTérmino (GregorianCalendar, data prevista para término), dataTérmino (GregorianCalendar, data de término), placaCarro (String), situação (char, A- Aberta, C-Cancelada, F-Finalizada), cliente (Usuario), itens (lista de ItemOS) e proximoNumero (int). O atributo proximoNumero deve ser estático e será usado para armazenar o próximo número de ordem de serviço. A lista de itens deve ser implementada usando a classe Vector. Todos com acesso privativo; Método construtor que inicializa os atributos com os seguintes valores:

numeroOS (próximo número sequencial), dataOS (data corrente do sistema), dataPrevTérmino, placaCarro e cliente (passados como parâmetros), dataTérmino (null) e situação (“A”); Métodos get para obter os valores dos atributos; Obs.: nem todos os atributos necessitam de métodos acessores e modificadores. Método para adicionar um item (peça) à ordem de serviço (OS). Parâmetros: a peça e a quantidade. A quantidade em estoque da peça deve ser decrementada de acordo com o parâmetro quantidade. Somente é permitido adicionar item em OS aberta (situação = “A”); Método para excluir um item (peça) da OS. Parâmetro: a peça a ser excluída. A quantidade em estoque da peça deve ser incrementada de acordo com a quantidade adicionada. Somente é permitido excluir item de OS aberta (situação

= “A”);

Método para adicionar um item (serviço) à ordem de serviço (OS). Parâmetros:

o serviço. Somente é permitido adicionar item em OS aberta (situação = “A”);

Método para excluir um item (serviço) da OS. Parâmetro: o serviço a ser excluído. Somente é permitido excluir item de OS aberta (situação = “A”); Método para finalizar a OS. A situação da OS deve ser mudada para “F” e a data de término deve receber a data do sistema. Somente é permitido finalizar OS aberta (situação = “A”); Método para cancelar a OS. A situação da OS deve ser mudada para “C”. Somente é permitido cancelar OS aberta (situação = “A”). Todos os itens do tipo peça devem ser devolvidos ao estoque. Cancelar não é o mesmo que excluir, os itens vão continuar na OS.

Classe ItemOS:

Atributos: tipoItem (char, P-Peça, S-Serviço), serviço (Serviço), peça (Peça), preço (double) e qtde (int). Todos com acesso privativo; Método construtor que inicializa os atributos da seguinte forma: peça e qtde (passados como parâmetros), tipoItem com valor “P” (peça) e preço com o valor do atributo preço do objeto peça. Esse método é usado para construir um item do tipo Peça; Método construtor que inicializa os atributos da seguinte forma: serviço (passado como parâmetro), tipoItem com valor “S” (serviço), preço com o valor do atributo preço do objeto serviço e qtde com valor 1. Esse método é usado para construir um item do tipo Serviço; Métodos get para obter os valores dos atributos; Obs.: nem todos os atributos necessitam de métodos acessores.

Classe Oficina:

Atributos: clientes (lista de Cliente), peças (lista de Peça), serviços (lista de Serviço) e OSs (lista de OrdemServiço). As listas devem ser implementadas usando a classe Vector. Todos com acesso privativo; Método para inserir um novo cliente na lista de clientes. Parâmetro: o cliente; Método para inserir uma nova peça na lista de peças. Parâmetro: a peça; Método para inserir um novo serviço na lista de serviços. Parâmetro: o serviço; Método para inserir uma nova ordem de serviço na lista de ordens de serviço. Parâmetro: a ordem de serviço; Método para inserir um novo item (peça) a uma ordem de serviço. Parâmetros:

a ordem de serviço, a peça e a quantidade; Método para inserir um novo item (serviço) a uma ordem de serviço. Parâmetros: a ordem de serviço e o serviço; Método para excluir um cliente da lista de clientes. Parâmetro: o cliente. O cliente não pode ser excluído se existir alguma ordem de serviço para ele; Método para excluir uma peça da lista de peças. Parâmetro: a peça. A peça não pode ser excluída se existir alguma ordem de serviço para ela; Método para excluir um serviço da lista de serviços. Parâmetro: o serviço. O serviço não pode ser excluído se existir alguma ordem de serviço para ele; Método para excluir uma ordem de serviço da lista de ordens de serviços. Parâmetros: a ordem de serviço. Somente é permitido excluir OS aberta (situação = ”A”). Todos os itens devem ser excluídos; Método para excluir um item (peça) de uma ordem de serviço. Parâmetros: a ordem de serviço e a peça; Método para excluir um item (serviço) de uma ordem de serviço. Parâmetros: a ordem de serviço e o serviço; Método para finalizar uma ordem de serviço. Parâmetro: a ordem de serviço; Método para cancelar uma ordem de serviço. Parâmetro: a ordem de serviço; Método para obter a lista de clientes; Método para obter a lista de peças;

Método para obter a lista de serviços; Método para obter a lista de ordens de serviço; Método para gravar os dados em arquivo; Método para ler os dados armazenados em arquivo.

Classe Interface:

Método para apresentar um menu (interface de caracteres) com opções para:

cadastrar um novo cliente, cadastrar uma nova peça, cadastrar um novo serviço, cadastrar uma nova ordem de serviço, inserir um novo item (peça), inserir um novo item (serviço), excluir um cliente, excluir uma peça, excluir um serviço, excluir uma ordem de serviço, excluir um item (peça), excluir um item (serviço), finalizar uma ordem de serviço, cancelar uma ordem de serviço, listar todos os clientes, listar todas as peças, listar todos os serviços, listar todas as ordens de serviço e seus itens e sair do programa; Método para cadastrar um novo cliente. Deve permitir que o usuário entre com os dados do cliente a ser inserido; Método para cadastrar uma nova peça. Deve permitir que o usuário entre com os dados da peça a ser inserida; Método para cadastrar um novo serviço. Deve permitir que o usuário entre com os dados do serviço a ser inserido; Método para cadastrar uma nova ordem de serviço. Deve permitir que o usuário entre com os dados da ordem de serviço a ser inserida e de cada um de seus itens. Método para inserir um novo item (peça) a uma ordem de serviço já existente. Deve permitir que o usuário escolha a ordem de serviço e insira os dados do novo item; Método para inserir um novo item (serviço) a uma ordem de serviço já existente. Deve permitir que o usuário escolha a ordem de serviço e insira os dados do novo item; Método para excluir um cliente. Deve permitir que o usuário escolha o cliente a ser excluído; Método para excluir uma peça. Deve permitir que o usuário escolha a peça a ser excluída; Método para excluir um serviço. Deve permitir que o usuário escolha o serviço a ser excluído; Método para excluir uma ordem de serviço. Deve permitir que o usuário escolha a ordem de serviço a ser excluída; Método para excluir um item (peça) de uma ordem de serviço já existente. Deve permitir que o usuário escolha a ordem de serviço e a peça a ser excluída; Método para excluir um item (serviço) de uma ordem de serviço já existente. Deve permitir que o usuário escolha a ordem de serviço e o serviço a ser excluído; Método para finalizar uma ordem de serviço. Deve permitir que o usuário escolha a ordem de serviço a ser finalizada; Método para cancelar uma ordem de serviço. Deve permitir que o usuário escolha a ordem de serviço a ser cancelada; Método para listar todas as peças. Deve listar os dados de todas as peças; Método para listar todos os serviços. Deve listar os dados de todos os serviços; Método para listar todas as ordens de serviço. Deve listar os dados de todas as ordens de serviço com seus respectivos itens; Método main para ler os dados armazenados em arquivo, apresentar o menu principal e, antes de sair do programa, gravar os dados em arquivo.

Observe a separação entre as classes de negócio (OrdemServiço, ItemOS, Cliente, Peça e Serviço) e a classe de interface. As classes de negócio não devem possuir nada que crie uma dependência da interface. Desta forma, se posteriormente você decidir mudar a interface, por exemplo, usar uma interface gráfica, as classes de negócio não precisam ser alteradas. A classe Oficina atua como uma classe gerente, fazendo a interligação das classes de negócio com a classe de interface. Em um projeto mais profissional, provavelmente existiriam várias interfaces e classes gerente. A mesma idéia deveria ser usada para separar as classes de negócio e as classes de persistência. Por simplicidade, nesse trabalho o armazenamento dos dados será feito em arquivo e as próprias classes de negócio e de gerência sabem como fazer isso, o que significa que se decidirmos passar a usar um banco de dados teremos que alterar essas classes. Em um projeto mais profissional, deveríamos criar uma camada de persistência, separando as classes de negócio da estrutura de armazenamento.

Parte II (peso 40%): Esta parte consiste em uma alteração (extensão) da Parte I, conforme o Diagrama de Classes a seguir:

OrdemServiço numeroOS ItemOS Produto dataOS 11 *1 1 * tipoItem código dataPrevTermino ** 11 preço
OrdemServiço
numeroOS
ItemOS
Produto
dataOS
11
*1
1
*
tipoItem
código
dataPrevTermino
**
11
preço
descrição
dataTermino
qtde
preço
placaCarro
situação
**
* *
1 1
Peça
Serviço
Cliente
qtdeEstoque
tempoExecução
nome
cpf
endereço
**
**
**
fone
Oficina

Peças e Serviços serão chamados genericamente de Produto. Para isso, foi criada a classe abstrata Produto com duas subclasses, Peça e Serviço. Um ItemOS agora possui um relacionamento com Produto, de forma que cada ItemOS é um Produto (Peça ou Serviço). Na prática, isso significa que a classe ItemOS terá apenas um atributo para dizer qual é seu item ao invés de dois atributos (peça e serviço) onde um deles era sempre nulo;

Crie a classe Produto e altere as classes Peça e Serviço para implementar a hierarquia proposta. A classe Produto deve ser abstrata;

Altere a classe ItemOS retirando os atributos peça e serviço e colocando em seu lugar o atributo produto do tipo Produto. Consequentemente, alguns métodos terão de ser alterados;

Todas as situações de exceção devem ser tratadas. Por exemplo, somente é permitido adicionar e excluir item em OS aberta, somente faz sentido finalizar OS aberta, somente é permitido cancelar OS aberta, somente é permitido excluir cliente, peça ou serviço que não sejam referenciados por nenhuma OS, o estoque de peça não pode ficar negativo etc. Crie classes de exceção e faça todo o tratamento necessário. Impressão de mensagens de erros devem ser apresentadas somente na classe de interface;

Use polimorfismo sempre que possível !!!

Para os grupos que estiverem desenvolvendo o trabalho em Java, todas as classes, exceto Interface, devem estar em um pacote chamado oficina. Defina a variável CLASSPATH corretamente;

Além disso, os grupos que estiverem desenvolvendo em Java devem fazer comentários no formato JavaDoc para todas as classes e todos os métodos públicos. Gere uma documentação usando esse utilitário.

Bom trabalho a todos.