Esse projeto tem por objetivo apresentar o gerenciamento de um consultório médico. Nossa atual realidade apresenta um auto nível de desenvolvimento técnico e tecnologico, e a tecnologia nos trouxe comodidade, e praticidade, um microondas permite ao individuo ter seu alimento rapidamente aquecido, o computador permite o armazenamento de uma grande quantidade de informações no mesmo lugar, alem disso ainda permite o processamento de varias ações ao mesmo tempo, muitos e muitos dados em pouquissimo tempo, é uma realidade inevitável atualmente, esse projeto traz um pouco dessa realidade ao mundo da medicina, com o intuito de trazer agilidade nos processos rotineiros, demonstrarei nos demais paragrafos como modelei o processo de gerenciamento de um consultório médico, detalhando minhas decisões de implementação, baseadas no diagrama de classe que meu orientador Eduardo Habib forneceu para que esse projeto fosse desenvolvido.
A primeira decisão de implementação foi a de criar um menu, onde o usuário pudesse acessar todas as funcionalidades do programa, e desde já tambem fiz uma primeira modelagem do software para que pudesse ser um norte para criação do programa, tal primeira versão é esta que se segue:
No meu menu, implementado em C++, alem das opções para o usuário usar alguma funcionalidade foi adicionado uma opção para limpar a tela do programa com o intuito de não poluir visualmente a interface para o usuário.
Após a implementação do menu decidi que era necessário iniciar o desenvolvimento das funcionalidades do mesmo, com isso em mente criei a classe consultório no meu projeto, essa classe dá partida para todas as listas e demais classes consti- tuintes do projeto, ou seja antes de acessar qualquer outra classe o programa vai passar por esta classe, sendo assim ela teria de ser a primeira a ser implementada após o menu.
Depois da implementação da classe consultório decidi implementar a classe médico para que fosse possível o cadastro de um médico no sistema, possibilitando ao usuário do sistema inserir, listar e remover um médico do programa, e com isso em mente decidi adicionar ao diagrama essa nova lista, como mostra o print:
Com a implementação da lista de médicos decidi implementar uma classe que iden- ficasse melhor o médico do que apenas a sua especialidade e CRM, e que posteriormente seria usada em outras listas como a de pacientes por exemplo, isso foi feito utilizando herança.
Neste ponto de desenvolvimento do projeto me deparei com a primera inserção com- pleta realizada, isto é: se faz até aqui possível cadastrar um médico de maneira integra, porem ainda me deparei com um possível problema quando em dialogo com meus companheiros de faculdade, e se tivesse apenas um medico na lista?, se não fosse tratado de maneira particular na parte do código onde seria efetuado a remoção me traria potenciais problemas, no caso de falha de segmentação, tornando meu software potencialmente mal elaborado, com isso decidi colocar um caso a parte no momento da remoção, o qual possibilitou ao meu programa lidar com essa situação de maneira adequa.
Com esse potencial problema resolvido tomei a decisão de permiti o cadastro de uma consulta no sistema, e com isso o uso de mais uma funcionalidade do sistema, em primeira mão apenas foi implementado a classe consulta com sua lista a hora da cosulta, cpf e CRM do médico, outra característica importante de uma consulta seria a data a qual a mesma acontecerá, por exemplo. Com isso tomei a decisão de implementar a classe data trazendo a funcionalidade de datar uma consulta, como mostra o diagrama:
Será mostrado nos casos de teste que mesmo com lixo de memoria na impressão da data da consulta decidi seguir em diante com o projeto por hora, e tratar desse problema com o projeto um pouco mais a frente, para que eu consiguisse ganhar tempo acelerando o processo de desenvolvimento do software. Então decidi partir para implementação da classe paciente, para que possibilitasse ao usuário inserir pacientes no sistema, resolvi que deviria modelar mais uma vez o diagrama que ficou desta forma:
Com todas as listas que deveriam ser incluidas ao código ja prontas decidi que deveria corrigir erros que ja vinha em versões anteriores, mas não me prejudicaram, como o erro do lixo apos a impressão da data, que apesar de se tratar de lixo de memoria não significava um problema pois a data era impressa sem lixo, esse erro aparecia sem sobreescrever dado algum,simples- mente aparecia.
Apesar de ja estar implementado no diagrama de classe ainda não havia cido adicionado a função de remover um paciente ao programa, então resolvi tomar esse atitude e inserir essa funcionalidade ao sistema, logo após comecei a tratar casos de cadastro duplicado como quando se inseri duas pessoas com o mesmo nome, ou ainda com o mesmo cpf.
Após isso ter cido feito, em conversa com a monitora da materia de programação percebi que havia me passado despercebido que usei a composição invertida, sabendo disso atualizei novamente o diagrama e adicionei o que ainda restava adicionar até esta fase de desenvolvimento do projeto, como mostro a seguir:
Em conversa com colegas de faculdade cheguei a conclusão que seria necessario fazer com que o software procurasse o cpf na lista de pacientes, para que não ocorresse de o programa pegar um cpf que não existe ou de uma pessoa que não se trata de um paciente verdadeiro, e com isso tive de adicionar um novo método tanto a lista de medicos quanto a lista de pacientes que permitisse que fosse feito essa busca, com isso tive de atualizar o diagrama de classe, e apresento a seguir as mudanças:
Para que se tornasse um pouco mais proximo de um real consultório médico tomei a decisão de fazer com que o programa cadastrasse a ultima data da consulta de um paciente de maneira automatica, ou seja o que isso significa: antes de trazer isso ao software se fosse ser realizado um cadastro de paciente era pedido que fosse inserido manualmente, ou seja o sistema não era capaz de realizar tal tarefa sozinho, mas agora ele acaba de se tornar capaz. E aqui mostro o que foi alterado tambem no diagrama com essa implementação:
Como pedido por meu orientador tambem era necessário adicionar uma funcionalidade ao menu que fosse capaz de encontrar um paciente e uma consulta especifica de tal, alem de que segundo ele era necessário tambem contar o numero de pacientes que estavam no consultorio, e que não havia cido implementado ainda.
Por ultimo corrigi um erro que não prejudicou o desenvolvimento do projeto, porem o compilador ficou apontando durante todo o projeto dizendo que não condizia o retorno que era feito com o tipo das funções onde estes estavam, assim decide mudar as funções remover de todas as listas de booleano para void, para que fosse resolvido o problema.
Chego ao fim atualizando o restante do diagrama de classe que terá sua versão final disponizado aqui em meio aos repositórios.
O primeiro teste realizado foi o teste do menu, esse teste foi realizado para que comprovasse se o menu estava funcionando sem nenhum erro, porem observe que nesse caso as funcionalidade do menu ainda não estavam implementadas, porem era possível escolher uma opção mesmo que ela não proporcionace algum resultado definitivo.
Os primeiros resultados foram positivos, como mostrado nas imagens o menu não apresentou nenhum erro, e apresoutou as informações ao usuário como esperado.
O segundo teste foi o de cadastro de um medico no sistema, porem de primeira mão o que foi implementado apenas foi a inserção do crm do médico e sua especialidade, pois a classe onde estaria informações pessoais como nome, cpf, endereço seria uma classe compar- tilhada com outras como a classe paciente, que tambem pode ter as mesmas catacterísticas.
Em uma primeira tentativa ocorreu um pequeno erro, devido a introdução de um construtor vazio em uma classe e a não declaração do mesmo no arquivo hpp dessa classe, o print a seguir evidencia o erro.
Após a correção desse erro foi realizado um segundo teste, com os seguintes resultados:
como mostra a imagem o cadastro do médico ainda se tratava de apenas de inserir o CRM e sua especialização.
Essa segunda imagem mostra o resultado da impressão das informações dos médicos cadastrados, afirmando o sucesso na implementação da classe medico e sua lista.
Após estes testes foi implementado por mim a remoção de um médico do sistema a lista que salva as informações de um médico é duplamente encadeada, assim a remoção de um nó é uma simples questão de redirecionar ponteiros internos de um nó corretamente.
Em uma primeira tentativa houve um erro, visto que não tinha cido tratado o caso para remoção de apenas um elemento na lista de medicos, o video a seguir mostra isso:
Primeiro.erro.Feito.com.o.Clipchamp.mp4
Em uma segunda tentativa após alterações no código da lista onde se localizava a função de remo- ção, foi obtido exito como mostra o curto video a seguir:
SEGUNDO.VIDEO.mp4
Foi feito a implementação de uma classe para dar nome e pegar outras informações do médico, foi feito uma primeira tentativa, e foi encontrado um erro de inserção de dados, como mostrar a imagem a seguir:
Como mostra a imagem o programa não permitia ao usuário inserir, foi adicionado a função cin.ingnore(), que obriga o computador retirar o que estava no buffer, e o resultado foi:
È evidente que nesta tentativa foi possivel cadastrar um endereço para o médico o que não era possível antes da devida correção.
Esse caso de teste se trata da correção de um erro que não havia acontecido porem em dialogo com colegas de faculdade percebi que se tratava de um caso a ser tratado, quando se tem apenas um elemento na lista, para que não desse erro seria necessário fazer um tratamento diferente do apenas remover convencional implementei no projeto, em uma primeira tentativa obtive os seguintes resultados:
correcao.do.erro.de.remocao.de.um.unico.elemento.mp4
É facil notar que no inicio deste video havia um médico cadastrado na lista acessando a opção 8 de removo o medico e após entro novamente na opção 4, mostrando a lista de médicos vazia, confirmando o exito da tentativa de remover um elemento da lista quanto existe apenas um elemento.
Esse caso de teste se trata da implementação da classe consulta e de sua lista, visto que podemos ter diversas consultas em um mesmo consultorio, os resultado seguem no video a seguir:
TESTE.DA.IMPLEMENTACAO.DA.CLASSE.CONSULTA.mp4
Como mostra o curto video a implementação foi bem sucedida, sem casos de erro porem observe que tal classe ainda não estava armazenando a data da consulta.
Como já foi dito por mim por aqui, que em primeira mão foi criado a classe consulta sem suas características principais adicionadas, por isso neste caso de teste será mostrado a implementação de uma classe de codinome data para realizar esse função tão importante no processo de registro de uma consulta de maneira automatizada, na primeira tentativa obtive estes resultados:
È facil perceber que esta fase do projeto teve bons resultados de primeira mão, porem como o segundo print mostra junto com as informações da consulta veio um lixo de memória, logo após a impressão da data da consulta.
Agora implementei mais uma lista que se tratava da inserção de um paciente no sistema, porem em uma primeira tentativa obtive um erro, que se tratava da não implementação de um dos métodos, como mostra os prints do terminal:
Na implementação da classe paciente, me passou despercebido o desenvolvimento do método que retornava um ponteiro que apontava para o nó anterior da lista, visto que usei uma lista duplamente encadeada.
Este teste foi realizado para comprovar se o lixo de memoria tinha cido removido, e o erro da não implementação do método que resgatava o ponteiro que aponta para um nó antecessor na lista do paciente tinha cido resolvido, a imagem a seguir mostra o sucesso neste teste:
O erro do lixo de memoria acontecia pois no método onde era impresso a data que tinha cido coloca para retornar um valor e não se estava sendo retornando nada, so- lucionei esse problema colocando o método para retornar o ano da data.
Aqui demonstro os resultados da implementação do remover na lista do paciente, em primeiro teste obtive os seguintes resultados:
Adicionando.o.remover.a.lista.de.pacientes.mp4
O que demonstro aqui é o cadastro de um paciente pela segunda opção do menu, logo após mostro os componentes da lista de pacientes com a opção 6 do menu, e por fim com a opção 9 removo o paciente cadastrado da lista, antes de encerrar imprimo novamente os dados da lista para mostrar o exito na tentativa de remoção de um paciente.
Aqui altero o código que para quando ocorresse o cadastro de um paciente com o nome identico a outro cadastrado isso fosse identificado e pedido para o usuario colocar um sobrenome para diferenciar, como mostra o curto video:
tratando.cadastro.duplo.Feito.com.o.Clipchamp.mp4
È fácil perceber no video que quando se cadastra uma pessoa com nome identico a uma ja cadastrada o software pede ao usuario para digitar um sobrenome, para que seja possível diferenciar desta pessoa já cadastrada, com isso confirmando o exito na implementação.
Neste caso foi implentado um tratamento de cadastro, que se refere a duplicação de cpf o que em nosso mundo real não é permitido, para que não houvesse problema no cadastro tratei esse caso, em primeira tentativa obtive os seguintes resultados:
tratando.cadastro.duplo.erro.Feito.com.o.Clipchamp.mp4
O video mostra que quando ocorre o cadastro com dois cpfs iguais o software acaba por cadastrar em vez de impedir, esse erro ocorreu devido que deixei me passar despercebido que no momento de verificar era necessario fazer o software buscar os endereços seguintes nos nós na lista, foi feita a correção e os resultados foram:
Cadastro.duplicado.Feito.com.o.Clipchamp.mp4
Esse caso se trata do teste para averiguar se quando cadastrado uma consulta vai ser cadastrado com um cpf de um paciente real e um medico que realmente trabalhe naquele hospital, os resultado são mostrados a seguir:
Como é possível ver se acaso não existir o paciente ou o médico no sistema ele mostrará ao usuário uma mensagem avisando que ou o médico não trabalha ali ou o paciente não está cadastrado.
Desta vez fiz a implementação do cadastro da ultima consulta de um paciente de maneira automática alterarado o código da classe da lista do paciente, de primeira tentativa obtive os seguintes resultados:
tratando.erro.de.impressao.Feito.com.o.Clipchamp.mp4
È possível notar que apesar de ter ocorrido o cadastro de um paciente, medico e não foi necessário cadastrar uma consulta para perceber que era impossível o usuario vizualizar a data da ultima consulta de um paciente qualquer, alterando novamente o código com uma segunda tentativa obtive os seguintes resultados:
Neste caso adicionei a impressão detalhada para os médicos e pacientes, ou seja, quando fosse imprimir seria necessário colocar o crm do médico ou no caso do paciente o cpf do mesmo, os resultado seguem a seguir:
Como é possível notar quando é chamado a função de impressão seja do paciente ou do médico é pedido o crm e o cpf, a impressão precisa mostra o sucesso na implementação.
Desta vez implementei mais uma funcionalidade ao menu do usuário para que fosse possivel encontrar um medico, e a consulta com um paciente especifico, uma primeira tentativa obtive estes resultados:
Como é possivel notar neste print foi adicionado uma nova funcionalidade ainda não implementada e com ela foi encontrado um paciente especifico, confirmando o exito na implementação.
Este caso se trata da mudança na maneira de contar o número de pacientes presentes no consultório passa a ser bem simples e menos custioso, pois se trata agora apenas de incrementar e decrementar uma variável quando inserido, ou removido um paciente da lista. Em uma primeira tentativa obtive os seguintes resultados:
È fácil perceber que houve um erro, que se trata nesse caso da não impressão do número de pacientes visto que de acordo com o que implementei o software deveria ser mostrado assim que fosse cadastrado um paciente novo, o erro ocorreu pois no momento de incrementar e decrementar a variavel eu não estava armazenando em lugar algum, fiz a correção deste erro e obtive os seguintes resultados:
Como havia dito ao fim do cadastro deveria mostrar o numero de pacientes como ocorreu desta vez, demonstrando sucesso em minha correção.
Estava ocorrendo desde a criação das listas no projeto uma notificação de warning feita pelo compilador visto que em uma função do tipo boolena estava sendo retornado como um em uma função void, ou seja, não era retornado nada, neste teste reestruturei as partes do código que aconteciam esse problema, e obtive os seguintes resultados:
Como é mostrado na segunda imagem o compilador parou de advertir que havia um retorno vazio nas funções de remoção de elementos das listas do projeto.