[dotnetarchitects] Diagrama de Classe - Dominio Agenda Médica

178 views
Skip to first unread message

Thiago Holder

unread,
Apr 21, 2010, 12:57:25 AM4/21/10
to dotnetar...@googlegroups.com
Pessoal

Bom, eu estou realizando o aprendizado mais prático agora em DDD, e gostaria da opnião de vocês a respeito desse cenário.

Uma pessoa vai a uma clínica e deseja se consultar, ao ser recebido na recepção a funcionaria realiza seu cadastro inicial e pergunta para qual dia a pessoa deseja se consultar, assim é realizado o Agendamento do Paciente. Sabe-se que o Agendamento não pode ser realizado para a mesma hora e dia que já contém um agendamento para outro paciente, porém pode ser efetuado um encaixe.

Está bem simples a regra de negócio, não é tão complexa, mas o sistema tende a crescer e torna-se bastante complexo, pois é um Sistema de Gestão Integrada de Clínicas. Porém até o momento o cliente deseja o quanto antes que seja liberado uma forma de agendamento médico, pois la ainda é tudo na agendinha médica.

Estou anexando o diagrama de classe inicial, trata-se de um modelo incial para esse problema de Agendamento, gostaria da opnião de vocês.

Atenciosamente

Thiago Holder M. Silva

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
Agendamento.png

Eduardo Miranda

unread,
Apr 21, 2010, 8:16:27 AM4/21/10
to dotnetar...@googlegroups.com
Vou fazer a mesma pergunta que faço sempre, e geralmente sou ignorado: Não existe uma opção de usar algo pronto? Parece que o problema de agendamento é bem genérico, o exchange, por exemplo, resolve muito bem.

Gabriel

unread,
Apr 21, 2010, 8:35:34 AM4/21/10
to dotnetar...@googlegroups.com
Acho que o Thiago esta usando o cenário para colicar em oratica um aprendizado: 
"Bom, eu estou realizando o aprendizado mais prático agora em DDD, e gostaria da opnião de vocês a respeito desse cenário"

Gabriel Bernardi
(11) 6565-1015

Marcello Felipelli

unread,
Apr 21, 2010, 8:35:43 AM4/21/10
to dotnetar...@googlegroups.com
Bom dia, Eduardo!

Eu entendo o Thiago, e ele até colocou no início do e-mail que era para fins de aprendizagem. Têm-se um domínio bastante comum e baseado nele, aplica-se os conceitos de DDD. Com esse propósito é válido.

Olha como podemos explorar essa thread, por exemplo:
- Como evitar um possível bypass do modelo a ser construindo utilizando o ActiveRecord da Castle? Conceitualmente em DDD seria melhor utilizar o Fluent?
- Quais as reais vantagens de usar um container IoC? Qual dentre os disponíveis é o mais produtivo?

Entre outros questionamentos, e por que não uma revisão dos conceitos de DDD.

Abs.

Marcello Felipelli
mvfel...@gmail.com

Thiago Alves

unread,
Apr 21, 2010, 9:34:27 AM4/21/10
to dotnetar...@googlegroups.com
Oi Thiago,

O agendamento não seria realizado numa sala?
Entendo que a entidade AgendaMedica seria responsável por verificar se há sobreposição de horários.

Abraço,
Thiago Alves


2010/4/21 Thiago Holder <thiago...@gmail.com>

Bernardo Rezende

unread,
Apr 21, 2010, 9:52:44 AM4/21/10
to dotnetar...@googlegroups.com
Oi Thiago:
 
Qual e' o contrato definido em IEntidade?

--
Bernardo Bosak de Rezende
http://bernardorezende.blogspot.com/ - Arquitetura e Desenvolvimento .NET

"The weather-cock on the church spire, though made of iron, would soon be broken by the storm-wind if it did not understand the noble art of turning to every wind."
Heinrich Heine

Allan Clempe

unread,
Apr 21, 2010, 11:27:35 AM4/21/10
to dotnetar...@googlegroups.com
Eduardo, primeiro ele falou que estava realizando um aprendizado.
Segundo, sistemas hospitalares e/ou clínicas podem se tornar bem complexos e que infelizmente é difícil encontrar em formato de caixinha em prateleiras. Já trabalhei muito nesse mercado, analisando diversos produtos e geralmente não se enquadram no processo de trabalho do hospital.
Realmente se for só pensar no agendamento, é melhor comprar pronto : )
 
[]'s

Thiago Holder

unread,
Apr 21, 2010, 11:55:22 AM4/21/10
to dotnetar...@googlegroups.com
Pessoal,

Estou gostando do andar da Thread, vou começar respondendo algumas questões levantadas. Antes de mais nada eu gostaria de compartilhar todo esse aprendizado com vocês, pois irá também servir para minha pesquisa que envolve o meu TCC, que aborda o DDD e defende essa abordagem que o Evans lançou em seu livro, realmente saber se o que ele narra em seu livro pode de alguma forma contribuir para o Desenvolvimento de Software, seja ele complexo, escopo bem definido e que terá uma longa vida pela frente. Diante disso pensei em um sistema de Gestão Integrada de Clínicas, pois é algo que há uma complexidade em volta e também a maneira que um Clínica funciona é diferente de qualquer outra.

1 - A questão do agendamento, é exatamente um dos módulos mais prioritários no momento, não pode ser pelo Exchange, porque não atende as necessidades levantadas e outro ponto é, o Cliente não quer, ele quem está me dizendo a maneira que o seu paciente solicita um agendamento em sua clínica. 

2 - O sistema vai ficar complexo, sim. depois tem o encaminhamento ao Médico, temos também a questão de encaixe, fechamento da consulta, quanto se faturou naquela consulta, qual o custo, como pode haver uma comunicação com os Planos de Saúde (Tabela com valores, formulários de preenchimento entre outros, ai ja entra um sistema integrado com outro) entre outras regras que serão levantadas de acordo com a prioridade do cliente e ai nota-se o tamanho que irá ficar complexo.

3 - Eu não entendi a questão da sala, eu tratei a Agenda Médica como uma entidade, porque pelo Dia e Hora eu saberei qual o Paciente será atendido naquele momento, ou até mesmo quantos pacientes em um dia eu irei atender e quais os médicos disponíveis naquele dia.

4 - O Contrato com IEntidade é somente o ID { get; }, sei que no conceito de DDD o Evans atribui bem isso que o ID não pode ser considerado um atributo de identificação, porém isso só foi feito para mapeamento e identificação das Entidades, veja que em pessoa eu coloquei o RG, no médico terá o CRM, no paciente terá um ID, que para o sistema eu posso entregar ao paciente um número do seu registro, vai que ele seja menor e mais fácil de memorizar, assim como é nas carterinhas de plano de saúde, geralmente a primeira opção que pergunta é "Qual sua matricula?" e é assim que a Clínica trabalha.

5 - Notei que há um erro na agenda, eu não sei por exemplo se o médico está disponivel naquele momento ou não, como posso realizar esse Serviço de Agendamento? Por exemplo para mim eu só estou enxergando a Agenda Médica como um cadastro do Paciente, Data e Hora e Médico. Mas e o médico pode ser naquela hora e dia, ele está na Clínica? Lembrando que o médico é um prestador de serviço e não um funcionário, ele pode trabalhar em outras clínicas, há um horário disponível de X horas por semana no dia que ele escolher ser mais relevante.

6 - Alguma ajuda?

* Vamos aproveitar essa thread para revisar os conceitos de DDD e também irei sempre disponibilizar parte do modelo para ser discutido aqui com vocês.

Atenciosamente

Thiago Holder M. Silva


Eduardo Miranda

unread,
Apr 21, 2010, 1:10:56 PM4/21/10
to dotnetar...@googlegroups.com
Se é um trabalho de faculdade com o objetivo de estudo, não se fala mais nisto.
 
 
Esclarecendo:
@Clempe
Não sugeri a compra de um sistema de caixinha para gestão de clinicas, mas sim utilizar algo pronto para o agendamento que deve ser integrado ao sistema. O fato do sistema ser complexo não significa que não haja possibilidade de utilizar módulos prontos que podem integrados.
 
@Thiago, o cliente tem um fluxo de agendamento, e vc pode atendê-lo implementando este fluxo em uma ótima experiência de usuário. O que está por debaixo não importa, contanto que atenda. O Exchange é apenas um exemplo, mas volto a insistir estou para ver um problema de agendamento que não seja resolvido por com que existe no mercado. O que vc modelou até agora é perfeitamente atendido por vários, inclusive o exchange.

Eduardo Miranda

unread,
Apr 21, 2010, 1:14:18 PM4/21/10
to dotnetar...@googlegroups.com
Se é um trabalho de faculdade com o objetivo de estudo, não se fala mais nisto.
 
Quer saber, mudei de idéia, vc está na faculdade para aprender a trabalhar no mundo real, não é? E no mundo real gastar tempo modelando e implementando agendamento é jogar dinheiro fora. O que não significa que não existam milhares de clientes e empresas de consultorias que não façam isto.

Thiago Holder

unread,
Apr 21, 2010, 1:41:01 PM4/21/10
to dotnetar...@googlegroups.com
Entendo plenamente a opção de Eduardo,

Vejo isso como um lado altamente produtivo, onde a questão de se trabalhar com soluções mais práticas é extremamente produtivo, porém neste cenário não precisamos utilizar essa prática de reuso do software, como o Exchange.

Alguém tem mais opniões?


Atenciosamente

Thiago Holder M. Silva

Diego Dias

unread,
Apr 21, 2010, 11:59:26 PM4/21/10
to dotnetar...@googlegroups.com
Vamos focar na thread já que o Thiago quer desenvolver vamos ajudar, mesmo pq é fazendo e discutindo que nós aprendemos.

Acho que vc pode criar uma escala dos médicos, assim vc tem como saber os dias que ele vai estar na clinica. Com esta informação vc cruza com a agenda do médico e sabe se ele está disponível ou não.

Quanto a parte do encaixe acho q vc pode ter um status associado a sua agenda, onde qdo um horário for criado para uma data maior q 2 dias a contar de hoje então ela entra com o status "a confirmar" e caso já tenha uma consulta marcada para o mesmo horário q vc quer agendar um cliente esta consulta pode ser agendada mais com o status "encaixe".

[]'s

Thiago Holder

unread,
Apr 22, 2010, 12:19:47 AM4/22/10
to dotnetar...@googlegroups.com
Quanto a parte do encaixe acho q vc pode ter um status associado a sua agenda, onde qdo um horário for criado para uma data maior q 2 dias a contar de hoje então ela entra com o status "a confirmar" e caso já tenha uma consulta marcada para o mesmo horário q vc quer agendar um cliente esta consulta pode ser agendada mais com o status "encaixe".

Sabemos que temos uma questão a respeito das responsabilidades de uma classe, porém essa responsabilidade de realizar um agendamento e verificar qual o status daquele agendamento fica por conta do objeto "Agenda" . Neste caso eu coloquei o seguinte: 

 public Agenda(DateTime dataConsulta, DateTime horaConsulta, Medico medicoResponsavel, Paciente paciente)
 {
            this.DataConsulta = dataConsulta.Date;
            this.HoraConsulta = horaConsulta;
            this.MedicoResponsavel = medicoResponsavel;
            this.Paciente = paciente;
            this.Status = StatusAgendamento.Marcado;
 }


Eu colacaria dentro do construtor mesmo um teste para alterar os status conforme a Data, ou seria melhor eu colocar um método RealizarEncaixe()

Anexo o diagrama alterado com Status e EscalaMedica

Ou será isso um ServicoAgendamento?

Atenciosamente

Thiago Holder M. Silva

DiagramaAgendamento.png

Diego Dias

unread,
Apr 22, 2010, 12:42:14 AM4/22/10
to dotnetar...@googlegroups.com
Pensando que vc tem um fluxo bem definido da sequência dos status que são fixos e pouco acho q vc poderia implementar o State Pattern, assim vc encapsula as regras de transição dos status um para o outro de acordo com a situação. E no objeto vc teria um método que chama a transição do status. Claro que isso é algo q funcionaria em um mundo perfeito normalmente o q é feito é o q vc fez. Seta um status padrao no construtor e colocamos um método ou uma propriedade read/write para setar o status na UI ou em alguma outra camada oq não é errado é menos elegante.


Bem legal esta thread praticamente um "brainstorm"

[]'s

Diego Dias

unread,
Apr 22, 2010, 12:49:57 AM4/22/10
to dotnetar...@googlegroups.com
Aproveitando.
Thiago como vc fez para definir oq é um Objeto de Valor e o que é uma Entity? Pq o objeto EscalaMedica é uma Entity?
Não estou criticando o modelo só gostaria de saber qual o seu entendimento sobre esta diferença pq pra mim eh algo q as vezes não é mto claro.

Thiago Holder

unread,
Apr 22, 2010, 1:07:09 AM4/22/10
to dotnetar...@googlegroups.com
Bom,

Eu entendi na "Escala Médica" é que ele é uma entidade por representar essa com identidade com outro Objeto. Um exemplo é eu posso ter uma escala na Segunda-Feira, com os Médicos Y às 14:00hs até as 18:00, Z 15:00 até as 17:00 e X de 08:00 até as 18:00. 

Vamos lá, estou definindo que tudo aquilo onde possui uma identidade para mim é uma Entidade seguindo os conceitos do Eric em seu livro.

"Cada Entidade deve ter uma forma operacional de estabelecer sua identidade com outro Objeto - distinguivel até mesmo a partir de outro objeto com os mesmos atributos descritivos; Deve-se garantir que um atributo de identificação seja único dentro do sistema, independentemente de como esse sistema seja definido - mesmo quando distribuido, e até mesmo quando os objetos são arquivos".

Falando do ID (IEntidade), o Evans define o seguinte: Existem casos que um ID gerado é de interesse para o usuário. Ele dá até de envio de encomenda para acompanhar um pacote enviado.

O Evans também faz a seguinte descrição sobre Objeto de Valor (ainda tou lendo essa parte, para escrever no Blog), mas essa definição ja ajuda: "Muitos objetos não possuem nenhuma identidade conceitual. Esses objetos descrevem alguma caracteristica de alguma coisa".

Depois de escrever isso e ler novamente o livro do Evans, vejo que a escala é um Objeto de Valor que agrega o Médico e sua Agenda, irei mudar.

Diego Dias

unread,
Apr 22, 2010, 11:06:15 AM4/22/10
to dotnetar...@googlegroups.com
Eu pensei q a escala era por médico e não geral. Desta forma escala médica poderia ser um VO.

Thiago Holder

unread,
Apr 23, 2010, 5:30:07 AM4/23/10
to dotnetar...@googlegroups.com
Diego,

Também concordo e já fiz as mudanças, logo mais estarei colocando o novo Modelo representado até o momento, bom e logo depois vai ter outro ponto que é a parte de Consulta, mas só depois, resolver um de cada vez.

Atenciosamente

Thiago Holder M. Silva
Reply all
Reply to author
Forward
0 new messages