Escolar Documentos
Profissional Documentos
Cultura Documentos
Niterói
2016
EDSON BATISTA DOS SANTOS JUNIOR
Orientador:
Jean de Oliveira Zahn
NITERÓI
2016
Ficha Catalográfica elaborada pela Biblioteca da Escola de Engenharia e Instituto de Computação da UFF
CDD 005.1
EDSON BATISTA DOS SANTOS JUNIOR
Banca Examinadora:
_________________________________________
Prof. Jean de Oliveira Zahn, MSc. – Orientador
UFF – Universidade Federal Fluminense
_________________________________________
Prof. Gleiph Ghiotto Lima de Menezes, DSc. – Avaliador
UFF – Universidade Federal Fluminense
Dedico este trabalho a todos que me incenti-
varam e apoiaram nesta jornada que é o
aprendizado.
AGRADECIMENTOS
Este trabalho tem por objetivo mostrar que o uso da metodologia Domain-
Driven Design com a linguagem de programação JavaScript torna possível a criação
de sistemas que expressam o conhecimento do domínio com um custo relativamente
baixo, de forma a atender às demandas da sociedade no que tange a busca por ser-
viços públicos de qualidade nas mais diversas áreas, como por exemplo, a área da
saúde. Com base em notícias divulgadas em órgãos de imprensa, o trabalho expõe
a situação de calamidade do gerenciamento das filas cirúrgicas. Explica o funciona-
mento de uma fila cirúrgica e sua diferença em comparação com outros tipos de fila,
e apresenta o conceito de prioridade/urgência baseado num sistema internacional de
classificação de gravidade do estado de saúde do paciente. Propõe o uso de um
serviço integrado de gerenciamento desenvolvido com a utilização de uma metodo-
logia e tecnologias fundamentadas na literatura de engenharia de software, discor-
rendo sobre as escolhas de cada uma delas a despeito das demais. Por último,
apresenta as conclusões formuladas durante o desenvolvimento do serviço e sugere
melhorias para as próximas versões.
RESUMO..................................................................................................................... 8
LISTA DE ILUSTRAÇÕES .......................................................................................... 9
LISTA DE ABREVIATURAS E SIGLAS .................................................................... 10
1 INTRODUÇÃO ................................................................................................... 13
2 TRABALHOS RELACIONADOS ........................................................................ 15
3 FUNDAMENTAÇÃO TEÓRICA .......................................................................... 18
3.1 O PROBLEMA ............................................................................................. 18
3.2 FILA CIRÚRGICA......................................................................................... 19
3.2.1 CRITÉRIOS DE PRIORIDADE EM FILAS CIRÚRGICAS ..................... 19
3.2.2 GERENCIAMENTO DE FILAS CIRÚRGICAS ATUAL .......................... 21
3.2.3 VANTAGENS NA UTILIZAÇÃO DE UM SERVIÇO INTEGRADO DE
GERENCIAMENTO DE FILAS CIRÚRGICAS ................................................... 22
4 FERRAMENTAS, ANÁLISE E PROJETO DO SISTEMA ................................... 23
4.1 METODOLOGIA DE DESENVOLVIMENTO ................................................ 23
4.1.1 DOMAIN-DRIVEN DESIGN ................................................................... 24
4.2 TECNOLOGIAS UTILIZADAS ...................................................................... 27
4.2.1 SERVIÇO WEB ..................................................................................... 27
4.2.2 LINGUAGEM JAVASCRIPT E FRAMEWORKS .................................... 30
4.2.3 TYPESCRIPT ........................................................................................ 33
4.2.4 BANCO DE DADOS MYSQL ................................................................. 35
4.3 ANÁLISE E PROJETO DO SISTEMA .......................................................... 35
4.3.1 CASOS DE USO ................................................................................... 36
4.3.1.1 CADASTRAR PACIENTE ............................................................... 36
4.3.1.2 CADASTRAR OFERTA DE CIRURGIA .......................................... 38
4.3.1.3 SELECIONAR PACIENTE PARA CIRURGIA ................................. 40
4.3.1.4 INFORMAR REALIZAÇÃO DE CIRURGIA ..................................... 42
4.3.1.5 INFORMAR CANCELAMENTO DE CIRURGIA .............................. 43
4.3.2 DIAGRAMAS DE CLASSES .................................................................. 44
4.3.2.1 CLASSES DE DOMÍNIO ................................................................. 44
4.3.2.2 CLASSES DE APLICAÇÃO ............................................................ 45
4.3.2.3 CLASSES DE SERVIÇO................................................................. 47
5 SERVIÇO DE GERENCIAMENTO DE FILAS CIRÚRGICA ............................... 48
5.1 OBTENDO LISTA DE PACIENTES POR PROCEDIMENTO
AGUARDADO...... .................................................................................................. 49
5.2 INFORMANDO A REALIZAÇÃO DE UMA CIRURGIA ................................ 51
6 CONCLUSÕES E TRABALHOS FUTUROS ...................................................... 53
7 REFERÊNCIAS BIBLIOGRÁFICAS ................................................................... 54
13
1 INTRODUÇÃO
1 V8 é um engine JavaScript de alta performance mantido sobre um projeto de código aberto da Goo-
gle, escrito na linguagem C++ e usado no Chromium, Node.js e várias outras aplicações embarcadas
(https://developers.google.com/v8/).
14
2 TRABALHOS RELACIONADOS
mento NoSQL, também são apresentados estilos arquiteturais como REST, CQRS,
Arquitetura Hexagonal, e uma novidade específica do Domain-Driven Design - os
Eventos de Domínio. O autor escolhe a linguagem Java, de forma consciente, como
ele mesmo declara, para “inspirar a comunidade Java a retornar à modelagem de
domínio fornecendo uma quantidade razoável de ideias de como as técnicas de pro-
jeto sólidas, porém ágeis e rápidas, podem beneficiar o trabalho deles”.
Em Patterns, Principles and Practices of Domain-Driven Design [7], de
maio de 2015, Scott Millet faz uso de uma aplicação de comércio eletrônico para se
aprofundar nos conceitos do Domain-Driven Design. Neste livro é dada uma ênfase
nas questões de integração entre aplicações, com o uso de Mensageria, RPC e
REST. Mais uma vez, a linguagem de programação .Net é usada na aplicação
exemplo.
Como observado, todos os livros citados utilizam-se das linguagens de
programação Java ou .Net para exemplificar os conceitos e padrões desta aborda-
gem de desenvolvimento de software. A preferência por estas linguagens não nos
causa estranheza ao levarmos em consideração o ranking de linguagens mais utili-
zadas publicado anualmente pela TIOBE Software BV [8], onde elas figuram entre as
primeiras colocadas por vários anos seguidos.
Nos últimos anos com o advento da Internet e dos dispositivos móveis, a
linguagem JavaScript passou por uma enorme popularização, tendo passado inclu-
sive a ser utilizada no Back-End e não apenas no Front-End, vide Node.js2, e até em
bancos de dados, vide PouchDB3. Com isto, é cada dia mais comum que aplicações
usem apenas o JavaScript como linguagem de programação, são as chamadas apli-
cações isomórficas.
Esta utilização do JavaScript na programação Back-End trouxe uma gran-
de questão: por que não utilizar uma abordagem de desenvolvimento já consagrada
como o Domain-Driven Design também com o JavaScript?
No final de julho de 2015 foi publicado um livro sobre este tema, Java-
Script Domain-Driven Design [9], de Phillipp Fehre. Neste livro, o autor faz uso de
um sistema de gerenciamento de transferência entre prisioneiros de masmorras con-
troladas por orcs (seres demoníacos dos contos de fantasia medievais popularizados
nas obras do escritor J.R.R. Tolkien [10]) para exemplificar o uso dos principais con-
ceitos do Domain-Driven Design. Apesar da didática utilizada, que busca explicar de
forma simples os conceitos, há um esforço em aprofundar-se em detalhes peculiares
da linguagem quanto a orientação a objetos, que é um dos pilares do Domain-Driven
Design, que já estão superados com a utilização do framework de desenvolvimento
TypeScript.
Diferente deste último trabalho que apesar de falar tanto de Domain-
Driven Design quanto JavaScript, este trabalho pretende demonstrar como Domain-
Driven Design pode ser utilizado para o desenvolvimento de uma aplicação JavaS-
cript que forneça uma solução para um problema real: o gerenciamento de filas ci-
rúrgicas no âmbito do Sistema Único de Saúde (SUS)4. Durante a evolução do
mesmo, pretende-se demonstrar como as boas práticas descritas no Domain-Driven
Design deram suporte para um correto entendimento do problema a ser resolvido,
bem como possibilitaram um desenvolvimento de uma solução consistente e escalá-
vel em um intervalo de tempo satisfatório.
4 Sistema de saúde pública da República Federativa do Brasil. Busca atender a população, desde
atendimentos simples (e.g., atendimentos ambulatoriais) até atendimentos mais complexos (e.g.,
transplante de órgãos), garantindo acesso integral, universal e gratuito para toda a população do país
(http://www.portalsaude.saude.gov.br).
18
3 FUNDAMENTAÇÃO TEÓRICA
3.1 O PROBLEMA
Diferente dos demais tipos de filas que estamos habituados a ver em nos-
so dia-a-dia, onde a ordem de chegada é o principal, senão o único, critério para de-
finir a prioridade de atendimento, numa fila cirúrgica leva-se em consideração, como
20
6 SOLID é um acrônimo introduzido por Michael Feathers para os cinco princípios básicos da progra-
mação orientada a objetos, como assim foram por Robert C. Martin
(https://en.wikipedia.org/wiki/SOLID_(object-oriented_design).
26
onam como um fluxo de ações a serem tomadas pelos objetos do sistema quando
determinados eventos ocorrerem, por exemplo na alteração da gravidade do estado
de saúde de um determinado paciente presente na fila cirúrgica.
7 WSDL, que é o acrônimo de Web Service Description Language, é uma linguagem baseada em
XML utilizada para descrever serviços web funcionando como um contrato do serviço
(https://pt.wikipedia.org/wiki/Web_Services_Description_Language).
8 UDDI, que é acrônimo inglês Universal Description, Discovery and Integration) é um serviço de
diretório onde empresas podem registrar (publicar) e buscar (descobrir) por serviços web
(https://pt.wikipedia.org/wiki/UDDI).
30
zados e seguem os verbos disponíveis no protocolo HTTP. Além disto, podem ser
usados tanto XML quanto JSON para representar as informações trafegadas.
Tendo em mente a premissa que o serviço web utilizado para atender ao
requisito de gerenciamento de filas cirúrgicas não será exposto publicamente e que
as informações trafegadas devem ter o menor tamanho possível, a arquitetura esco-
lhida foi REST.
tems9, que também detinha o registro do nome Java. A Netscape submeteu a lin-
guagem para que fosse feita uma padronização pela European Computer Manufac-
turer’s Association (ECMA) e, desta forma, o nome oficial da linguagem é ECMAS-
cript [25].
À primeira vista parece um contrassenso escolher uma linguagem criada
para melhorar a exibição de páginas web para criar um serviço web que, apesar de
ter a possibilidade de fornecê-las, geralmente não fornece páginas web. A resposta
para esta escolha está na plataforma de desenvolvimento JavaScript Node.js.
A plataforma Node.js foi criada no final de 2009 por Ryan Dahl com a aju-
da de 14 colaboradores tomando como base a engine JavaScript V8 da Google [26].
Com o objetivo de tornar o seu navegador web Chrome mais performáti-
co, a Google criou uma engine que permitia compilar o código JavaScript em código
de máquina nativo. Desta forma, já não é mais necessário o uso de um navegador
web para a execução de códigos escritos na linguagem JavaScript.
Node.js possui uma arquitetura não bloqueante baseada em fila de even-
tos que são tratados de forma assíncrona. Eventos são todas as ações que ocorrem
no sistema. Diferente da programação de páginas web dinâmicas onde temos even-
tos como click do mouse e seleção de itens em listas, o Node.js trata de eventos do
entrada e saída no servidor como a conexão de bancos de dados e a abertura de
arquivos. Ao identificar que um evento ocorreu e foi posto em sua fila, o Node.js pro-
cessa esse evento e não aguarda a sua finalização para que possa processar algum
outro evento que ocorra. Isso dá ao Node.js o poder de atender a um grande número
de eventos sem causar um impacto negativo significativo em sua performance. Além
disto, não são necessários requisitos adicionais de infraestrutura, já que a plataforma
Node.js pode ser executada tanto em ambientes Linux quanto em ambientes Win-
dows sem que seja preciso instalar nenhum outro software de infraestrutura.
Por ser uma plataforma de desenvolvimento, o Node.js possui suporte a
diversas bibliotecas e frameworks JavaScript que podem ser instalados para facilitar
o desenvolvimento de funcionalidades específicas. São tantos que existe um geren-
ciador de componentes na plataforma, o Node.js Package Manager (NPM). Este ge-
renciador baseia-se num arquivo de configuração existente no projeto em formato
4.2.3 TYPESCRIPT
Atores
Ator Descrição
10 A linguagem UML (Unified Modeling Language) é uma notação diagramática para desenhar ou
apresentar Figuras relacionadas a software, principalmente, mas não unicamente, sob o paradigma
da orientação a objetos [30].
37
Hospital responsável
É o estabelecimento de saúde responsável pelo
pelo Cadastro do
Cadastro do Paciente.
Paciente
É o software responsável pela regulação da fila
Sistema
cirúrgica.
Pré-Condição
Hospital responsável pelo Cadastro do Paciente previamente cadastrado no
Sistema.
Fluxo Básico
Regras de
ID Passo Fluxos
Negócio
RN001,
RN002,
Hospital responsável pelo Cadastro do Paciente FE01,
1 RN003,
envia as informações do Paciente ao Sistema FE02
RN004,
RN005
Sistema insere o Paciente na Fila de acordo
2 - RN006
com o critério de prioridade
3 Fim da especificação - -
Fluxos de Exceção
FE01 Token de acesso inválido
Regras
ID Passo de Mensagem
Negócio
O Token de Acesso enviado é
1 - -
inválido.
O Sistema retorna uma mensagem
2 - MSG_E001
de erro.
FE02 As informações do Paciente são inválidas
Regras
ID Passo de Mensagem
Negócio
Uma (ou mais) informação(ões) do
1 - -
Paciente é(são) inválidas.
O Sistema retorna uma mensagem
2 - MSG_E002
de erro.
38
Mensagens
Regras de
Negócio
RN001 – O Hospital responsável pelo Cadastro do Paciente deve ter
sido cadastrado previamente, e ter um token de acesso que deve ser
enviado em todas as interações com o Sistema;
RN002 – O Paciente deve ter Nome, Código de Cadastro no SUS, Data
de Nascimento, Procedimento que aguarda, Gravidade e Status;
RN003 – O Procedimento deve fazer parte da tabela de procedimentos
atendidos pelo SUS, e ter uma Complexidade que será Baixa, Média,
Alta ou Crítica;
RN004 – A Gravidade do Paciente é representada usando a
Classificação ASA;
RN005 – O Status do Paciente será Aguardando, Encaminhado,
Reagendado ou Liberado;
RN006 – O Critério de Prioridade leva em consideração a Gravidade do
Paciente, a Idade do Paciente e o Tempo de Espera;
Atores
Ator Descrição
Hospital responsável
É o estabelecimento de saúde responsável pela Oferta
pela Oferta de
de Cirurgia.
Cirurgia
É o software responsável pela regulação da fila
Sistema
cirúrgica.
Pré-Condição
Hospital responsável pela Oferta de Cirurgia previamente cadastrado no
Sistema.
Fluxo Básico
Regras de
ID Passo Fluxos
Negócio
RN007,
Hospital responsável pela Oferta de Cirurgia
FE01, RN008,
1 envia as informações de uma Oferta de
FE03 RN009
Cirurgia.
Fluxos de Exceção
FE03 As informações da Oferta de Cirurgia são inválidas
Regras
ID Passo de Mensagem
Negócio
Uma (ou mais) informação (ões) da
1 - -
Oferta de Cirurgia é(são) inválidas.
O Sistema retorna uma mensagem
2 - MSG_E003
de erro.
Mensagens
Regras de
Negócio
RN007 – O Hospital responsável pela Oferta de Cirurgia deve ter sido
cadastrado previamente, e ter um token de acesso que deve ser enviado
em todas as interações com o Sistema;
RN008 – Uma Oferta de Cirurgia deve ter Procedimento, Data/Hora e
Status;
RN009 – O Status de uma Oferta de Cirurgia será Agendada, Realizada
ou Cancelada;
Atores
Ator Descrição
É o software responsável pela regulação da fila
Sistema
cirúrgica.
Hospital responsável
É o estabelecimento de saúde responsável pela Oferta
pela Oferta de
de Cirurgia.
Cirurgia
Hospital responsável
É o estabelecimento de saúde responsável pelo
pelo Cadastro do
Cadastro do Paciente.
Paciente
Pré-Condição
Hospital responsável pela Oferta de Cirurgia previamente cadastrado no
Sistema.
Hospital responsável pelo Cadastro do Paciente previamente cadastrado no
Sistema.
Fluxo Básico
Regras de
ID Passo Fluxos
Negócio
O Sistema informa ao Hospital responsável
-
1 pelo cadastro do Paciente os dados da Cirurgia -
Ofertada.
O Sistema altera o Status do Paciente para
2 - -
Encaminhado.
O Hospital responsável pela Oferta de Cirurgia
3 - -
obtém pacientes selecionados.
O Hospital responsável pelo Cadastro do
4 Paciente obtém o encaminhamento dos - RN010
Pacientes selecionados.
5 Fim da especificação - -
Regras de
Negócio
RN010 – O Hospital responsável pelo cadastramento do Paciente será
responsável por encaminhar o Paciente à Cirurgia Ofertada;
42
Atores
Ator Descrição
Hospital responsável
É o estabelecimento de saúde responsável pela Oferta
pela Oferta de
de Cirurgia.
Cirurgia
É o software responsável pela regulação da fila
Sistema
cirúrgica.
Pré-Condição
Hospital responsável pela Oferta de Cirurgia previamente cadastrado no
Sistema.
Fluxo Básico
Regras de
ID Passo Fluxos
Negócio
Hospital responsável pela Oferta de Cirurgia RN011
1 -
informa a realização da Cirurgia.
Sistema altera o Status do Paciente para
2 - -
Atendido.
3 Sistema retira o Paciente da Fila. - RN012
4 Fim da especificação - -
43
Regras de
Negócio
RN011 – Uma vez realizada a Cirurgia, o Hospital responsável pela
Oferta da Cirurgia deve informar sua realização;
RN012 – O Sistema deve retirar da Fila o Paciente que foi atendido.
Atores
Ator Descrição
Hospital responsável
É o estabelecimento de saúde responsável pela Oferta
pela Oferta de
de Cirurgia.
Cirurgia
É o software responsável pela regulação da fila
Sistema
cirúrgica.
Pré-Condição
Hospital responsável pela Oferta de Cirurgia previamente cadastrado no
Sistema.
Fluxo Básico
44
Regras de
ID Passo Fluxos
Negócio
Hospital responsável pela Oferta de Cirurgia RN013
1 -
informa o Cancelamento da Cirurgia.
Sistema altera o Status do Paciente para
2 - -
Aguardando.
3 Sistema realoca o Paciente na Fila. - RN014
4 Fim da especificação - -
Regras de
Negócio
RN013 – Se a Cirurgia for cancelada, o Hospital responsável pela Oferta
da Cirurgia deve informar seu cancelamento;
RN014 – O Sistema deve realocar o Paciente na Fila.
Hospital, que de maneira formal deveria ser Unidade de Atendimento, uma vez que
algumas cirurgias, devido à sua baixa complexidade, poderiam ser realizadas em
clínicas e ambulatórios, no entanto, os especialistas sempre se referem à elas como
Hospitais, motivo pelo qual isto foi assim representado no código-fonte. Outro ponto
que deve ser considerado, em relação a isto, são os nomes das entidades e méto-
dos em português. Havia na equipe de desenvolvimento o desejo de utilizar o inglês
como idioma de escrita do código-fonte, devido a sua familiaridade com o mesmo
por conta das palavras reservadas da linguagem JavaScript serem neste idioma,
mas chegou-se ao consenso de que isto feriria a linguagem ubíqua.
11 Fachada ou Façade é um padrão de projeto que fornece uma interface alternativa para um objeto,
geralmente ocultando sua complexidade dos seus usuários [31].
12 CRUD é o acrônimo de CREATE (criar), READ (ler), UPDATE (atualizar) e DELETE (excluir) na
língua inglesa para as quatro operações básicas utilizadas em bases de dados relacionais (RDBMS)
ou em interface para utilizadores para criação, consulta, atualização e destruição de dados
(https://pt.wikipedia.org/wiki/CRUD).
47
13 Postman é uma ferramenta para a execução de testes de APIs baseados na construção de requisi-
ções HTTP fornecida pela empresa Postdot Tecnologies (http://www.getpostman.com).
14 OSX é um sistema operacional baseado em Unix utilizado nos computadores pessoais da Apple
(http://www.apple.com/macos/sierra).
49
15 A criptografia hash permite que, através de uma string de qualquer tamanho, seja calculado um
identificador digital de tamanho fixo. Uma função hash é dita “one-way” pois uma vez obtido o valor
hash h para uma string x, é computacionalmente impossível fazer o processo inverso, ou seja, encon-
trar o valor de x a partir de h (http://www.gta.ufrj.br/grad/07_1/ass-dig/TiposdeCriptografia.html).
50
Figura 21: Exemplo do Retorno da Requisição para Alterar o Status de uma Cirurgia.
52
7 REFERÊNCIAS BIBLIOGRÁFICAS
[3] NILSSON, Jimmy. Applying Domain-Driven Design and Patterns. Boston: Ad-
dison-Wesley, 2006.
[4] MCCARTHY, Tim. .Net Domain-Driven Design with C#: Problem – Design –
Solution. Indianápolis: Wiley, 2008.
[5] HAYWOOD, Dan. Domain-Driven Design Using Naked Objects. Raleigh: The
Pragmatic Bookshelf, 2009.
[10] TOLKIEN, J. R. R. Lord of The Rings: The Fellowship of The Ring. Scoresby:
Allen & Unwin, 1954.
[13] Justiça determina reavaliação de filas de espera por cirurgias no Rio de Janeiro,
Defensoria Pública da União, Brasília, DF, 16 maio 2014. Disponível em:
http://www.dpu.gov.br/index.php?option=com_content&view=article&id=21592:
55
justica-determina-reavaliacao-de-filas-por-cirurgias-no-rio-de-
janeiro&catid=215:noticias-slideshow&Itemid=458. Acesso em 16 nov. 2016.
[17] e-SUS Hospitalar, DATASUS, Rio de Janeiro, RJ, p. 1 e 10. Disponível em:
ftp://ftp2.datasus.gov.br/public/sistemas/dsweb/datasus/Minuta_site_e-SUS_V2.pdf
Acesso em 16 nov. 2015.
[20] SMITH, Ben. Beginning JSON. New York City: Apress, 2015.
[21] Simple Object Access Protocol (SOAP) 1.1, W3C, Cambridge, MA. Disponível
em: https://www.w3.org/TR/2000/NOTE-SOAP-20000508. Acesso em 16 nov. 2016.
[24] TONG, Kent Ka Iok. Beginning JSF 2 APIs and JBoss Seam. New York:
Apress, 2009.
[26] PEREIRA, Caio Ribeiro. Node.js: Aplicações web real-time com Node.js. São
Paulo: Casa do Código, 2014.
[27] MAHARRY, Dan. TypeScript Revealed. New York City: Apress, 2013.
56
[28] MILANI, André. MySQL: Guia do Programador. São Paulo: Novatec, 2006.
[31] STEFANOV, Stoyan. Padrões JavaScript. São Paulo: Novatec, 2011. Tradução
de JavaScript Patterns, 1st Edition.