Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

AULA 1 - INTRO À ARQUITETURA DE SISTEMAS 
 
ARQUITETURA DE SISTEMAS → Cria uma estrutura conceitual que fornece uma visão geral do sistema, 
tanto para o cliente quanto para a equipe de desenvolvimento, antes que o processo de construção seja 
iniciado. Um modelo é estabelecido, definindo os componentes do sistema e suas interações. 
● É um elemento crucial para o sucesso do desenvolvimento de um sistema computacional. Ela 
(arquitetura) tem como objetivo principal FACILITAR COMUNICAÇÃO E COLABORAÇÃO entre 
todas as partes envolvidas no processo, desde os clientes e usuários finais até os desenvolvedores e 
as equipes de projeto. 
● A escolha dos princípios de arquitetura está diretamente relacionada ao tipo de sistema que será 
desenvolvido. Cada tipo de sistema pode demandar uma abordagem arquitetural específica. 
 
A ARQUITETURA DE SISTEMAS é uma SUBÁREA da ENGENHARIA DE SOFTWARE, que se refere à 
estrutura interna do sistema, explicando como um software se organiza, funciona, além da forma como é 
implementado. 
OBS: Ao se considerar a arquitetura de um sistema, são analisados principalmente os REQUISITOS 
apontados pela equipe responsável pelo levantamento de requisitos. Analisar detalhadamente os requisitos 
contribui para que a escolha da arquitetura esteja de acordo com os objetivos do desenvolvimento do 
sistema. 
● Basicamente, se preocupa em satisfazer os requisitos do cliente e apresentar para ele uma ideia 
concreta do projeto. 
 
A ARQUITETURA DE SISTEMAS é importante por três motivos: 
● As diversas representações da arquitetura de software permitem a comunicação entre todas as 
partes envolvidas no desenvolvimento de um sistema computacional. 
● Porque a arquitetura implica em decisões durante a fase inicial que impactam todo o 
desenvolvimento do projeto e o produto final de software. 
● Por fim, a arquitetura se constitui como um modelo mental de como o sistema será estruturado e 
como os seus componentes trabalharão em conjunto. 
A ESCOLHA DA ARQUITETURA pode contribuir para que o projeto: 
● Nasça alinhado aos requisitos para os quais ele será desenvolvido. 
● Sejam detalhados e desenvolvidos componentes que poderão ser reutilizados mais tarde (viabiliza a 
reusabilidade de software para sistemas com requisitos semelhantes). 
● Além de garantir a manutenção de cada um desses componentes de forma mais simples 
Dessa forma, o arquiteto de software terá, dentre outras funções, a responsabilidade de mapear quais são 
esses componentes e como eles vão interagir com os outros elementos do sistema. Além disso, o arquiteto 
precisa ser capaz de identificar os componentes e saber quais deles podem ser reutilizados, melhorando o 
tempo de desenvolvimento. 
 
Há 3 ELEMENTOS FUNDAMENTAIS para qualquer projeto de arquitetura de sistemas: 
COMPONENTES: Unidades principais do sistema; podem ser caracterizados por módulos de software 
com responsabilidades específicas dentro do sistema. 
PROPRIEDADES: Elementos que se referem às particularidades de cada componente. 
CONECTORES: Caracterizados por todas as formas de conexão entre os componentes de um 
sistema. Eles podem ser caracterizados por chamadas de métodos, envio e requisição de mensagens 
e outras formas que garantem a interação entre os componentes do sistema. 
 Outro elemento fundamental é a definição do: 
● GÊNERO ARQUITETURAL: Uma categoria particular de sistemas; nesse sentido, inclui toda a 
variedade de produtos de software, como aplicativos, sistemas comerciais, de escritório e tantos 
outros. Cada um desses gêneros de arquitetura demandam a existência de estruturas específicas a 
serem modeladas e desenvolvidas. 
Exemplos de gêneros de arquitetura de sistemas: 
Inteligência artificial, Dispositivos, Governo, Sistemas operacionais, Comercial, Esportes e 
entretenimento, Industriais, Plataformas, Comunicações, Financeiros, Legais, Científicos, Autoria de 
conteúdo, Jogos, Médicos, Transportes, Serviços públicos, Ferramentas 
 
A partir da definição do gênero, define-se o: 
● ESTILO DE ARQUITETURA: É um template para a construção que irá nortear o projeto. 
○ Ou seja, é por meio da definição de estilos que se podem considerar as características 
personalizadas a serem acrescentadas ao produto que será desenvolvido. Nesse sentido, 
o estilo arquitetônico de um sistema define o conjunto de componentes, as conexões entre 
eles, as restrições e os modelos semânticos que permitem que o projetista compreenda as 
propriedades gerais de um sistema. 
● Exemplos de Estilos de Arquitetura: 
○ Centralizada em Dados; Fluxo de Dados; Chamadas e Retornos; Orientadas a Objetos; 
Cliente-Servidor. 
 
A partir da escolha da arquitetura do sistema, ficarão evidenciadas as CAMADAS que o sistema terá. Se a 
arquitetura for de um sistema operacional, obviamente as camadas serão diferentes de um software de 
gestão empresarial. Entre as camadas comuns em um software, temos: 
● INTERFACE (camada mais externa); 
● CAMADA DE NEGÓCIOS; 
● CAMADA CENTRAL (camada mais próxima à linguagem de máquina). 
Definir a arquitetura e as camadas de um sistema pode contribuir também para que os próximos projetos de 
software sejam desenvolvidos de forma mais rápida e com menor número de erros. Isso ocorre porque essas 
camadas podem ser reaproveitadas para outros sistemas similares. 
 
Existem duas principais Arquiteturas de Desenvolvimento de Software: 
ARQUITETURA MONOLÍTICA → Essa abordagem de estrutura de sistemas é baseada no princípio de que 
todos os processos/funções dentro de uma mesma solução são altamente acoplados/unidos, 
dependentes, compartilham de uma única base de dados e executam todos os processos como se 
fosse um único serviço. 
● A arquitetura monolítica é um SISTEMA ÚNICO, ou seja, todas as funções estão em um único 
pacote a ser distribuído ao cliente. 
● Por ser uma estrutura tradicional, é mais conhecida e utilizada em soluções aplicadas no mercado. 
EXEMPLO: 
● Imagine o aplicativo do seu banco. Nele existem diversas funcionalidades, como: transferências, 
pagamentos, investimentos, entre outros. Em um sistema de arquitetura monolítica todas estas 
funcionalidades e seus processos estão altamente acoplados/unidos, utilizando o mesmo banco de 
dados. Dessa forma, todas as funções do sistema são implementadas em um único processo e caso 
seja necessário realizar uma atualização ou aplicação em uma única funcionalidade do sistema, todo 
o aplicativo precisaria sair do ar. 
VANTAGENS: 
● Estruturação simplificada: Por ser um projeto único, a estruturação é a mesma para todas as partes 
do sistema; 
● Poucos recursos tecnológicos: Um sistema monolítico requer menos recursos tecnológicos, em 
geral necessitando de dois ou três recursos, como por exemplo, servidor de aplicação, servidor de 
banco de dados e servidor de e-mail; 
● Um único profissional técnico: Apesar de não recomendado, mas uma aplicação monolítica pode 
ser desenvolvida utilizando apenas um profissional, dado o contexto em que, apresentação e 
processamento podem ser feitos utilizando uma única linguagem de programação; 
● Baixa integração: Não há necessidade de realizar integração entre módulos distintos dentro do 
mesmo sistema, tais “integrações” são feitas dentro do código-fonte; 
DESVANTAGENS 
● Manutenção: A aplicação se torna cada vez maior, o código será cada vez mais difícil de entender e o 
desafio de fazer alterações rápidas e ter que subir para o servidor só cresce; 
● Linha de código: Uma linha de código que subiu errada pode quebrar todo o sistema e ele ficar 
totalmente inoperante; 
● Difícil de testar: Dado o alto acoplamento dos objetos de negócio, realizar testes é complexo, pois as 
funções e características acabam por ser contaminar com necessidades de outros módulos do 
sistema; 
● Difícil de escalonar: Por ser uma aplicação única, o escalonamento/escalabilidade só pode ser feito 
do sistema como um todo, isso significa, escalonar inclusive partes do sistema que estão 
super-dimensionadas; 
● Linguagens de programação:viável financeiramente, utilizando os ativos do software, além da preocupação em 
manter a imagem da organização 
CONCEITOS LIGADOS AO DESENVOLVIMENTO DE SOFTWARE ORIENTADO A ASPECTOS 
Adendo: Código que implementa um interesse. 
Aspecto: Uma abstração de programa que define o interesse transversal. Inclui a definição de um ponto de 
corte e do adendo associado com esse interesse. 
Ponto de junção: Evento em um programa em execução em que o adendo associado com um aspecto pode 
ser executado. 
● É como um ponto existente no fluxo de realização de um programa, que tem como referência os 
elementos em que serão inseridos os aspectos. Esses pontos são empregados, dentre outros motivos, 
para a chamada e a execução dos métodos e dos construtores, a inicialização, a referência a campos 
e a execução de tratamento de exceções 
Modelo de ponto de junção: Conjunto de eventos que podem ser referenciados em um ponto de corte. 
Ponto de corte: Uma declaração, inclusa em um aspecto, que define os pontos de junção em que o adendo 
de aspecto associado deve ser executado. 
● São os requisitos presentes em um aspecto em que são apresentados os pontos de junção nos quais 
se quer encerrar a execução de um programa, visando à interceptação de um aspecto, por meio da 
alteração do comportamento desse programa. Eles possuem assinaturas de práticas que podem ser 
localizadas visando a modificar o ciclo de execução original do programa e à introdução de adendos, 
que são as novas chamadas. 
Composição: A incorporação do código de adendo em ponto de junção específico por um compositor de 
aspectos. 
VERIFICAÇÃO e VALIDAÇÃO → Consistem no processo de exposição de um programa para visualizar 
se ele atende à sua especificação, assim como às prioridades dos stakeholders. 
VALIDAÇÃO ESTÁTICA: Visa à avaliação manual ou de forma automatizada em relação ao 
código-fonte utilizado no programa. 
VALIDAÇÃO DINÂMICA: É empregada para descobrir falhas no programa ou para demonstrar a 
capacidade do programa de atender aos seus requisitos. 
PROCEDIMENTO DE TESTE: Tende a ser direcionado pelo conhecimento do código-fonte do programa, 
caso a verificação de falhas seja o principal objetivo. 
MEDIÇÕES: (Métricas) de cobertura de testes servem para demonstrar o nível de eficiência deles. Isso 
ocorre quando as declarações do código-fonte forem realizadas. 
 
Não existe grande diferença entre os procedimentos de teste realizados em sistemas orientados a aspectos e 
aqueles realizados em outros sistemas. Os testes são projetados para apresentar a capacidade do sistema 
de atender aos requisitos. 
Se compararmos com a orientação a objetos, verificaremos que esta trata do conjunto de atributos e classes 
que compõem um sistema de informação. Porém, a utilização de aspectos traz uma série de problemas 
reais, e o código-fonte do programa é utilizado para reconhecer potenciais de falhas. 
 
AULA 12 - PROJETO DE SOFTWARE WebApps 
 
Devido, principalmente, à sua natureza dinâmica, os PROJETOS DE WebApp foram desenvolvidos por muito 
tempo sem qualquer preocupação em seguir métodos de desenvolvimento que garantisse a organização e a 
qualidade do software. Contudo, essa situação apresentou-se como um grande problema. Se um projeto 
pequeno pode mostrar-se quase impraticável, projetos de porte maior são, realmente, impraticáveis sem um 
projeto adequado. 
Em busca de uma solução capaz de oferecer o devido controle e agilidade para os projetos de WebApps, 
pesquisadores propuseram uma sequência metodológica de tarefas, atividades e objetivos que podem, 
inclusive, ser adaptados de processos de softwares tradicionais e que, se seguidos, elevam 
consideravelmente as chances de sucesso do projeto. 
● Uma característica essencial de uma aplicação web é seu dinamismo. As necessidades de uma 
aplicação web podem mudar em pouquíssimo tempo, levando à necessidade de projetos que tomem 
cada vez menos tempo e aplicações cada vez mais adaptáveis às necessidades atuais de seus 
usuários. 
 
A primeira atividade que deve ser realizada no planejamento de uma aplicação Web é responder as 
perguntas a seguir: 
1. Qual é a motivação da WebApp, ou seja, quais são as necessidades do negócio? 
2. Quais são os objetivos que devem ser atendidos pela WebApp? 
3. Quem vai usar a WebApp? 
Para ter sucesso, você precisa definir respostas simples e sucintas para essas questões; a partir delas, você 
poderá especificar as metas para o projeto de sua aplicação Web: 
1. Metas Informacionais: Cuja finalidade é o fornecimento de conteúdo específico ou informações ao 
usuário final; 
2. Metas Aplicativas: Cuja intenção é a realização de alguma tarefa dentro da WebApp. 
Uma vez que as metas tenham sido estabelecidas, você pode definir o perfil de seus usuários. Após ser 
definido o perfil, você poderá levantar quais são as características mais relevantes para o atendimento das 
expectativas do usuário da sua WebApp. 
LEVANTAMENTO DE REQUISITOS PARA APLICAÇÕES WEB 
Diversas técnicas de levantamento de requisitos da engenharia de software — aplicadas no desenvolvimento 
de aplicações tradicionais — podem ser também aplicadas no desenvolvimento de WebApps. Contudo, 
deve-se atentar aos diferentes contextos dos sistemas tradicionais e dos WebApps. O dinamismo das 
aplicações para Web talvez seja a sua principal característica, pois métodos que requerem tempo para serem 
aplicados não são considerados a melhor escolha. 
Qualquer modelo tradicional pode ser adaptado, não somente os modelos ágeis e desde que seus objetivos 
sejam modificados para os objetivos de um projeto de WebApp. 
 
Para isso, basta que os seus objetivos sejam adaptados: 
● Identificar requisitos de conteúdo; 
● Identificar requisitos funcionais; 
● Definir os cenários de interação para diferentes classes de usuários. 
 
A obtenção dos requisitos para a aplicação Web pode ser conduzida da seguinte forma: 
1. Solicite aos interessados para definirem as categorias de usuários e desenvolverem descrições 
de cada uma delas. 
● “Qual é o objetivo global do usuário quando ele utiliza a WebApp?” 
● Qual é o conhecimento e a sofisticação do usuário em relação ao conteúdo e à funcionalidade 
da WebApp? 
● Como o usuário chegará até a WebApp? 
● Quais são as características genéricas da WebApp que poderiam agradar/desagradar ao 
usuário? 
2. Procure manter uma comunicação ativa com os interessados, para definir quais serão os 
requisitos básicos da WebApp. 
● Pode-se escolher uma técnica para reunir um grupo formado por usuários e pessoas 
interessadas no WebApp a fim de levantar os requisitos mais gerenciáveis. 
3. Analise a informação coletada e a utilize para realizar conferências com os interessados. 
● À medida que a informação é coletada, você deve categorizá-la por classe de usuário e tipo de 
transação; depois, ela deve ser avaliada quanto à sua relevância. 
4. Defina os CASOS DE USO, que vão descrever os cenários de interação para cada uma das 
categorias de usuários. 
● Deverão descrever como uma categoria de usuários vai interagir com a aplicação Web ao 
realizar uma operação específica. Você não pode esquecer que os casos de uso devem 
descrever a interação sob o ponto de vista do usuário. 
OBJETIVOS DE UM PROJETO WebApp 
Simplicidade: entenda que uma aplicação deve fazer uso moderado de qualquer um de seus recursos, como 
conteúdo, aspectos visuais, animações, etc. 
Consistência: é um objetivo aplicável a qualquer elemento do projeto. O conteúdo deve ser construído com 
consistência, o design gráfico deve apresentar aspectos semelhantes em todas as partes da aplicação Web, 
e assim por diante. 
Identidade: o design, isto é, a apresentação gráfica de uma aplicação Web deve ser coerente com o domínio 
da aplicação para a qual está sendo desenvolvida. Uma aplicação de e-commerce certamente terá aspectos 
diferentes de uma aplicação de e-learning. 
Robustez: O usuário espera que o conteúdo da WebApp seja robusto e relevante às suas necessidades. 
Caso os elementos estejam faltando,ou seja, sejam insuficientes, então, é provável que a WebApp fracasse. 
Navegabilidade: a navegação deve ser projetada para ser intuitiva e previsível. Isso significa que o usuário 
deve saber navegar pela WebApp sem ter que buscar links ou instruções de navegação. 
Apelo visual: de todas as categorias de software possíveis, as aplicações Web são inquestionavelmente as 
mais visuais, dinâmicas e estéticas. Contudo, a beleza de uma WebApp é algo que varia de acordo com a 
ótica de quem vê; sendo assim, o indicado é o equilíbrio entre os componentes. 
Compatibilidade: uma aplicação Web deve ser utilizada em uma variedade de ambientes e deve ser 
projetada para ser executada perfeitamente em cada um deles. 
 
Durante o projeto de um WebApp, deve-se também atender a uma série de requisitos de qualidade. São eles: 
Usabilidade: Facilidade de compreensão geral do site, feedback on-line, recursos de ajuda etc. 
Funcionalidade: Abrange a capacidade de busca e recuperação de dados, as características de navegação 
e leitura das informações e as demais características relacionadas ao domínio da aplicação. 
Confiabilidade: Correto processamento dos links, recuperação de erros, validação e recuperação dos dados 
de formulários etc. 
Eficiência: Velocidade de carregamento das páginas, tempo de resposta, velocidade de geração das 
imagens etc. 
Facilidade de manutenção: O site deve ser extensível, adaptável e fácil de corrigir, além de contar com 
outras características que facilitem sua manutenção. 
 
DESENVOLVIMENTO DE UM PROJETO WebApp 
Para conduzir o desenvolvimento de uma aplicação Web, é necessário realizar os seguintes projetos: 
Projeto de Interface 
Um dos maiores desafios de um projeto de interface é determinar o ponto de entrada do usuário, ou seja, de 
onde virá o usuário. No projeto de interface, é definido como tudo será apresentado para o usuário, daí a 
preocupação em saber de onde este vem, pois, dependendo da origem de entrada do usuário, a forma de 
apresentação do WebApp deverá ser diferente. Para isso, deve-se: 
● Estabelecer uma janela para o conteúdo e a funcionalidade fornecidos pela interface; 
● Guiar o usuário com uma série de interações com a WebApp; 
● Organizar as opções de navegação e conteúdo disponíveis para o usuário. 
Projeto Estético 
● Também chamado de projeto gráfico, trata-se do esforço artístico que complementa os aspectos 
técnicos do projeto. Com o projeto estético, você deve atrair o usuário para um mundo que envolve 
elementos físicos e intelectuais. Assuma-o como um requisito, tentando responder a seguinte 
pergunta: “qual é o visual que os usuários desejam?”. Um projeto estético envolve também 
questões relacionadas ao layout e ao design gráfico. 
Projeto de Conteúdo 
● No projeto de conteúdo, a preocupação maior está no que será inserido em cada componente, e como 
serão apresentados. 
Projeto de Arquitetura 
● Está diretamente relacionado aos objetivos estabelecidos para uma WebApp, ao conteúdo que deve 
ser apresentado, aos usuários que vão visitar a página e à filosofia de navegação que será 
estabelecida. 
● Permite definir quais serão as regras de navegação em um WebApp, ou seja, por quais caminhos o 
usuário poderá seguir uma vez que estiver dentro da aplicação web. 
● TIPOS DE ARQUITETURAS DE CONTEÚDO 
 
 
O LINEAR é utilizado para 
determinar um fluxo pré-definido, 
ótimo em casos de tutoriais, 
quando se deseja direcionar o 
usuário. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
O modelo em GRADE permite 
que componentes 
"semelhantes" ou "de um 
mesmo grupo" sejam 
organizados em conjuntos. 
 
 
 
 
 
 
 
 
HIERÁRQUICA 
O usuário pode descer por 
uma hierarquia de 
componentes, podendo 
sempre que necessário subir 
na hierarquia ou visitar os 
componentes que estão no 
mesmo nível ou níveis 
inferiores do ramo hierárquico 
que decidiu seguir. 
 
 
 
 
 
Em um modelo de ESTRELA, 
a navegação é aberta, o 
usuário pode seguir de 
qualquer ponto para qualquer 
outro ponto, o que pode causar 
confusão. 
 
 
 
 
 
Projeto de Navegação 
● Uma vez que a arquitetura da WebApp está estabelecida, com todos os seus componentes 
identificados e desenvolvidos, deve-se, então, definir quais serão os percursos de navegação que 
permitirão que o usuário chegue a uma determinada informação. Isso é feito identificando-se qual será 
a semântica de navegação para os diferentes grupos de usuários da WebApp, bem como 
definindo-se a mecânica para obtenção da navegação. 
● Essa etapa se inicia com a definição da hierarquia dos usuários e dos casos de uso relativos, que 
permitam ilustrar as diferentes necessidades de navegação de cada grupo de usuários (que podem 
ser representados por um ator, em um diagrama de casos de uso). À medida que um usuário interage 
com uma WebApp, surge uma série de novas unidades semânticas de navegação (NSU, do inglês 
navigation semantic unit), que são conjuntos de informações estruturadas de navegação e que 
colaboram para o cumprimento de um subconjunto de requisitos do usuário. 
● Os elementos que compõem uma NSU são chamados de modos de navegação (WoN, do inglês way 
of navigation) e representam o melhor percurso de navegação para que se possa atingir uma 
determinada meta de um usuário específico (o melhor caminho que um usuário pode seguir dentro de 
uma aplicação para realizar a tarefa que ele deseja dentro desta aplicação). Os WoN, por sua vez, são 
compostos de objetos conhecidos como nós de navegação (navigation nodes), que são interligados 
por links de navegação. 
● À medida que se prossegue com o projeto, é preciso também definir qual será a mecânica de 
navegação. Essa é uma atividade que envolve a utilização de links, menus, barras, botões, imagens 
clicáveis e diversos outros recursos capazes de orientar a navegação do usuário pela WebApp. 
● Ou seja, no projeto de navegação, é determinado como será o fluxo de transição entre os 
componentes, seja do ponto de vista do usuário, seja dos componentes. (O caminho a ser 
seguido entre as telas do webapp para realizar cada tarefa que ele se propõe a fornecer). 
Projeto em Nível de Componentes 
Na etapa projeto de componentes, a preocupação está na definição de quais serão e o que fará cada um dos 
componentes do WebApp. 
 
AULA 13 - MODELAGEM ÁGIL 
Nos processos de desenvolvimento clássicos, os softwares eram entregues fora de prazo, com baixa 
qualidade, preço muito acima do acordado e geralmente não atendiam todas as funcionalidades desejadas 
por seus clientes. Dessa forma, as práticas de gerenciamento de projetos de software precisaram se adaptar 
às novas exigências do mercado, relacionadas, sobretudo, a entregar valor ao cliente de maneira otimizada, 
transparente e colaborativa. 
Assim, foi criada a MODELAGEM ÁGIL → Uma metodologia baseada na prática para modelagem e 
documentação eficaz de sistemas baseados em software. Em outras palavras, é um conjunto de valores, 
princípios e práticas para modelagem de software que pode ser aplicado em um projeto de desenvolvimento 
de uma maneira efetiva e leve. 
METODOLOGIA ÁGIL X METODOLOGIA TRADICIONAL 
METODOLOGIA TRADICIONAL → Não tem muita flexibilidade em relação a mudanças, uma vez que suas 
etapas do processo de desenvolvimento devem ser executadas uma após a outra, ou seja, uma tarefa não 
pode ser iniciada enquanto a anterior não for concluída. Prioriza a ideia inicial do projeto. 
● Ex: Modelo Cascata 
METODOLOGIA ÁGIL → Apresenta maior flexibilidade, versatilidade e dinamismo no seu 
desenvolvimento, atentando-se mais à entrega de valor para o software do que ao planejamento inicial. 
● Prioriza os benefícios para o cliente, trazendo um desenvolvimento mais flexível para os times de 
desenvolvimento, já que, se for necessário mudar, a mudança é feita, mesmo que mude a idealização 
inicial de alguma funcionalidade do projeto. 
 MÉTODO ÁGIL MÉTODO TRADICIONAL 
TRANSPARÊNCIA 
O cliente acompanha de perto as atividades 
realizadas durante todo o processo de 
desenvolvimento.O cliente passa muito tempo sem saber o 
que está sendo feito e como está o 
processo de desenvolvimento. 
TESTES São realizados vários testes e muitos feedbacks, 
o que gera um resultado final. 
Todo o projeto é criado para somente ao 
final realizar testes, aumentando o risco 
de falhas não previstas. 
PRINCÍPIOS DA MODELAGEM ÁGIL 
● Indivíduos e interações, em vez de processos e ferramentas; 
● Software funcionando, em vez de uma documentação abrangente; 
● Colaboração do cliente, em vez de negociação de contratos; 
● Respostas a modificações, em vez de seguir um plano. 
Princípios mais significativos: 
Modele com um Objetivo: Deve-se ter um objetivo antes de criar um modelo, comunicando informações ao 
cliente, por exemplo. Uma vez identificado o objetivo, ficará mais claro o tipo de notação a ser utilizado e o 
nível de detalhamento necessário. O princípio-chave “modele com um objetivo” visa a estimular a criação 
somente de artefatos e modelos que realmente vão colaborar para o projeto. Evite criar documentos 
desnecessários, que contemplem um único processo que necessita de tais documentações, mesmo que 
ninguém precise delas; estes jamais serão usados. Ao criar qualquer documento, questione-se para quem 
está sendo produzido esse documento. Pesquise sobre o que exatamente será necessário no documento. O 
documento só tem validade se ele se destina a alguém; caso contrário, questione sua relevância. Uma 
modelagem com um propósito nos permite criar uma documentação leve, útil e fácil de manter. 
Use Modelos Múltiplos: Há diferentes modelos e notações que podem ser usados para descrever software. 
Portanto, para propiciar uma ideia necessária, cada modelo deve apresentar um aspecto diferente do 
sistema, e somente aqueles que valorizem esses modelos para a solução pretendida devem ser usados. 
Viaje Leve: Em atividades de análise e modelagem, é saudável que seus modelos ou artefatos não 
contenham todos os detalhes, pois, em uma sessão de modelagem, o principal objetivo é esclarecer ou obter 
novas ideias. Logo, ao longo do desenvolvimento da engenharia de software, conserve apenas aqueles 
modelos que terão valor no longo prazo e despache o restante. Toda vez que se escolhe por manter um 
modelo, troca-se a agilidade pela conveniência de ter aquela informação acessível para a equipe de uma 
forma abstrata. 
Conteúdo é mais importante do que a representação: Um modelo sintaticamente perfeito pode produzir 
menor efeito qualitativo em conteúdo do que um modelo que tem notações falhas, mas fornece conteúdo 
valioso para seu público-alvo. 
Tenha conhecimento e domínio dos modelos e das ferramentas que for utilizar: Aproprie-se de cada 
modelo e ferramenta, para compreender seus pontos fortes e fracos. 
Adapte localmente: Mantenha-se sempre em contexto. Ou seja, a abordagem de modelagem deve ser 
adaptada às necessidades da equipe ágil. 
 
PRÁTICAS UTILIZADAS NA MODELAGEM ÁGIL 
TRABALHO EM EQUIPE: Modele em Conjunto 
● Permite uma comunicação eficaz com a equipe e os envolvidos no projeto. O processo de 
desenvolvimento de um software é um processo crítico para ser feito por uma única pessoa. Quando 
você modela com um propósito, deseja-se que o modelo comunique suas ideias aos demais 
interessados no projeto, com o intuito de criar um pensamento comum em relação ao projeto. O ideal 
é que se modele em conjunto, pois duas ou mais cabeças podem trabalhar melhor do que uma e gerar 
os melhores modelos. O trabalho em equipe possibilita transmitir a visão exata do assunto discutido. É 
melhor desenhar um diagrama em conjunto com o seu cliente e os demais interessados no software 
(para compartilhar pensamentos e aprendizados) do que apresentar para o cliente um diagrama já 
pronto, que provavelmente não atenderá a todas as suas necessidades. 
VALIDAÇÃO: Prove com código 
● O maior objetivo do uso dos modelos é obter uma abstração de alto nível, que dê uma visão da 
solução dos problemas, mas que seja implementável em código, sempre. Isso porque, se essas 
DOCUMENTAÇÃO Criada sempre que for necessária e de forma 
prática e planejada. 
Para todo projeto são feitas 
documentações pré-definidas, às vezes 
desnecessárias. 
CONTROLE Na ocorrência de erros, rapidamente é tomada 
uma providência para corrigir o problema. 
Há dificuldade para tratar problemas não 
previstos. 
EQUIPE Colaborativa (que se auto-organiza e se ajuda) Competitiva (Cada um faz o seu) 
LIDERANÇA Cooperativa (O líder ajuda a todos) Autoconfiante e delegativa 
soluções não forem passíveis de uma implementação condizente com as restrições de arquitetura, 
nada será aproveitado, e a modelagem terá sido inútil. Para determinar se esses modelos realmente 
funcionarão, você deverá validá-los, escrevendo o código correspondente. 
SIMPLICIDADE: Use Ferramentas Simples 
● Utilizar ferramentas simples, como quadro branco, papel e caneta, é muito importante, pois permite 
até que o próprio cliente crie modelos de forma simples, sem que se sinta intimidado pelo uso de 
modelos e ferramentas computadorizadas. 
MODELAGEM ITERATIVA E INCREMENTAL: Modelo em Pequenos Incrementos 
● Organiza um esforço maior em partições menores, que são liberadas rapidamente, de preferência em 
incrementos de várias semanas, um mês ou dois meses. 
● Essa prática aumenta sua agilidade, permitindo que você entregue o software nas mãos do cliente 
com mais rapidez e, assim, obtenha um retorno concreto e rápido dele sobre o projeto. Com o 
desenvolvimento incremental, você modela um pouco, codifica um pouco, testa um pouco e, depois, 
entrega um pouco. A maioria das sessões de modelagem, reuniões improvisadas de pessoas para 
explorar um ou mais problemas, duram cerca de 10 ou 20 minutos. 
● Quanto mais tempo você passar sem retorno concreto, maiores são as chances de que sua 
modelagem não corresponda às necessidades do cliente, sendo, portanto, um esforço desperdiçado 
FERRAMENTAS DE MÉTODOS ÁGEIS 
SCRUM: Utiliza ciclos chamados de sprints, que representam um prazo dentro do qual um conjunto de 
atividades deve ser executado. As funcionalidades a serem implementadas em um projeto são mantidas em 
uma lista, que é conhecida como product backlog (lista de funcionalidades desejadas de um produto). 
● No início de cada sprint, é realizada uma reunião de planejamento, na qual o product owner (membro 
de um time que utiliza Scrum) dá prioridade aos itens do product backlog. A equipe, com base na 
prioridade escolhida, seleciona as atividades que ela será capaz de implementar durante o sprint que 
será iniciado. Diariamente é feita uma breve reunião, com o objetivo de difundir o conhecimento sobre 
o que foi produzido no dia anterior, identificar dificuldades e priorizar o trabalho no dia que se inicia. 
● No fim de uma sprint, a equipe apresenta as funcionalidades implementadas em uma reunião de 
revisão do sprint e o ciclo se reinicia no planejamento da próxima sprint. 
PROGRAMAÇÃO EXTREMA (XP): É um metodologia que tem como objetivo criar sistemas com alta 
qualidade, com base em uma interação próxima com os clientes, testagem constante para obter feedbacks e 
ciclos de desenvolvimento curtos. 
● A XP é uma metodologia leve para times de tamanho pequeno a médio que desenvolvem software 
perante requisitos vagos que se modificam rapidamente. 
OPENUP: Possui os seguintes princípios. 
● Balancear prioridades competidoras, para maximizar o valor aos envolvidos do projeto. 
● Colaborar para alinhar interesses e compartilhar entendimento. 
● Focar cedo na arquitetura, para minimizar riscos e organizar o desenvolvimento. 
● Evoluir para continuamente obter feedback e melhorar. 
KANBAN: O termo “Kanban” é de origem japonesa e significa “sinalização” ou “cartão” e propõe o uso de 
cartões (post-its) em um quadro ou mural para indicar e acompanhar o andamento da produção dentro da 
indústria. Trata-se de um sistema visual que busca gerenciar o trabalho conforme ele se move pelo processo. 
Os post-its são divididos em 3 estágios no mural: “A fazer”,“Trabalho em progresso” e “Feito”, as atividades 
começam no primeiro estágio e vão caminhando até o último para que todos possam ver o progresso. 
 
AULA 14 - DOMAIN-DRIVEN DESIGN 
DOMÍNIO DO SISTEMA → É utilizado para denotar ou agrupar um conjunto de sistemas/aplicações ou de 
áreas funcionais dentro dos sistemas, que compartilham um conjunto de características. Uma das principais 
tarefas do desenvolvimento de software é a requisição ou licitação de requisitos do domínio do sistema. 
Nesse ponto, as práticas de modelagem de domínio são amplamente utilizadas, para a produção de um 
modelo de domínio alinhado com as regras de negócio, ou seja, com os requisitos de domínio do sistema. É 
comum o emprego de padrões de modelagem de domínio, como o domain-driven design (DDD, ou projeto 
orientado a domínio), para esse fim. 
MODELAGEM DE DOMÍNIO → É uma etapa criacional onde o desenvolvedor precisa colocar em prática sua 
criatividade atrelada aos conceitos de modelagem de software. 
DDD → Modela o domínio de um software em desenvolvimento visando atingir a implementação dos 
requisitos necessários para o domínio real de negócio do cliente. (Visa atender às necessidades do cliente). 
● É um padrão de modelagem de software com base no paradigma orientado a objetos. Esse padrão 
busca reforçar conceitos e boas práticas relacionadas à OO, visando a expressar a relação entre um 
contexto ou domínio, um problema e uma solução para esse problema, de acordo com as regras que 
definem um domínio específico. 
● O conceito de DDD é uma abordagem de modelagem de software que segue um conjunto de 
práticas com objetivo de facilitar a implementação de complexas regras e processos de 
negócios que tratamos como domínio. 
○ Portanto, o conceito de DDD é um assunto que se refere a design de código. Esse design é 
guiado pelo domínio de sua aplicação, ou seja, uma modelagem de software focado em 
resolver os problemas de complexidade da regra de negócio. 
● DDD dispõe de uma prática amplamente utilizada para testar, de forma unitária, cada classe base do 
domínio da aplicação, o TDD – Test-Driven Development (Desenvolvimento Orientado a Testes). Essa 
abordagem oferece o conceito de codificar um sistema com 100% de cobertura dos testes. 
● TDD - Os desenvolvedores usam testes para guiar o projeto do sistema durante a implementação. 
Com os resultados (falhas ou sucessos), é possível acompanhar o progresso da construção do 
software. O código só poderá ser totalmente implementado se todos os casos de testes forem 
realizados com sucesso, caso ocorra falhas, o código deve ser refatorado e testado novamente. 
BENEFÍCIOS PROMOVIDOS PELO USO DE DDD → Comunicação da equipe (pois utiliza uma linguagem 
ubíqua para comunicação entre seus participantes), extensibilidade (facilita alterações) e testabilidade. 
ASPECTOS QUE DESCREVEM A ESSÊNCIA DE OO: A utilização desse conjunto de características de 
maneira padronizada, ao ponto de a repetibilidade de tais características se tornar uma conduta correta, é 
chamado de boas práticas de programação. 
● Alinhamento do código com o negócio: o contato dos desenvolvedores com os especialistas do 
domínio é algo essencial quando se faz DDD, uma vez que promove um entendimento único sobre as 
regras de negócio do software em questão. 
● Reutilização: os blocos de construção desenvolvidos facilitam o aproveitamento de um mesmo 
conceito de domínio ou um mesmo código em vários momentos do desenvolvimento. 
● Baixo acoplamento: em um modelo bem-feito, refinado e organizado, as várias partes de um sistema 
interagem, sem que haja muita dependência entre módulos ou classes de objetos de conceitos 
distintos. 
● Independência da tecnologia: o DDD não foca em tecnologia, mas, sim, em entender as regras de 
negócio e como elas devem estar refletidas no código e no modelo de domínio. Isso não quer dizer 
que a tecnologia usada não é importante — apenas significa que essa não é uma preocupação do 
DDD. 
BLOCOS OU ARQUITETURA EM CAMADAS DO DDD: 
Uma vez que a equipe de programação se decida por utilizar o DDD, é necessário que, inicialmente, o 
software seja dividido por blocos de responsabilidades. A aplicação é dividida em 4 camadas/blocos: 
INTERFACE DE USUÁRIO: Essa camada tem a responsabilidade de prover a comunicação do usuário com 
a base de dados do software, tanto para receber comandos como para simplesmente verificar resultados na 
tela da aplicação. O usuário não precisa necessariamente ser uma pessoa, podendo até mesmo ser outro 
sistema (Web services, motores de indexação, etc.). Essa camada exibe informações do sistema ao 
usuário (exibe respostas do sistema) e também interpreta comandos do usuário (por meio de entrada 
de dados). 
APLICAÇÃO: Nesta camada, as operações de coordenação da aplicação e de suporte a outras tarefas 
técnicas são o foco principal. Nesse ponto do software, normalmente, é disparada a lógica de negócio que 
está em outra camada, ou simplesmente uma consulta ou chamada de alguma tarefa técnica do BD da 
aplicação, ou seja, o início de uma transação, a execução e o seu respectivo fim. É responsabilidade da 
aplicação buscar qualquer dado que a camada de domínio necessite para iniciar a operação. 
DOMÍNIO: A camada de domínio é a camada em que o DDD foca suas principais práticas e padrões. 
Normalmente, a camada de domínio é considerada o núcleo, abrangendo as regras de negócio do software. 
É aqui que estão todas as regras discutidas nas conversas entre o cliente que usará o software e a equipe 
que o desenvolveu. Nesse ponto, o time de desenvolvimento utiliza um linguajar específico sobre o domínio 
de negócio, usando linguagem ubíqua (linguagem comum, com termos bem-definidos, que fazem parte do 
domínio do negócio e que são usados por todas as pessoas que fazem parte do processo de 
desenvolvimento do software). É essa camada que dá valor à aplicação; ela interage com todas as camadas 
da aplicação, recebe chamadas da camada de aplicação, devolve valores para a camada de interface com o 
usuário (que podem também passar pela camada de aplicação) e dispara requisições para a camada de 
infraestrutura. 
INFRAESTRUTURA: Abrange tudo o que está relacionado aos eventos técnicos do software, como banco de 
dados, bibliotecas, frameworks, persistência de dados, conexões com bancos de dados, envio de mensagens 
por redes, gravação e leitura de discos, etc. Esses detalhes técnicos estão contidos na camada de 
infraestrutura e são separados dos interesses do usuário final. Serve basicamente como uma camada 
isolante, para separar o resto da aplicação desses detalhes. 
Depois de dividir o sistema em blocos, é possível focar na camada de domínio. Essa prática é importante 
porque tratar do domínio já é, por si só, uma tarefa complexa; isolar o domínio possibilita que não seja 
necessário tratar de outras questões, como questões técnicas ou de camada visual, durante o uso do DDD. 
● Além da Reusabilidade de códigos de cada módulo ou componente desenvolvido, a divisão da 
arquitetura do software em camadas facilita o processo de Manutenção do software → A tarefa de 
encontrar um bug sobre a lógica de negócio, quando o domínio do software está isolado em uma 
camada única, é mais simples. Desse modo, podemos observar que uma camada está 
completamente dissociada da outra, limitando a comunicação, que só se torna possível por meio de 
classes abstratas e interfaces. A camada inferior nunca dispara operações na camada superior. 
INCORPORANDO O DDD NO DESENVOLVIMENTO DE SOFTWARE 
Para que um software atenda completamente aos requisitos de domínio, é estritamente necessário que os 
stakeholders, ou seja, todos os interessados no desenvolvimento do software, utilizem uma linguagem única, 
de modo que todos possam entender as características intrínsecas daquele domínio. Essa linguagem é 
conhecida como linguagem ubíqua e consiste em um linguajar comum, com termos bem definidos, que 
fazem parte do domínio do negócio e que são usados por todas as pessoasque fazem parte do processo de 
desenvolvimento de software. 
● EX: durante uma conversa com o cliente sobre o domínio das ações de um caixa de pagamento da 
loja, podem ser utilizados os seguintes termos: “Temos que emitir a fatura para o cliente antes da data 
limite”. Muito provavelmente, teremos uma classe para a entidade “Cliente”, outra classe para a 
entidade “Fatura”, além de um serviço que possibilite o uso de um método “emitir”, delimitado por 
algum atributo com o nome de “data-limite”. 
A ideia por trás do DDD é que a expressão do modelo abstrato do software deve ser uma representação 
perfeita do seu domínio e de suas regras de negócio. Tudo o que existe no negócio deve aparecer no modelo, 
e somente aparece no modelo aquilo que está no negócio 
● Em DDD, uma parte das pessoas que modelam o domínio deve necessariamente ser composta por 
pessoas que “colocam a mão no código” (os chamados hands-on modelers). 
● O processo de amadurecimento de um software desenvolvido com os conceitos do DDD deve ser 
constante. O modelo guiará o desenvolvimento do código, e, ao mesmo tempo, o código ajudará a 
refinar o modelo de domínio e suas regras de negócio. O contato no dia a dia com o código trará uma 
visão apurada aos desenvolvedores a respeito do domínio; diante dessa visão privilegiada, os 
desenvolvedores podem e devem, constantemente, alterar (refatorar) o código, buscando melhorias. 
● REFATORAÇÃO → É o processo de alteração de um sistema de software, de modo que o 
comportamento externo do código não mude, mas que sua estrutura interna seja melhorada. O 
aperfeiçoamento do código minimiza as chances de falhas e torna o código mais fácil de entender e 
modificar. Quando o código apresenta erros ou está muito confuso de se entender, é um sinal de que 
ele precisa ser refatorado. Depois da refatoração, é necessário realizar testes no código para ver se 
ele continua tendo a mesma função, pois o código não pode mudar seu comportamento externo, ele 
precisa apenas ficar mais fácil de compreender e sem falhas. 
 
AULA 15 - ARQUITETURA DE SOFTWARES EMBUTIDOS 
A vida da sociedade, de maneira geral, vem sendo melhorada graças à revolução provocada pelos sistemas 
embutidos (embarcados), que são bem versáteis e usados em equipamentos médicos, eletrodomésticos, 
aparelhos de comunicação, equipamentos de entretenimento, automóveis etc. 
O PROCESSO DE PROJETO PARA SISTEMAS EMBUTIDOS (TEMPO REAL) pertence à área de 
Engenharia de Sistemas. 
● Os softwares embutidos caracterizam-se pela capacidade de um dispositivo exercer controle em uma 
quantidade extensa de sistemas. 
● A definição desse processo consiste em um procedimento que se refere à área da Engenharia de 
Software, cujos profissionais levam em consideração o detalhamento do projeto e o comportamento 
do hardware. Uma das etapas desse processo é responsável por definir quais recursos de sistema 
serão disponibilizados tanto no software quanto no hardware. 
● É importante frisar que o consumo de energia e os custos de hardware são mais críticos nos 
sistemas de tempo real embutidos em produtos de consumo. 
● Outro aspecto desses sistemas é a necessidade de utilização de processadores específicos, 
criados para auxiliar sistemas embutidos, além do hardware especial construído para alguns sistemas. 
● Esses sistemas de tempo real se caracterizam por apresentar um processo de projeto de software em 
que é impraticável a verticalização; ou seja, o uso inicial de um modelo abstrato 
desfragmentado, que desencadeia uma série de etapas, não é viável. Deve-se compreender que 
é na fase inicial do processo que o software de suporte, o timing de sistema e as decisões que 
envolvem hardwares de nível mais baixo são levados em consideração. 
● Esses aspectos restringem uma ação mais flexível dos profissionais responsáveis pelo projeto do 
sistema e indicam a inclusão de requisitos de um software adicional. 
○ Verticalização: É uma metodologia empresarial que centraliza a cadeia de produção. A 
empresa verticalizada realiza desde a produção da matéria-prima até a distribuição dos 
produtos. Ou seja, a verticalização do projeto de software consiste na construção de um 
software de acordo com os requisitos específicos de um setor, indústria ou utilizador. Dessa 
forma, eles serão de uso exclusivo para esse setor, indústria ou utilizador. 
Nesse processo, há dois componentes essenciais: os SENSORES e os ATUADORES, normalmente usados 
em aplicações industriais ou fabricações. 
 
 
 
 
 
 
 
 
 
 
 
 
 
SENSOR → É um dispositivo capaz de detectar/captar ações ou ESTÍMULOS externos e responder em 
consequência. Esses componentes têm a capacidade de transformar grandezas físicas ou químicas em 
grandezas elétricas. Há 2 tipos de estímulos: 
● Estímulos Periódicos: Acontecem em espaços de tempo previstos. Ex: Um sensor, o sistema pode 
analisá-lo dentro de um curto intervalo de tempo e dar uma resposta baseada nesse estímulo. 
● Estímulos Aperiódicos: Se caracterizam por serem imprevisíveis e sem padrão. 
Os estímulos provêm de sensores no ambiente do sistema de softwares, e as respostas são enviadas aos 
atuadores. Sendo assim, a abordagem geral de projeto de software embutido de tempo real é baseada 
em um modelo de ESTÍMULO-RESPOSTA. 
ATUADOR → É um componente eletrônico que converte a energia em movimento. Pode ser utilizado para 
aplicar uma força. Tal componente controla equipamentos/dispositivos, como uma bomba, por exemplo, e, em 
seguida, faz alterações no ambiente do sistema. Os atuadores também podem gerar estímulos, e estes 
geralmente indicam que ocorreu algum problema, que será sanado pelo sistema. 
CAPACIDADE DE RESPOSTA FULL-TIME → Quase tudo ocorre em tempo real. É a principal diferença 
entre os Sistemas Embutidos e os outros sistemas. 
● Analisando-se, por exemplo, os sistemas mais tradicionais, é possível verificar que a principal função 
deles está relacionada ao processamento de dados. São sistemas que não respondem em tempo real, 
e sua correção é estabelecida por meio da especificação das entradas de sistema que monitoram as 
saídas relacionadas. Quando se analisa um sistema de tempo real, observa-se que a correção está 
ligada à resposta para uma determinada entrada e ao tempo suficiente para criar essa resposta. Note 
que, se um sistema demorar muito para dar uma resposta, isso pode levar a uma ineficácia na 
resposta obtida. Imagine, por exemplo, um software embutido com um desempenho lento, que tenha a 
função de controlar um veículo que apresenta um sistema de frenagem. A consequência disso será 
um provável acidente, já que é praticamente impossível deter um carro de imediato. 
Outras características também diferenciam os Sistemas Embutidos dos demais: 
NÃO OPERAM DE MANEIRA CONTÍNUA → Os Sistemas Embutidos são iniciados quando o hardware é 
acionado e devem estar ativos até o seu desligamento. Nesse contexto, os métodos da área de engenharia 
de software tendem a ser empregados para assegurar essa continuidade. É possível acrescentar técnicas de 
atualização que toleram uma reconfiguração mais dinâmica, para que, enquanto estiver no serviço, o sistema 
passe por constantes atualizações. 
IMPREVISIBILIDADE → Nos sistemas embutidos, que oferecem respostas em tempo real, é preciso verificar 
a sua capacidade de tratar de eventos não programados, que podem ocorrer a qualquer instante. Nesse 
cenário, são criados projetos que têm a concorrência como referência — ou seja, diversos processos serão 
realizados simultaneamente. 
Responder aos estímulos que acontecem em momentos distintos é uma das funções do sistema de tempo 
real. Assim, é preciso que você crie uma arquitetura sistêmica capaz de transferir o controle para o 
tratador correto, à medida que os estímulos sejam recebidos. Logo, esse tipo de procedimento não é 
viável em programas denominados sequenciais. 
● Ou seja, quando um estímulo é recebido, é necessário que ele seja direcionado para o atuador 
correto, o que não ocorre em programas sequenciais, poiseles enviam os estímulos passando em 
sequência pelos atuadores, em vez de mandá-los diretamente para o atuador responsável por tratar 
tal estímulo. 
PADRÕES DE ARQUITETURA DE TEMPO REAL 
Esses padrões estabelecem como as arquiteturas de sistemas são organizadas e qual é a sua forma de 
utilização, abordando os seus benefícios e desvantagens. Entretanto, um padrão de arquitetura não pode ser 
analisado como um projeto generalista. Ou seja, o padrão deve ser aplicado para compreender o 
funcionamento de uma arquitetura de maneira geral e possibilitar que você crie o seu próprio projeto 
de arquitetura de maneira específica. Há 3 padrões de arquitetura de tempo real que são muito utilizados: 
● Observar e reagir — Consiste em um padrão utilizado quando uma série de sensores é exposta e 
monitorada habitualmente/esporadicamente. Os sensores são responsáveis por realizar sinais quando 
ocorrer algum evento, para que o sistema responda e esse evento seja tratado. 
● Controle de ambiente — Ocorre quando um sistema acrescenta sensores capazes de disponibilizar 
informações referentes ao ambiente, assim como atuadores habilitados para promover mudanças 
nesse ambiente. É perceptível a emissão de sinais de controle direcionados para os atuadores de 
sistema como uma forma de responder às alterações ambientais verificadas pelo sensor. 
● Pipeline de processo — Configura-se como um padrão aplicado à medida que os dados são 
transformados, passando de uma representação para outra, antes do efetivo processamento. Essa 
mudança é imposta como um conjunto de fases de processamento executadas simultaneamente, 
possibilitando que a manipulação de dados ocorra de maneira acelerada. 
Os padrões descritos podem estar dispostos de maneira combinada; ou seja, é possível observar mais de um 
padrão inserido em um mesmo sistema. 
ANÁLISE DE TIMING: É um recurso utilizado por projetistas de sistemas que se baseia no tempo orientado 
pelos deadlines para criar respostas aos estímulos e estabelecer processamentos. Seu objetivo é definir a 
quantidade de vezes por segundo (ou seja, com que frequência) que cada processo deve ser realizado no 
sistema para assegurar o processamento de todas as entradas e a produção de todas as respostas do 
sistema no tempo de execução estimado correto, além de verificar qual o tempo do processo realizado de 
maneira insatisfatória (Pior tempo de execução, ou seja, fora desse tempo de execução estimado). 
● A análise de timing direcionada para sistemas de tempo real é complexa, na medida em que os 
sistemas lidam com a combinação de estímulos periódicos, aperiódicos e respostas. Para lidar com a 
imprevisibilidade dos estímulos aperiódicos, é preciso realizar pressuposições referentes às 
possibilidades de eles acontecerem e solicitarem serviços a qualquer instante. Existe a possibilidade 
de que esses pressupostos estejam errados, devido ao comportamento inadequado do sistema após a 
entrega. 
Um sistema operacional considerado convencional (como Windows, Linux etc) ocupa espaço e atrasa a 
execução dos programas, devido à sua ampla funcionalidade. 
● É por isso que os aplicativos embutidos são desenvolvidos por meio de um sistema operacional 
que opera em tempo real (RTOS, do inglês real time operating system), que consiste em um 
sistema que disponibiliza os recursos necessários para os sistemas que atuam em full-time. 
Entretanto, os sistemas embutidos considerados mais simples em relação ao seu desenvolvimento 
podem ser aplicados sem um sistema operacional padrão, já que o próprio software apresenta os 
procedimentos de inicialização e desligamento do sistema, além da gestão e programação dos 
processos. 
 
AULA 16 - PRINCÍPIOS DE PROJETO E MODELAGEM SOLID 
Os princípios SOLID propõem boas práticas de programação orientada a objetos, a fim de garantir um 
projeto robusto, que permita reaproveitamento do código e torná-lo mais adaptável, fácil manutenção, 
aumento da testabilidade do código, evolução do projeto e principalmente a QUALIDADE DO 
CÓDIGO-FONTE DO PROJETO. 
SOLID é um acrônimo que representa cinco princípios a serem aplicados à POO, com o objetivo de diminuir 
o acoplamento entre classes, separar a responsabilidade de cada classe e torná-las coesas, visando a 
uma gestão de dependências. 
● Acoplamento: o grau em que uma classe conhece as outras e depende de outras. Se o 
conhecimento da classe A sobre a classe B se der por meio de sua interface, temos um baixo 
acoplamento, o que é favorável ao código. Porém, se a classe A depende de membros da classe B 
que não fazem parte da interface de B, o acoplamento é alto, o que não favorece a aplicação. 
● Coesão: quando há uma classe elaborada de forma que tenha um único e bem focado propósito, 
dizemos que ela tem uma alta coesão, o que é favorável à aplicação. Porém, quando há uma classe 
com propósitos que não pertencem apenas a ela, temos uma baixa coesão, o que não favorece a 
aplicação. 
Os 5 princípios são: 
SRP - Single Responsibility Principle (Princípio da Responsabilidade Única) 
● Define que uma classe deve ter um, e somente um, motivo para mudar, ou seja, que a classe deve ser 
COESA. Cada responsabilidade, ação ou método deve ser de uma classe apenas. 
● É importante separar responsabilidades em diferentes classes, pois a responsabilidade é um eixo para 
mudanças. Se uma classe tem mais de uma razão para mudar, então, a responsabilidade se torna 
acoplada. Alterações em uma responsabilidade podem prejudicar ou inibir a habilidade da classe em 
lidar com outras responsabilidades. 
● Ou seja, uma classe só pode representar um único objeto. Se ela tiver componentes que representam 
outros objetos, ela não está coesa. Ex: 
 
 
 
 
 
 
 
 
 
 
 
antes de aplicar SRP após aplicar o SRP 
● A classe DebitoContaCorrente tem três responsabilidades: 
○ validarSaldo(); emitirComprovante(). 
○ debitarConta(); 
● Isso significa que uma classe é responsável pelas três ações: valida o saldo em conta, debita um valor 
da conta e, por fim, emite o comprovante. Supondo que, por algum motivo, a regra de negócio da 
emissão de comprovante mude, logo, será necessária uma mudança no código da classe 
“DebitoContaCorrente”. Se no momento do refatoramento do código houver um bug, não será apenas 
a função de emissão de comprovantes que será afetada: as outras duas funções também serão 
afetadas, deixando o sistema sem três responsabilidades importantes. O sistema deixaria de fazer o 
débito e a validação de saldo, devido a um problema com o comprovante. Esse problema poderia ser 
facilmente resolvido se o princípio SRP fosse aplicado desde o início do projeto. 
OBS: Se uma classe apresenta mais de uma responsabilidade, ela não está seguindo o SRP, ou seja, ela não 
está coesa, além de dificultar a manutenção e o reuso do código. Tudo isso impede a evolução do projeto. 
 
OCP - Open/Closed Principle (Princípio do Aberto/Fechado) 
● Possibilita estender um comportamento de uma classe sem a necessidade de modificá-lo; 
● Define que as entidades, classes e funções devem ser abertas para extensão, mas fechadas para 
modificação (ou seja, elas não devem ser modificadas - ter seu código alterado - o tempo todo). 
● De certa forma, deve-se permitir acrescentar funções e comportamentos de uma classe, sem alterar 
seu código base. Isso é possível por meio de herança, interface e composição. 
● Ex: A figura abaixo apresenta uma estrutura de dados definindo o tipo de débito para preencher a 
classe “Debito”. 
 
 
Ao analisar a classe “Debito”, podemos perceber que, 
caso surja outro tipo de conta, a classe “Debito” deverá 
ser modificada, adicionando mais estruturas 
condicionais para validar o recebimento dos dados. 
Esse tipo de modificação poderia trazer riscos ao 
projeto, como os tipos de débitos pararem de funcionar 
corretamente. 
 
 
 
 
 
Esse problema poderia ser facilmente resolvido se o 
princípio OCP fosse aplicado desde o início do 
projeto, como mostra o exemplo a seguir: 
 
A figuraao lado apresenta uma abstração, em que a 
classe “Debito” representa a classe Pai, possuindo o 
método — a ação principal — e as classes filhas: 
● DebitoContaCorrente 
● DebitoContaPoupanca 
● DebitoContaInvestimento 
 
Ao analisar a classe “Debito”, podemos perceber que a 
mesma é abstrata, o que significa que não será 
instanciada, mas servirá de modelo para suas classes 
filhas. As classes filhas sobrescrevem os métodos para 
realizarem a sua implementação; elas são conhecidas 
também por classes concretas. Percebe-se que 
qualquer modificação, como uma conta nova, não 
influenciará no funcionamento dos demais tipos de 
conta, pois são classes separadas e concretas. O tipo 
de débito em conta de investimento foi implementado 
sem necessidade de mudanças, usando apenas a 
extensão. Ou seja, o princípio OCP deixou o código 
mais limpo, de fácil manutenção e de acordo com o 
primeiro princípio SOLID, o princípio de 
responsabilidade única. 
 
 
 
LSP - Liskov Substitution Principle (Princípio da Substituição de Liskov) 
● As classes derivadas devem ser substituíveis por suas classes bases. Isso significa que as classes 
filhas (derivadas) podem ser substituídas pela classe pai (superclasse), e a superclasse também pode 
ser substituída por qualquer subclasse. 
● Define que as subclasses devem apresentar o mesmo comportamento que sua superclasse. (Elas 
herdam os métodos das superclasses e os sobrescrevem/sobrepõem, sem alterar a funcionalidade de 
que o cliente precisa). 
● Ex: A figura abaixo apresenta uma abstração, em que a classe “Retangulo” representa a superclasse, 
possuindo dois atributos — base e altura — e um método, e a subclasse “Quadrado” herda base e 
largura. 
 
Ao se analisar a classe “Retangulo”, percebe-se que há 
dois atributos: base e altura. Porém, um quadrado não é 
um retângulo. Ao se fortalecer essa herança, o que vai 
acontecer com a base e a altura? Isso pode gerar 
problemas no resultado final: O quadrado só precisa do 
valor do lado para poder calcular sua área (a=L*L), mas 
como ele herda os atributos de base e altura, isso pode 
gerar confusão em quem vai inserir esses valores, 
podendo até inserir valores diferentes - o que não condiz 
com um quadrado, que deve ter todos os lados iguais. 
Esse problema poderia ser resolvido se o princípio LSP 
fosse aplicado desde o início do projeto. 
 
 
 
Aqui, com o LSP aplicado, apresenta uma abstração, em 
que a classe “FormaGeometrica” representa a superclasse, 
possuindo apenas um método abstrato, e as duas 
subclasses, “Retangulo” e “Quadrado”, sobrescrevem o 
método “calcularArea”. 
 
 
A solução para a herança apresentada no exemplo ao lado 
foi a criação da classe abstrata; o método abstrato foi 
sobrescrito pelas classes “Retangulo” e “Quadrado”, e, 
assim, não foram mantidos métodos novos nas subclasses. 
 
 
 
 
 
 
 
 
 
ISP - Interface Segregation Principle (Princípio da Segregação de Interfaces) 
● Muitas interfaces específicas são melhores do que uma interface única geral; 
● Preocupa-se com a coesão de interfaces visando a poucos comportamentos a fim de manter e evoluir 
o projeto sem dificuldades. 
● Ex: A imagem a seguir apresenta uma abstração, em que a classe Funcionario representa a 
superclasse, possuindo três atributos e três métodos, sendo dois deles abstratos; três subclasses 
herdam os atributos e sobrescrevem os métodos: Vendedor, Representante e AtendenteCaixa. 
No exemplo a seguir, a classe “Representante” herda o método “getSalario()”, mas não o implementa, pois 
um representante não ganha salário, apenas comissão, fazendo com que esse método fique inútil nessa 
classe. O mesmo acontece com a classe “AtendenteCaixa” e o método “getComissao()”. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Nesse exemplo (em cima e ao lado), a herança não 
está sendo usada da forma mais correta, sendo que 
há subclasses que não são realmente especializações 
da superclasse, e existem classes que não necessitam sobrescrever os métodos de todo o funcionário. 
● Na figura abaixo, o princípio ISP é aplicado com uso de interface e herança, em que existem duas 
interfaces, “Assalariado” e “Comissionario”, e uma superclasse abstrata “Funcionario” 
 
A classe “Vendedor” estende “Funcionário” e faz 
uso da interface “Comissionario”; 
A classe “Representante” estende “Funcionario” e 
faz uso da interface “Assalariado”; 
A classe “AtendenteCaixa” estende “Funcionario”. 
Assim, cada um só implementa ou expande aquilo 
que vai usar, sem ocorrer como antes de uma 
classe herdar métodos que não vai usar. 
 
 
DIP - Dependency Inversion Principle (Princípio da Inversão de Dependência) 
● Depende de abstrações e não de implementações; 
● Módulos de alto nível não devem depender de implementações concretas de módulos de baixo nível. 
● Ex: suponha duas classes, “Botao” e “Lampada”, ambas concretas, conforme mostra a figura abaixo. 
A classe “Lampada” tem métodos para ligar e desligar, e a classe “Botao” apresenta uma lógica para 
acionar os botões. 
 
 
 
 
 
 
 
 
Ao analisar o exemplo ao lado, percebe-se que a estrutura criada viola o 
princípio de inversão de dependência, já que a classe concreta “Botao” 
depende de uma classe concreta “Lampada”. O correto, segundo o DIP, 
seria o uso da abstração. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Veja ao lado um exemplo correto, de acordo com o DIP. A 
Figura apresenta uma abstração, em que a classe 
“Dispositivo” representa a Interface, possuindo dois métodos, 
além da classe “Lampada”, a qual implementa “Dispositivo” e 
sobrescreve os métodos, e da classe “Botão”, que utiliza a 
abstração para controlar “Dispositivo” e cria a lógica para 
ligar e desligar.Não há flexibilidade em linguagens de programação. Aquela que for 
escolhida no início do projeto terá que ser seguida, sempre. Se o desenvolvimento de uma nova 
funcionalidade exigir outra linguagem de programação, um sistema novo deverá ser criado somente 
para esta funcionalidade e posteriormente ser integrado ao sistema atual. 
 
ARQUITETURA DE MICROSSERVIÇOS → Este modelo é desenvolvido através de um sistema que consiste, 
basicamente, em construir pequenos SERVIÇOS INDEPENDENTES que são criados para recursos 
específicos, em que cada um realiza uma única função independente. 
● A arquitetura de Microsserviços é uma COLEÇÃO DE SERVIÇOS OU SISTEMAS DISTRIBUÍDOS. 
Ou seja, separa-se as partes em domínios independentes. 
A ideia da arquitetura de microsserviços é separar estes domínios de forma que se tornem únicos dentro do 
contexto do sistema final e, subsequente sejam integrados à medida que a aplicação necessite da sua 
funcionalidade, com isso, um sistema utilizando a arquitetura de microsserviços, são vários pequenos 
sistemas especializados interligados, cada um com seu próprio BD. 
 
EXEMPLO: 
● Imagine novamente o aplicativo do seu banco, com as mesmas funcionalidades citadas acima, porém 
desenvolvido através de uma arquitetura de microsserviços. Nesta situação, as transferências, 
pagamentos, investimentos e outras funcionalidades seriam estruturadas independentes, 
desenvolvidas para cumprir exclusivamente suas finalidades específicas, com seu próprio banco de 
dados. 
● Caso seja necessário realizar a manutenção de uma dessas operações, utilizando um controle de 
inversão e monitoramento adequado, as outras funcionalidades do aplicativo continuarão disponíveis 
para uso normalmente. 
VANTAGENS: 
● Altamente testável: Por conter apenas regras negócio específicas do microsserviços realizar testes é 
mais fácil e objetivo; 
● Agilidade: Como são implementados de forma independente é mais fácil gerenciar a correção de 
problemas, lançamentos, manutenção ou desenvolvimento de um outro recurso; 
● Simplicidade e Objetividade: Os serviços são pequenos e limitam-se a resolver um determinado 
problema dentro de um sistema maior, dessa forma, seu código é simples e objetivo; 
● Escalonamento por demanda: É possível escalonar somente os pontos dentro de um sistema em 
que há maior demanda por consumo de recursos. 
● Foco no negócio: É possível dividir cada serviço em equipes, focadas em trabalhar nas demandas de 
negócio para seu respectivo serviço. 
● Linguagem de programação: É possível criar cada micro serviço em uma linguagem de 
programação diferente. 
DESVANTAGENS 
● Estruturação complexa: dado seu conceito distribuído, a estruturação do projeto é mais complexa 
que na monolítica, demandando integrações mesmo para funcionalidades simples; 
● Definição da abrangência do microsserviço: a divisão dos serviços deve ser feita com muita 
atenção e cuidado, “nunca se chegará à divisão perfeita, pois, neste modelo, o alinhamento ao 
negócio é que dita as possibilidades de divisões ou re-divisões”; 
● Múltiplos profissionais: diferentemente do sistema monolítico, em uma arquitetura de 
microsserviços, será difícil utilizar somente um profissional, no geral, é necessário uma equipe que 
contemple os conhecimentos de front-end, back-end, DevOps e negócio, e em alguns casos, 
empresas maiores, há necessidade do conhecimento de compliance e segurança. 
● Vários recursos tecnológicos: dada sua estruturação complexa, diversas ferramentas são 
necessárias para publicar e executar um sistema em microsserviço. 
 
AULA 2 - DESCRIÇÃO DE ARQUITETURA DE SISTEMAS 
 
O DESENVOLVIMENTO DE SISTEMAS é uma atividade essencial no mundo tecnológico atual, permitindo a 
criação de softwares e aplicativos que atendam às necessidades específicas das pessoas e das 
empresas. 
● Esse processo se inicia com uma fase crucial de alinhamento entre a equipe de desenvolvimento e 
os representantes dos usuários ou stakeholders, responsáveis por descrever suas necessidades e 
expectativas em relação ao software a ser criado. 
A ARQUITETURA DE UM SISTEMA desempenha um papel fundamental no desenvolvimento de qualquer 
aplicação ou software. 
● É a base estrutural que define como os componentes do sistema interagem e se relacionam entre si, 
garantindo a integridade, a eficiência e a escalabilidade do projeto. 
● Nesse contexto, a DESCRIÇÃO adequada da arquitetura torna-se crucial para o sucesso do 
desenvolvimento, pois orienta a equipe em relação às decisões técnicas e funcionais a serem 
tomadas ao longo do projeto. 
● Um exemplo dessa DESCRIÇÃO é o DIAGRAMA DE CONTEXTO ARQUITETURAL. 
 
DIAGRAMAS DE CONTEXTO ARQUITETURAL → É utilizado para mapear e modelar a maneira como o 
software vai interagir com entidades externas. Nesse contexto, o sistema que está sendo desenvolvido é 
representado como o centro do processo e são chamados de SISTEMA-ALVO, e são expressas no diagrama 
as relações com os sistemas apresentados a seguir. 
● SISTEMAS SUPERIORES: Consistem em sistemas que usam o sistema-alvo. 
● SISTEMAS SUBORDINADOS: Sistemas que são utilizados pelo sistema-alvo. 
● SISTEMAS DE MESMO NÍVEL (PARES): Consistem em sistemas que compartilham informação com 
o sistema-alvo. 
● ATORES: Consistem em entidades externas, pessoas ou dispositivos que utilizam/interagem com o 
sistema-alvo, produzindo ou consumindo informações. 
 
 
 
 
Representa o fluxo de informação para dentro 
e para fora do sistema, a interface do usuário 
e o apoio de processamento relevante. Cada 
uma das entidades se comunica com o 
sistema-alvo por meio de uma interface. 
 
 
 
 
 
 
 
 
 
Os pequenos retângulos sombreados no 
diagrama consistem nas interfaces pelas 
quais cada entidade externa se comunica 
com o sistema-alvo. É por meio delas que os 
dados devem fluir tanto para dentro quanto 
para fora do sistema-alvo. Faz parte do 
projeto de arquitetura especificar os detalhes 
de cada interface. 
 
 
Os ARQUÉTIPOS, por sua vez, oferecem modelos ou padrões que descrevem soluções arquiteturais 
testadas e comprovadas para problemas recorrentes. 
● Eles fornecem diretrizes valiosas para o projeto arquitetural, ajudando a criar sistemas mais eficientes, 
escaláveis e de fácil manutenção. 
 
COMPONENTES E INSTÂNCIAS DA ARQUITETURA 
COMPONENTES → Define um comportamento do sistema. 
● À medida que a Arquitetura de Software é refinada em componentes, a estrutura do sistema começa a 
ficar mais clara. 
INSTÂNCIA → Representação real desse comportamento 
● As instâncias são representações reais, utilizadas em um problema específico para demonstrar que a 
estrutura e os componentes definidos estão apropriados. Elas são desenvolvidas para “provar” o 
funcionamento de um componente em um contexto real de utilização. 
 
ADL (LINGUAGEM DE DESCRIÇÃO DE ARQUITETURA) → São ferramentas essenciais para a descrição 
e representação de arquiteturas de sistemas de software. 
● Elas fornecem uma notação padronizada e uma sintaxe específica para expressar os elementos e 
relacionamentos arquiteturais, facilitando a compreensão e a comunicação entre os membros da 
equipe de desenvolvimento. 
● As ADLs possuem elementos básicos, que são os componentes e os conectores. É neles que são 
incluídas as regras e diretrizes para a criação de arquiteturas bem-formadas. 
● No contexto das ADL, existe uma variedade de linguagens disponíveis, cada uma com seus objetivos 
e conteúdo específico que permitem criar. Essas linguagens podem ser agrupadas em uma taxonomia 
com base nesses critérios, facilitando a seleção adequada para cada caso de uso. 
 
AULA 3 - PROJETO DOS COMPONENTES DA ARQUITETURA DE SISTEMAS 
 
COMPONENTES → É um bloco construtivo modular para software de computador, é uma unidade de 
software independente, que encapsula, dentro de si, seu projeto e sua implementação e oferece serviços 
para o meio externo, por meio de INTERFACES bem definidas. 
● Componentes de Software é o termo utilizado para descrever o elemento desoftware que 
encapsula uma série de funcionalidades. 
● Um componente é uma unidade independente, que pode ser utilizado com outros componentes para 
formar um sistema mais complexo. 
Dá para considerar que um componente é como um PROVEDOR DE SERVIÇOS INDEPENDENTE: 
● Quando um sistema necessita de algum serviço, ele chama um componente para fornecer esse 
serviço, sem se preocupar com o local em que esse componente está sendo executado ou a 
linguagem de programação usada para desenvolver o componente. 
● Os serviços oferecidos por um componente são disponibilizados por meio de uma interface, e 
todas as interações ocorrem por essa interface. 
BENEFÍCIOS DOS COMPONENTES DE SOFTWARE: 
● REUTILIZAÇÃO DE CÓDIGO: Significa que um componente pode ser utilizado em diferentes 
projetos, economizando tempo e esforço na programação. 
○ A maioria dos componentes reusados não é desenvolvida especialmente, mas se baseia em 
componentes existentes já implementados e usados em sistemas. Na maioria das vezes, os 
componentes desenvolvidos não são imediatamente reutilizáveis. Eles incluem características 
e interfaces específicas de uma aplicação improváveis de serem necessárias em outras 
aplicações. Assim, é necessário adaptar, ampliar esses componentes e criar uma versão mais 
genérica e, portanto, mais reusável. 
● MANUTENÇÃO: Facilitam a manutenção do sistema, pois as atualizações e correções podem ser 
aplicadas apenas no componente afetado, sem a necessidade de modificar todo o sistema. 
● MODULARIDADE: Os componentes podem ser desenvolvidos e testados de forma independente, o 
que facilita a identificação e correção de erros. Além disso, a modularidade permite que diferentes 
equipes de desenvolvimento trabalhem em paralelo, acelerando o processo de desenvolvimento de 
software. 
 
CARACTERÍSTICAS DE UM COMPONENTE DE SOFTWARE: 
● PADRONIZADO → Um componente precisa estar de acordo com algum modelo padronizado. 
● INDEPENDENTE; 
● PASSÍVEL DE COMPOSIÇÃO → Todas as interações externas devem ocorrer por meio de interfaces 
publicamente definidas. Além disso, o componente deve fornecer acesso externo às informações 
sobre si próprio, como seus métodos e atributos. 
● IMPLANTÁVEL → Um componente deve ser autocontido e deve ser capaz de operar como uma 
entidade independente sobre uma plataforma de componente que implementa o modelo de 
componente; 
● DOCUMENTADO. 
 
Os componentes são definidos por suas interfaces e podem ser imaginados como se tivessem duas 
interfaces relacionadas: 
 
 
 
 
 
 
 
 
 
Interface REQUIRES → Especifica 
quais serviços devem ser fornecidos por 
outros componentes no sistema. Se 
esses componentes não estiverem 
disponíveis, o componente não 
funcionará. 
Interface PROVIDES → Define os 
serviços fornecidos pelo componente. 
Trata-se da interface de programação 
de aplicações (API, do inglês application 
programming interface), que define os 
métodos que podem ser chamados pelo 
usuário do componente. 
 
MODELO DE COMPONENTE → É a DEFINIÇÃO DE PADRÕES para implementação, documentação e 
implantação de componentes. Esses padrões servem para os desenvolvedores se assegurarem de que os 
componentes podem operar entre si. Eles se destinam também aos fornecedores de infraestrutura de 
execução de componentes, que fornecem middleware para apoiar a operação de componentes. 
● MIDDLEWARE → É um software que diferentes aplicações usam para se comunicar umas com as 
outras. Ele atua como uma ponte entre diversas tecnologias, ferramentas e bancos de dados para 
integrá-los perfeitamente em uma única rede ou único sistema complexo. É uma camada que fica 
entre a aplicação e o sistema operacional, fornecendo uma abstração da programação. Ele 
mascara as divergências entre redes, hardware, sistemas operacionais que rodam nos computadores 
e linguagens de programação, permitindo que diferentes aplicações possam se comunicar 
ultrapassando os desafios de suas divergências. 
PROJETO DE COMPONENTES → Um conjunto completo de componentes de software é definido durante o 
projeto de arquitetura. Depois, o PROJETO DE COMPONENTES é uma etapa essencial no processo de 
desenvolvimento de software que define as estruturas de dados, os algoritmos, as características das 
interfaces e os mecanismos de comunicação alocados em cada componente do software. 
● O PDC representa o software para garantir a revisão dos detalhes do projeto no que diz respeito à 
correção e à consistência com outras representações do projeto (como os projetos de interfaces, a 
arquitetura e os dados, que são as bases do PDC). Ele AVALIA A EFICIÊNCIA DAS ESTRUTURAS 
DE DADOS, DAS INTERFACES E DOS ALGORITMOS para deixá-las alinhadas. 
● O processo para o PDC abrange atividades que reduzem lentamente a abstração com o qual um 
software é representado. Em suma, o PDC REPRESENTA O SOFTWARE EM UM NÍVEL DE 
ABSTRAÇÃO PRÓXIMO AO CÓDIGO. 
O intuito é transformar informações de modelos de arquitetura e requisitos em uma representação de projeto 
que nos dê detalhes suficientes para orientar a atividade da construção, ou seja, a codificação e os testes. 
 
COMPONENTIZAÇÃO → Tem como ideia central projetar componentes que possam ser facilmente 
integrados em diferentes sistemas, proporcionando agilidade no processo de desenvolvimento e permitindo a 
criação de soluções mais flexíveis e escaláveis. (Reutilização de componentes) 
 
Unidades de softwares reutilizadas: 
● Reúso do sistema da aplicação: todo o sistema pode ser reusado por incorporação a outros 
sistemas sem mudanças, pela configuração da aplicação para diferentes clientes ou pelo 
desenvolvimento de um conjunto de aplicações com uma arquitetura comum, mas adaptada a clientes 
específicos. 
● Reúso de componentes: componentes de uma aplicação que variam desde subsistemas a simples 
objetos podem ser reusados. 
● Reúso de objetos e funções: componentes de software que implementam uma única função, como 
uma função matemática ou uma classe de objeto, podem ser reusados. 
 
AULA 4 - PROJETO DE INTERFACE DA ARQUITETURA DE SISTEMAS 
Uma INTERFACE → É a chave para garantir a usabilidade de tais dispositivos, é o elo de comunicação 
entre humanos e máquinas, permitindo-lhes interagir de forma eficaz e intuitiva. No desenvolvimento de 
uma interface, diversos aspectos precisam ser analisados cuidadosamente, como as tarefas que serão 
realizadas por meio dela, os usuários que a utilizarão e o ambiente no qual estará inserida, entre outras 
variáveis relevantes. 
A INTERAÇÃO é a comunicação entre o ser humano e a máquina e a INTERFACE é o meio que permite 
essa comunicação. 
Usabilidade: Eficiência e a facilidade de se empregar as funcionalidades desses mecanismos a fim de 
resolver problemas cotidianos 
● Um programa com boa usabilidade é aquele que oferece uma interface intuitiva, possibilitando a 
execução de tarefas de forma eficiente e sem frustrações pela falta de compreensão sobre como 
proceder. 
 
Padrões que se aplicam ao design de interfaces na área de Engenharia de Software: 
AFFORDANCES → Representam PADRÕES CONHECIDOS que facilitam a usabilidade. 
● Elas estão presentes em diversos objetos e elementos que usamos no dia a dia, como botões, ícones 
e menus, e são aplicadas de forma similar no design de interfaces. 
● O conhecimento dos conceitos de affordance é essencial para o desenvolvimento de interfaces 
intuitivas; 
● Padrões conhecidos e coerentes facilitam interações e reduzem dificuldades. 
TIPOS DE AFFORDANCES: 
● EXPLÍCITA: Representada por elementos com linguagem verbal, como textos ou mensagens que 
indicam claramente ações possíveis, como “Clique aqui” para um link. 
● CONVENCIONAL: Utilizando elementos familiares, como palavras sublinhadas em azul, que sugerem 
links para outras páginas com mais informações. 
● METAFÓRICA: Emprega objetos ou elementos reais como referência, a exemplo do ícone de lixeira 
para indicar a ação de deletar. 
● OCULTA: Disfarçada inicialmente, revela-se quando determinada condição é atendida, comoopções 
de zoom que aparecem apenas quando o cursor passa sobre uma imagem. 
 
O MODELO DE USUÁRIO, em suma, estabelece o perfil dos usuários finais do sistema, realizando um 
levantamento de suas características (por exemplo, idade, gênero, níveis de educação, dentre outros). Em 
sua maioria, os profissionais da equipe de projeto estão empenhados em satisfazer os usuários, e esse 
modelo ajuda na percepção de quem verdadeiramente são esses usuários. 
● Temos que identificar os usuários, visto que estes são os clientes do engenheiro e vão efetivamente 
utilizar as ferramentas. Além disso, é preciso identificar as tarefas que esses usuários realizam no 
desempenho de suas funções e, por último, os requisitos do ambiente onde esse usuário 
desempenha suas funções. 
O MODELO MENTAL é uma imagem do 
sistema delineada na mente dos usuários. 
Dependendo do nível de conhecimento do 
usuário, essa imagem pode ser muito 
superficial; usuários com experiências mais 
variadas podem gerar um modelo mental mais 
completo. 
 
O MODELO DE IMPLEMENTAÇÃO 
combina a aparência e a percepção da 
interface com as informações de apoio que 
descrevem a interface. O fato de o modelo 
de implementação e o modelo mental 
possuírem similaridades indica que os 
usuários se sentirão à vontade com o 
software e vão utilizá-lo de maneira eficaz. 
Em suma, esses modelos citados são 
abstrações das funções que o usuário 
exerce, pensa ou deveria estar realizando; 
ou seja, é possível afirmar que, conhecendo o usuário, você terá a percepção das tarefas que este realiza. 
 
O PROCESSO DE ANÁLISE E PROJETO DE 
UMA INTERFACE pode ser representado 
utilizando um modelo em espiral. A escolha do 
modelo em espiral se dá pelo fato de que cada 
validação junto ao usuário pode gerar a 
descoberta da necessidade de elaboração de 
requisitos adicionais, para que a interface 
contemple os modelos mencionados 
anteriormente. A cada interação, esse conjunto 
de processos pode ser repetido, até que a 
interface seja satisfatória. 
 
AULA 5 - PADRÕES DE PROJETO DE ARQUITETURA DE SISTEMAS 
O objetivo do processo de desenvolvimento de software é satisfazer as necessidades dos clientes/usuários 
do sistema. Para tanto, é preciso analisar os requisitos do sistema e projetar e implementar um código 
padronizado para evitar erros e falhas. 
PADRONIZAR consiste em empregar técnicas e padrões que auxiliam no desenvolvimento e aumentam a 
produtividade, a segurança e a qualidade no projeto. Um PADRÃO é um molde, um exemplo, um protótipo, 
um paradigma ou uma referência de algo a seguir. Um PROJETO é um desenho, uma planta, um 
esquema, um plano ou um programa. 
PADRÃO DE PROJETO → Comumente conhecidos como design patterns, são modelos, isto é, referências 
aplicadas ao projeto, trazendo soluções para problemas específicos do desenvolvimento do projeto 
de software orientado a objetos. 
● Por meio dos design patterns, é possível definir nomes, descrever o problema e a solução a ser 
aplicada ao projeto. Eles trazem exemplos de implementações e uma organização geral de 
classes e objetos. 
● Esses Padrões de Projeto são referências aplicadas ao projeto que trazem soluções para problemas 
específicos encontrados durante o processo de desenvolvimento. Pode-se enxergá-los como soluções 
já testadas para determinados problemas, oferecendo uma base sólida para a criação de software. 
Conhecer e dominar os padrões de projeto possibilita o desenvolvimento de soluções cada vez 
melhores e mais eficientes, além de promover a reutilização de soluções já estabelecidas. 
 
BENEFÍCIOS dos Padrões de Projeto: 
Reutilização de soluções e arquiteturas; Reduzem a complexidade do projeto; 
Tornam o software mais flexível; Padronizam a linguagem de programação utilizada; 
Favorecem a manutenção do código ao longo do tempo. 
 
No entanto, diante de mais de vinte padrões disponíveis para escolha, encontrar o padrão de projeto 
adequado ao software pode ser um desafio. 
● É fundamental seguir critérios bem definidos para solucionar os problemas do projeto de forma 
eficiente, como os critérios a seguir: 
Todo Padrão de Projeto possui: 
● Nome: descreve a essência do padrão; é uma referência para poder escrever o problema do projeto. 
● Objetivo: descreve como o padrão atua, em que modelo de software se aplica. 
● Problema/Aplicabilidade: descreve o problema, em que situação se aplica o padrão. 
○ Surgem durante o desenvolvimento do projeto, podendo ser uma dificuldade em desenvolver 
ou apenas um desafio. 
● Contexto: descreve uma situação que complemente o problema e em que o padrão será aplicado. 
○ Determina qual padrão deve ser aplicado para a resolução do problema. 
● Solução: descreve a solução; é uma descrição abstrata de um problema e de como as classes e os 
objetos o resolverão. 
○ Surge com a escolha do padrão (pattern) adequado ao projeto em questão. 
● Consequências: descreve as vantagens e desvantagens da utilização do padrão; são críticas para a 
avaliação de alternativas de projetos e a compreensão de custos e benefícios para aplicação no 
software desenvolvido. 
 
Os PADRÕES GoF, ou Padrões de Projeto GoF, são um conjunto de 23 padrões. Esses padrões são 
soluções reutilizáveis para problemas comuns de design de software orientado a objetos. Eles facilitam a 
reutilização de soluções, reduzem a complexidade do projeto e promovem boas práticas de programação. 
 
TIPOS DE PADRÕES DE PROJETO: Segue abaixo os 3 grupos de Padrões de Projetos GoF existentes que 
são subdivididos em mais padrões, totalizando 23. 
● CREATIONAL PATTERNS (Padrões de criação) → O objetivo desse tipo de padrão é a abstração da 
instância de objetos. É possível criar um objeto sem se preocupar com o todo envolvido na criação 
desse componente. 
○ Esse padrão abstrai ou adia o processo de criação, tornando o sistema independente de como 
os seus objetos são criados. 
● São 5 PADRÕES DE CRIAÇÃO: 
○ Abstract Factory: fornece uma interface para a criação de conjuntos de objetos relacionados 
ou dependentes, sem precisar especificar sua classe. 
○ Builder: separa a construção de um objeto complexo da sua representação. Possibilita que 
seu processo de construção crie diferentes representações. 
○ Factory Method: define a interface para a criação de um objeto, mas são as subclasses que 
decidem qual classe deve ser instanciada. 
○ Prototype: especifica os tipos de objetos a serem criados usando uma instância prototípica e 
criando objetos copiando esse protótipo. 
○ Singleton: garante que a classe tenha somente uma instância e fornece um ponto global de 
acesso a ela. 
● STRUCTURAL PATTERNS (Padrões de estrutura) → O objetivo desse padrão é a organização e a 
estruturação das classes e dos seus relacionamentos com os objetos. 
○ Ao contrário do padrão de criação, o padrão de estrutura é voltado para os objetos, 
descrevendo maneiras de montá-los, isto é, a maneira como as classes e os objetos serão 
compostos para formar estruturas maiores. A flexibilidade obtida pela composição de objetos 
provém da capacidade de mudar a composição em tempo de execução. 
 
● São 7 PADRÕES DE ESTRUTURA: 
○ Adapter: converte a interface de uma classe em outra interface esperada pelo cliente. O 
Adapter permite que as classes trabalhem em conjunto para promover essa mudança. 
○ Bridge: separa uma abstração da sua implementação, permitindo uma variação individual de 
cada uma. 
○ Composite: compõe objetos em estruturas hierárquicas, como árvores. Trata objetos 
individuais e composições de objetos de forma uniforme. 
○ Decorator: atribui de forma dinâmica responsabilidades adicionais a um objeto. 
○ Façade: fornece uma interface unificada para um conjunto de interfaces em subsistema. 
○ Flyweight: suporta grandes quantidades de objetos de forma eficiente, por meio de 
compartilhamento. 
○ Proxy: fornece um objeto representante (surrogate) ou marcador de outro objeto. 
 
● BEHAVIORAL PATTERNS (Padrões de comportamento) → O objetivo é delegar responsabilidades, 
definindocomo os objetos devem se comportar e se comunicar. Esses padrões se concentram nos 
algoritmos. 
● São 11 PADRÕES COMPORTAMENTAIS: 
○ Chain of Responsibility: evita o acoplamento de remetente de uma solicitação ao 
destinatário, dando chance ao objeto para tratar a solicitação. 
○ Command: encapsula uma solicitação como objeto, permitindo parametrizar clientes com 
diferentes solicitações, enfileirando ou registrando os “logs” de solicitações. 
○ Interpreter: define para a linguagem uma representação gramatical dentro do interpretador. 
○ Iterator: possibilita o acesso sequencial dos elementos de uma agregação de objetos, sem a 
necessidade de expor sua representação subjacente. 
○ Mediator: define um objeto que encapsula a forma como um conjunto de objetos interage. 
○ Memento: captura e externaliza um estado interno do objeto sem violar seu encapsulamento, 
possibilitando restaurar para esse estado — por exemplo, um controle de históricos de ações. 
○ Observer: define uma dependência um-para-muitos entre objetos; quando um objeto muda, 
todos os seus dependentes são notificados e atualizados automaticamente. 
○ State: permite que o objeto altere seu comportamento quando o estado interno for modificado. 
○ Strategy: define uma família de algoritmos, encapsulando cada um e os tornando 
intercambiáveis. 
○ Template Method: define o esqueleto de um algoritmo em uma operação, postergando a 
definição de alguns passos para subclasses. 
○ Visitor: representa uma operação a ser executada sobre os elementos da estrutura de um 
objeto. 
 
AULA 6 - REÚSO DE SOFTWARE 
 
O REÚSO DE SOFTWARE → Consiste na prática de utilizar, em novos sistemas ou projetos, componentes 
de software já existentes (previamente desenvolvidos) a fim de economizar tempo, esforço e recursos, além 
de melhorar a qualidade e a eficiência do desenvolvimento. 
● Desenvolver um software do zero é um processo lento e caro, por isso investe-se em reúso. 
VANTAGENS DE REUTILIZAR: 
● Aumenta a qualidade e produtividade no desenvolvimento de software. 
● Menor tempo de desenvolvimento e exige menos esforço; 
● Redução de erros - uma vez que os componentes já foram testados e validados previamente, então 
reutilizá-los tem uma garantia maior de sucesso do que usar componentes novos ainda não testados; 
● Melhora a manutenção do software. 
DESVANTAGENS: 
● Falta de apoio de ferramenta - os ambientes de desenvolvimento podem não estar preparados para 
reutilização dos componentes (falta de estrutura); 
● Dificuldade em encontrar um componente reutilizável; 
● Custo maior — muitos componentes não são livres de licença; 
● Falta de conhecimento ou maturidade da equipe que está trabalhando no projeto novo. 
 
QUAL TIPO DE REÚSO UTILIZAR? 
● A escolha pela técnica mais apropriada vai depender dos requisitos do sistema, da tecnologia 
disponível, dos dispositivos de ativos reusáveis e do conhecimento e da experiência da equipe 
de desenvolvimento do projeto. 
 
TIPOS DE REÚSO DE SOFTWARE: 
● Código-fonte 
● Bibliotecas: São coleções de código que realizam tarefas específicas, como manipulação de dados e 
criptografia. 
○ Muito utilizado em POO, basta importar uma biblioteca que contém o código de uma função 
específica e é possível desfrutar das funcionalidades dessa biblioteca economizando várias 
linhas de código. 
● FRAMEWORKS: É uma abstração(estrutura sem implementação, é apenas uma “carcaça”) que 
une códigos comuns entre vários projetos de software provendo uma funcionalidade/estrutura 
genérica para criar uma aplicação (é um conjunto de códigos genéricos pré-prontos). Um 
framework pode atingir uma funcionalidade específica, por configuração, durante a programação de 
uma aplicação (essa estrutura pode ser implementada de acordo com com os parâmetros que o 
sistema precisar). 
○ É um kit de ferramentas com inúmeras funcionalidades implementadas, testadas e adaptadas 
para o reúso em outros projetos. 
○ VANTAGENS: 
■ Eficiência: o desenvolvimento é facilitado, uma vez que diversas linhas de código mais 
comuns estão prontas no framework. 
■ Custo: estão disponíveis gratuitamente no modelo open source (aceita alterações) 
■ Segurança: os frameworks são altamente testados, é seguro que vão funcionar. 
■ Apoio técnico: possuem documentação rica em detalhes e com explicação de sua 
aplicação. 
■ Padrões de codificação: Tem um padrão de escrita determinado por ele, o que facilita 
sua legibilidade, entendimento e manutenção. 
○ DESVANTAGENS: 
■ Dependência: Ao utilizar o framework, sua aplicação fica amarrada a ele; caso este 
seja descontinuado ou seja atualizado com quebra de compatibilidade, o projeto deve 
ser reestruturado. 
● Linhas de produto: Reutiliza componentes para criar uma variedade de produtos similares, mas 
adaptados a diferentes necessidades. 
○ Ex: Uma empresa de software que desenvolve sistemas de gerenciamento para diferentes 
setores pode criar uma linha de produtos de software que compartilha um núcleo em comum, 
reutilizando funcionalidades e essenciais, enquanto customiza partes específicas para cada 
setor. 
● Componentes: Envolve a reutilização de composição de componentes reutilizáveis pré-existentes. 
○ Os componentes são entidades executáveis e independentes que realizam tarefas específicas 
e podem ser combinados para construírem sistemas complexos. 
○ EX: Em um sistema de e-commerce, em vez de criar um sistema de carrinho de compras 
complexo, é melhor usar um componente de carrinho de compras (que é executável) que já foi 
desenvolvido e testado, acelerando o desenvolvimento e garantindo uma experiência segura 
de compra para os usuários. 
○ Os componentes precisam ser documentados para avaliar se atendem às necessidades da 
aplicação. Eles são testados, executados e utilizados. Assim, o nível de segurança é mais alto, 
e qualquer falha já é avisada e corrigida. 
● Templates e Geradores de Código: São ferramentas que produzem automaticamente partes do 
código baseado em padrões pré definidos. 
● Design 
 
SOLID → São princípios que garantem que os componentes sejam mais fáceis de manter, de estender e que 
estes não introduzem erros em outros locais do sistema. 
 
AULA 7 - PADRÕES ARQUITETURAIS MCV, MVP e MVVM 
O uso de PADRÕES DE ARQUITETURA é fundamental no desenvolvimento de software e aplicações que 
possuem a presença de um cliente, pois é necessário que estes padrões permitam que o cliente possa 
interagir com os dados e alterá-los, oferecendo formas e diretrizes para a organização da estruturação 
de códigos. Esses padrões proporcionam: 
● Separação clara das responsabilidades entre os componentes do sistema; 
● Facilitação da manutenção e da escalabilidade de softwares; 
● Colaboração entre os membros da equipe de desenvolvimento; 
● Facilita a compreensão (melhor legibilidade do código) e os testes; 
● Deixa o software mais reutilizável. 
 
As arquiteturas MVC, MVP e MVVM são padrões arquiteturais que têm a FUNÇÃO de ORGANIZAR O 
CÓDIGO e dividi-lo em níveis de desenvolvimento (camadas), em que as classes ficam separadas de 
acordo com suas responsabilidade (manipulação de dados e apresentação destes ao cliente) e eles também 
são responsáveis pela INTERCONEXÃO dos componentes de um sistema. Os padrões implementam os 
seguintes componentes ou camadas: 
● Modelo (model) — Armazena as regras de negócio 
○ Apresenta a funcionalidade principal e os dados da aplicação (em geral, dados e 
comportamentos); 
● Visão (view) — Armazena as classes de interface 
○ Trabalha sobre a camada de apresentação ao usuário, é a camada de interfaces gráficas que 
interagem com o usuário; 
● Controlador, Visão-Modelo ou Apresentador — Ligam logicamente as demais camadas 
○ Atua no contexto geral para interligar dados e comportamentos à camada de interface do 
usuário, cada qual com suas responsabilidades e sua implementação lógica. 
MODELO VISÃO CONTROLADOR (MVC - Model View Controller): 
● MODELO: Representa a camada de dados e lógica de negócios da aplicação. Ele cuida damanipulação e da gestão de dados; 
○ A classe Model representa o estado das coisas que têm atributos e operações, como: Produto, 
Pessoa, Usuário, etc. Todos os exemplos como representação das entidades do banco de 
dados. 
○ A comunicação entre o Modelo e a Visão não ocorre diretamente, mas, sim, por meio de 
eventos ou notificações. 
○ Ele representa o estado do aplicativo, mantém os dados e lida com operações de 
armazenamento, recuperação e processamento de informações. 
● VISÃO: É a responsável pela apresentação da interface gráfica ao usuário. Ela exibe os dados do 
modelo e interage com o usuário; 
○ Contém os componentes visuais e o código com a interface a ser mostrada ao usuário. 
Também é responsável pela interação do usuário com a aplicação, como a interação do 
usuário com botões, links, input e outras funções. 
○ Não faz nenhuma pesquisa diretamente no banco, ela apenas recebe, manipula e mostra os 
dados na interface gráfica definida ao usuário. 
● CONTROLADOR: Atua como intermediário entre o modelo e a visão. Ele controla o fluxo de 
informações, processa as entradas do usuário e atualiza o Modelo e a Visão conforme necessário. O 
controlador é o componente que toma decisões de negócios. Ou seja, ele analisa uma solicitação do 
usuário e determina o que será feito a partir disso. 
○ A Visão notifica o Modelo sobre as mudanças de estado 
mediante eventos gerados pelas interações do usuário na 
interface. Já o Controlador atua como um intermediário 
entre o Modelo e a Visão. Ele recebe as interações do 
usuário na interface, processa essas interações e atualiza 
o Modelo, que, por sua vez, notifica a Visão sobre as 
mudanças nos dados. 
○ O controlador é responsável por gerenciar a comunicação entre a visualização e o modelo. A 
visualização é atualizada pelo modelo por meio do controlador. 
OBS: Para uma aplicação muito simples com apenas uma ou duas telas, o MVC pode funcionar bem. Em 
aplicações mais complexas, quando suas atividades e classes de fragmentos tendem a crescer, torna-se 
difícil para o aplicativo evoluir. Esse padrão não facilita a manutenção nem os testes. 
 
MODELO VISÃO APRESENTADOR (MVP - Model View Presenter): 
● MODELO: Mantém os dados e a lógica de negócios. São os objetos com dados e ações que serão 
manipulados. 
● VISÃO: Responsável pela exibição dos dados ao usuário e pela captura de eventos de interação do 
usuário. 
● APRESENTADOR: Funciona como intermediário entre Modelo e Visão. Diferentemente do MVC, o 
Apresentador controla a lógica de apresentação e interação com o usuário, enquanto o Modelo 
permanece independente. 
○ Sua função é atualizar a visão quando o 
modelo é alterado e sincronizar o modelo em 
relação à visão. 
VANTAGENS: 
● Comparado com o MVC, apresenta maior testabilidade; 
● Alterar layouts é mais fácil; 
DESVANTAGENS: 
● Apresenta dependência entre camadas em duas direções, pois o Presenter tem consciência tanto da 
View, quanto do Model. 
 
MODELO VISÃO VISÃO-MODELO (MVVM - Model View ViewModel): 
● MODELO: Continua sendo a camada que gerencia os dados e a lógica de negócios. 
● VISÃO: É responsável pela apresentação da interface ao usuário. 
● VISÃO-MODELO: Funciona como um adaptador entre o Modelo e a Visão. Ele contém a lógica de 
apresentação, formatação de dados e gerenciamento de estados. O Visão-Modelo é especialmente 
útil em aplicativos com interfaces de usuário complexas e dinâmicas. 
VANTAGEM: 
● Permite o teste unitário entre cada camada sem utilizar ferramentas para teste de interface e tem alta 
manutenibilidade. É ALTAMENTE TESTÁVEL. 
● Essa divisão facilita a manutenção, a escalabilidade e a implementação de novos recursos, pois 
mantém a lógica de apresentação separada da lógica de negócios, permitindo modificações sem uma 
afetar a outra. 
● Além disso, o MVVM é eficaz em termos de desempenho, pois permite uma ligação bidirecional entre a 
View e o ViewModel. Isso significa que as atualizações na View são refletidas no ViewModel e vice-versa, o 
que proporciona uma experiência de usuário mais dinâmica e responsiva. 
DESVANTAGEM: 
● Para uma aplicação com pouquíssima complexidade, talvez a quantidade de código a mais que você 
vai ter que escrever possa diminuir sua produtividade. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
● MVP: A comunicação atua como a View, enquanto o Presenter atua como intermediário entre a View e 
o Modelo. A View envia eventos para o Presenter, que atualiza o Modelo, e então o Presenter atualiza 
a View novamente. 
○ No padrão MVP, o usuário interage com o sistema por meio de telas disponibilizadas pela View. 
As requisições do usuário são pegas na View e repassadas ao Presenter, que faz o pedido ao 
Model. O Model retorna todos os pedidos ao Presenter, que, por fim, encaminha para a View; 
por meio dela, os pedidos chegam ao usuário. 
○ O usuário interage com a interface acessando, por exemplo, um cadastro de usuário. O 
Presenter observa os eventos disparados pela View e requer os dados para efetuar o 
cadastramento, requerendo os mesmos ao Model. O Model retorna todos os dados que 
deverão ser preenchidos para efetuar corretamente o cadastro, como: nome, telefone, e-mail, 
login e senha. O Presenter retorna a View, que atualiza a tela com os campos que o usuário 
deverá preencher. 
○ MVP É UMA VIA DE MÃO DUPLA, DIFERENTE DO MVC, QUE É UM FLUXO SEGUE 
APENAS UM SENTIDO. 
● MVVM: A comunicação atua como a View, enquanto o ViewModel é responsável por gerenciar o 
estado da View e interagir com o Modelo. A View é ligada ao ViewModel por meio de vinculação de 
dados, o que permite que o ViewModel atualize a View diretamente. 
Embora o MVC seja o padrão mais antigo e bem estabelecido, o MVP e o MVVM foram criados como 
variações para suprir as deficiências do MVC. O MVP e o MVVM são projetados para tornar o código mais 
testável e mais fácil de manter, permitindo que a lógica de negócios seja isolada em um único componente. 
Esses padrões de arquitetura são importantes na hora de desenvolvimento de um aplicativo/software, pois, de 
acordo com o padrão utilizado, as necessidades específicas desse projeto em desenvolvimento podem ser 
melhor atendidas ou não. Um padrão arquitetural é uma forma preestabelecida de resolver um problema já 
conhecido; é o uso de uma solução já estudada e documentada para o problema que está na sua frente. 
 
AULA 8 - ARQUITETURAS DE SOFTWARES DISTRIBUÍDOS 
SD → É uma coleção de computadores interconectados por meio de uma rede formando um único sistema. 
Em SISTEMAS DISTRIBUÍDOS, o hardware, o software ou ambos são compartilhados em vários 
computadores, por meio de uma rede, pela qual eles coordenam suas ações e se comunicam a partir 
da troca de mensagens. Esses sistemas possuem algumas características bem peculiares, principalmente 
relacionadas à: 
● CONCORRÊNCIA: O sistema deve ter a capacidade de manipular e gerenciar recursos 
compartilhados, com serviços que disputam recursos atuando ao mesmo tempo. EX: Quando mais de 
um computador/usuário tenta acessar um mesmo recurso ao mesmo tempo, o sistema cria um 
controle para organizar uma fila de acesso de forma que todos consigam acessar o mesmo recurso. 
● INEXISTÊNCIA DE UM RELÓGIO GLOBAL: Se refere às dificuldades originadas das limitações 
que os computadores têm para conciliar seus relógios ao trabalharem em uma mesma rede, o 
que pode levar a problemas de sincronização entre as mensagens. 
● FALHAS INDEPENDENTES 
 
Uma das principais metas de um sistema distribuído é facilitar o acesso aos recursos, conectando 
usuários e aplicações e facilitando o compartilhamento de informações, de forma eficiente e controlada. 
● Um SD é muito mais eficiente em relação a um Sistema Centralizado, uma vez que, no SD, caso haja 
um erro em uma parte do sistema, as funcionalidades dessa parte são realocadas para serem 
realizadas por outra parte desse sistema que está atuando mais próxima e, assim, o sistema continua 
atuando como se nada tivesse acontecido, já no Sistema Centralizado, casotivesse havido um 
problema em uma parte do sistema, toda a rede fica prejudicada. Ou seja, SD SÃO MAIS 
TOLERANTES À FALHAS DO QUE OS SC. 
 
O Sistema Distribuído deve apresentar: 
● TRANSPARÊNCIA → Se refere ao fato de o usuário saber que está trabalhando com um sistema 
distribuído. Atualmente, sabemos que não é possível esconder isso dos usuários, visto que, uma hora 
ou outra, eles serão impactados por alguma questão proveniente das características do sistema, como 
uma demora para receber retorno de uma requisição. 
○ A ABSTRAÇÃO diz respeito aos usuários não notarem que sua aplicação está atuando de 
forma distribuída, ou seja, eles não notam que partes de um programa ou aplicação estão 
executando em diferentes computadores. 
● SISTEMA ABERTO → Deve permitir que outros desenvolvedores possam colaborar com facilidade, 
adicionando novos componentes e melhorando os existentes. E devem, também, devem seguir regras 
padronizadas, por exemplo: A semântica e a sintaxe dos serviços devem ser bem descritas, ou seja, é 
preciso ter bem especificado o formato, o conteúdo e o significado das mensagens transmitidas de um 
computador para o outro. 
● ESCALABILIDADE → Deve permitir o aumento da capacidade de recursos e usuários sem a 
ocorrência de gargalos de desempenho de software e hardware à medida que o sistema escalona. 
Com o tempo, é necessário que o sistema se amplie, mas que ele continue sendo fácil de gerenciar. 
○ Ela pode ser vertical (quando adicionamos mais memória e processamento a um mesmo 
servidor) e horizontal (quando adicionamos mais um servidor para dividir a carga). 
● PROTEÇÃO/SEGURANÇA → Há mais computadores a serem protegidos, e pode haver 
interceptação das informações por meio da rede; além disso, os dados podem ser interceptados, 
modificados ou fabricados por um invasor. Por esse motivo, devemos ter cuidado para que a política 
de proteção abranja todos os computadores e componentes do sistema. 
● QUALIDADE DE SERVIÇO → Pode ser garantida por um conjunto de ferramentas que ajudem a 
assegurar o desempenho das aplicações críticas, com confiabilidade e tempo de resposta que sejam 
aceitáveis para os usuários finais. 
● GERENCIAMENTO DE FALHAS → se um dos computadores armazena um dado crítico para a 
aplicação, devemos replicar esses dados periodicamente (fazer backups em outras máquinas), para 
que os dados possam ser restaurados em caso de falha no computador principal. 
 
A interação entre os computadores em um sistema distribuído é baseada em três paradigmas: 
● Nos dois primeiros, a comunicação é bilateral, dependendo de um remetente e de um destinatário — 
ou seja, trata-se de uma comunicação direta. Já na comunicação indireta, a comunicação ocorre 
usando uma terceira entidade. 
1. Comunicação entre processos 
2. Invocação remota 
3. Comunicação indireta: Possibilita o desacoplamento espacial (quando os remetentes não precisam saber 
quem serão os destinatários) e o desacoplamento temporal (remetentes e destinatários não precisam 
coexistir no tempo). 
 
Sistemas Distribuídos utilizam MIDDLEWARES, que funciona como uma camada de abstração da 
programação para mascarar as diferenças entre os computadores interconectados (principalmente de SO) e 
permitir a comunicação entre eles. 
PADRÕES DE ARQUITETURAS 
● MESTRE-ESCRAVO: É um modelo 
hierárquico apresentando um componente 
central (mestre) que aloca recursos, realiza a 
coordenação, as comunicações, o 
processamento e atribui tarefas individuais e 
mais específicas a outros componentes 
interconectados (escravos). Este é um 
modelo eficiente porque promove a 
distribuição da carga de trabalho e otimiza 
a utilização de recursos. 
○ É o tipo mais apropriado para sistemas que realizam tarefas complexas e necessitam de um 
tempo de resposta sincronizado (de tempo real). 
○ Aqui há apenas um nó primário (mestre) para vários nós secundários (escravos). 
● CLIENTE-SERVIDOR DUAS CAMADAS: As arquiteturas de duas camadas possuem um único 
servidor lógico e clientes que utilizam esse servidor. Possuem: 
○ Camadas lógicas (LAYERS) → Inclui aplicativos, serviços, middleware e Sistema 
Operacional. 
○ Camadas físicas (TIERS) → São as camadas de distribuição, que envolvem todo o nodo de 
processamento. 
 
● Nesse modelo, a lógica de negócios, incluindo as regras de aplicação, normalmente fica no 
SERVIDOR, enquanto o CLIENTE é responsável principalmente pela apresentação dos dados e 
pela interação com o usuário. 
○ Há 2 formas de configurar essa arquitetura: 
○ CLIENTE MAGRO: O cliente trata apenas da camada de apresentação, e as demais são 
responsabilidade do servidor. Normalmente, a apresentação utiliza um navegador Web. 
○ CLIENTE GORDO: o cliente é responsável por executar uma parte ou mesmo todo o 
processamento, enquanto o servidor fica responsável pelo banco de dados e pelo 
gerenciamento dos dados. 
○ EX: Os cientistas de dados desenvolvem aplicações de aprendizado de máquina e se 
beneficiam do uso de GPUs (Unidades de Processamento Gráfico) para acelerar o 
processamento das suas aplicações. Uma das formas de fazer isso, é instalar todo o ambiente 
da linguagem de programação (normalmente Python) em um computador local, que possua 
uma GPU própria. Nesse caso, estamos utilizando uma arquitetura no modelo cliente gordo 
(pois o cliente executa toda parte do processamento). Por outro lado, há a opção de utilizar a 
ferramenta Web disponibilizada gratuitamente pelo Google, a Colaboratory (ou Colab), ou 
ainda montar um servidor com GPUs e fazer acesso remoto. Nesse último caso, o modelo 
utilizado é o cliente magro (pois o cliente usa apenas a camada de apresentação, interface). 
● CLIENTE-SERVIDOR MULTICAMADAS: Nessas arquiteturas, cada camada do sistema é um 
processo separado. Cada camada pode ser executada em um computador diferente, e isso 
permite que os servidores processem muitas transações. São as arquiteturas que possibilitam maior 
escalabilidade, pois é possível adicionar mais computadores para aumentar o poder de 
processamento ou melhorar o tempo de resposta do serviço. Usada em aplicações de grande porte, 
em que o servidor fica responsável por processar uma quantidade muito grande de informações. 
● COMPONENTES DISTRIBUÍDOS: Possibilita que bancos de dados e sistemas diversos sejam 
combinados. Nela, o sistema é formado por um conjunto de componentes, no qual cada um fornece 
uma interface para uma coleção de serviços. Utilizam middlewares para a comunicação entre si. 
○ Essa arquitetura permite maior flexibilidade ao projetista, que não precisa tomar decisões 
de hardware logo no início do projeto. Elas facilitam a adição ou replicação de componentes, e 
sua reconfiguração é mais dinâmica. 
○ Ex: Os containers permitem que você crie ambientes separados, sendo executados sobre o 
mesmo sistema operacional, mas no qual um ambiente pode ficar totalmente isolado do outro, 
cada um tendo suas configurações, ocupando disco, memória e outros recursos de um 
servidor de forma isolada. Eles são a evolução das máquinas virtuais, pois compartilham a 
camada do sistema operacional. 
● PONTO A PONTO (P2P): São sistemas baseados em um modelo não centralizado, em que qualquer 
nó da rede executa uma cópia da aplicação e pode realizar o processamento. Nessas 
arquiteturas, os clientes trocam informações diretamente entre si, e pode haver um servidor que 
apenas se presta ao papel de “apresentar” os clientes uns aos outros. 
● As máquinas atuam como cliente e como servidor ao mesmo tempo. 
 
 
 
 
 
 
 
 
 
 
 
 
AULA 9 - ARQUITETURAS ORIENTADA A SERVIÇOS 
 
A SOA (ARQUITETURA ORIENTADA A SERVIÇOS) → É um conceito fundamental no campo da TI que 
envolve duas principais interações: a exposição e o consumo de serviços (aquilo que, de fato, entrega valor 
para o cliente) por meio de web services. Essa abordagem desempenha um papel crucial na integração de 
sistemas e na disponibilização de funcionalidades de maneira eficiente e flexível. 
● A SOA é projetada para minimizar o acoplamentoentre os serviços. Isso significa que os serviços 
devem ser projetados de forma que tenham baixas dependências lógicas entre si. O acoplamento 
refere-se à dependência entre componentes de software, e uma das metas da SOA é criar sistemas 
de software bem estruturados e flexíveis, através da composição de serviços que sejam 
independentes 
● Não é tão fácil migrar um modelo de arquitetura para a SOA, pois: 
○ A SOA é cara, porque pressupõe mudar a forma de modelar algo que já está pronto; 
○ Nem sempre vale a pena propor uma nova arquitetura para algo que já está em pleno 
funcionamento. 
● BARRAMENTO DE SERVIÇO (ESB) 
→ Trata do projeto, da 
implementação e da implantação de 
serviços, por meio da SOA. 
○ É o coração da SOA, por 
meio dele, podemos prover 
comunicação entre diversos 
sistemas, plataformas, 
aplicações e, inclusive, entre 
tecnologias diferentes. 
○ Atua como MIDDLEWARE. 
 
● Embaixo tem-se os provedores dos serviços (servidores), o ESB recebe esses serviços 
e os distribui para os consumidores (clientes) que precisam ter acesso a eles. 
 
A comunicação em um ESB é realizada principalmente por meio de XML e web services. O barramento 
de serviço representa o local onde os serviços estão interconectados (uma centralização) como um 
repositório para consumo. Atua como um intermediário para facilitar a comunicação entre serviços 
distribuídos. O ESB oferece recursos de roteamento, transformação e mediação de mensagens, 
garantindo a integração flexível e confiável entre sistemas heterogêneos. 
● EX: Suponha que um data warehouse (DW) precise acessar um dado em um sistema departamental, 
para prover um serviço. Então, em vez de consultar o dado diretamente (consultar um CPF, por 
exemplo), via componente ou base de dados, a requisição da consulta ocorre diretamente ao ESB, e 
este se comunica com a base, que retorna o dado esperado (ex: o CPF). Logo, o DW é simplesmente 
um consumidor de um serviço de consulta a uma base de dados departamental, via ESB. Ou seja, é 
como se o dado fosse encapsulado para ser acessado pelos serviços disponibilizados no barramento. 
O registro dos serviços implantados ocorre como uma base de dados de informação. Quando um sistema, por 
exemplo, deseja consumir algum serviço, ele busca no registro do serviço (UDDI), a fim de verificar a 
especificação do serviço e localizá-lo. Essa comunicação, por sua vez, ocorre por meio do protocolo SOAP 
(simple object access protocol) ou do estilo arquitetural REST. 
● Logo, temos três colunas principais na SOA: 
○ UDDI, padrão responsável pelo descobrimento, que define como as informações sobre os 
serviços podem ser organizadas; 
■ Funciona como um repositório ou banco de dados de informações de web services. 
○ WSDL, responsável por definir como as interfaces dos web services serão representadas; 
○ SOAP, protocolo responsável pela comunicação e troca de dados entre web services. 
■ Por meio do SOAP, pretende-se garantir a interoperabilidade e a intercomunicação 
entre diferentes sistemas, a partir da utilização de uma linguagem (XML) e de um 
mecanismo de transporte (HTTP) que encapsula o SOAP. 
■ Todo SOAP é definido por 3 elementos: ENVELOPE, HEADER e BODY. 
WEB SERVICES → São Softwares/Tecnologias que permitem que diferentes sistemas se comuniquem e 
compartilhem dados de maneira padronizada pela internet, possibilitando a INTEROPERABILIDADE, ou 
seja, que aplicações independentes escritas em linguagens diferentes e que possuem sistemas operacionais 
diferentes interajam de forma coesa e sem complicações. 
● Funcionam como uma forma de implementar Arquitetura Orientada a Serviços (SOA); 
● São componentes que permitem às aplicações enviar e receber dados em formato XML. Cada 
aplicação pode ter sua própria “linguagem”, que é traduzida para uma linguagem universal, o formato 
XML (que possui os padrões SOAP e REST) e que permite que essas aplicações se comuniquem. 
● MOTIVOS PARA USO: 
○ Padronização no retorno de cada requisição de serviços; 
○ Cada Web Service realiza uma função específica e autônoma; 
○ Deixam as integrações mais simples, permitem que diferentes partes de um sistema possam 
ser integrados sem a necessidade de modificar todo o sistema; 
○ Suportam comunicação assíncrona: onde uma aplicação pode fazer uma solicitação e 
continuar a executar suas tarefas, sem a necessidade de esperar sua solicitação ser atendida 
primeiro. 
○ São seguros, permitem escalabilidade e uma melhor manutenção; 
● EXEMPLO: 
○ Um Cliente, por exemplo, um celular que acessa um URL http://www.server.com/… é 
encaminhado para um Web Service que, por sua vez, consulta um Banco de Dados. O BD 
possui essa informação de acesso que o Cliente está requisitando e envia uma resposta para o 
Web Service, que envia essa resposta para o Cliente em formato XML. 
○ EX2: Em um sistema de uma loja online, quando o Cliente digita o seu CEP, é feita uma 
requisição de qual o endereço aquele CEP se refere, então essa requisição é enviada para o 
Web Service, que a repassa para o BD e o BD atende essa requisição e retorna para o Web 
Service a resposta com o nome da rua referente àquele CEP, o WS, por sua vez, retorna essa 
resposta no formato XML para o Cliente que, por fim, pode ter acesso ao nome de sua rua e o 
valor do frete para seu endereço. 
○ Ou seja, o Cliente só tem acesso ao Web Service, o Web Service é quem se comunica com o 
Banco de Dados. 
● Há 2 tipos de Web Services: 
○ SOAP → Segue um padrão mais antigo; 
■ É um PROTOCOLO (um conjunto de regras que ensinam como fazer algo) rígido que 
sempre usa XML para mandar e receber as mensagens no modelo cliente-servidor e 
definir a estrutura dessas mensagens; 
■ É um protocolo de comunicação independente que pode ser usado em qualquer 
linguagem de programação, em qualquer plataforma e com qualquer protocolo de 
transporte (HTTP, FTP, UDP etc) 
○ REST → Mais utilizado hoje em dia, pois trabalha diretamente sob o protocolo HTTP; 
■ É um ESTILO ARQUITETURAL, não um protocolo. 
■ Ao contrário das alternativas anteriores, REST não é uma interface específica em 
uma SOA como WSDL, UDDI ou SOAP. Em vez disso, REST é um conjunto de 
princípios e restrições de design aplicados a recursos na web. 
■ Tem melhor performance em relação ao SOAP, possui regras menos rígidas do que o 
SOAP; 
■ É mais flexível, já que usa os verbos HTTP como GET, POST, PUT ou DELETE para 
manipular recursos, diferentemente do SOAP que só pode usar o POST para enviar 
requisições. 
■ A quantidade de recursos necessários, como espaço e rede, para enviar um mensagem 
utilizando o REST é muito menor em relação ao SOAP; 
■ O consumo e o provimento dos serviços por meio da web ocorre de maneira mais 
rápida e simples. 
 
Em resumo, um web service é um sistema transformado em um serviço que deverá ser cadastrado e 
disponibilizado em um formato eletrônico padronizado via web. 
● Assim, se o cadastro foi feito no UDDI, as informações foram escritas em XML, a descrição foi 
feita em WSDL, e as trocas de mensagens foram realizadas por meio de SOAP, então temos a 
utilização e a implementação de uma arquitetura orientada a serviços 
 
AULA 10 - PROJETO DE SERVIÇOS WEB 
 
O PROJETO DE SERVIÇOS WEB permeia a utilização da orientação para a exposição e o consumo de 
serviços através da web, utilizando requisições encaminhadas por clientes via interfaces web, para que 
servidores descentralizados enviem respostas. Sendo assim, padronizações foram implementadas para 
que os projetos de serviços web alcancem a interoperabilidade: 
● O funcionamento de serviços na web não depende exclusivamente desta ou daquela tecnologia, mas, 
sim, da orquestração de múltiplas tecnologias (que estão sob o ponto de vista dos servidores 
(back-end, os códigos) e dos consumidores ou usuários (front-end, as interfaces gráficas) dos 
serviços). 
○ BACK-END: É a exposição de serviços na web, partem da orientação via Java; 
○ FRONT-END: É a interface de serviço. O usuário de um serviço acessa umainterface gráfica 
amigável, acreditando que isso tudo é bastante simples, sem perceber toda a infraestrutura de 
serviço web que está por trás. Precisa haver uma interface de serviço para que o usuário 
consiga consumir o serviço. 
 
COMO FUNCIONA UM PROJETO DE SERVIÇO WEB: 
● As REQUISIÇÕES de um CLIENTE são realizadas via web para SERVIDORES (cliente solicita, via 
web, um serviço ao servidor, que deve atendê-lo); 
○ Ou seja, se existe uma requisição, deve existir uma resposta à ela. 
● Existem várias formas de realizar uma requisição e várias formas de receber uma resposta. 
● O modus operandi de serviços web foi organizado em CAMADAS para facilitar a implementação de 
serviços web: 
○ CAMADA WEB: Possui a lógica web. 
○ CAMADA DE NEGÓCIO: Possui a lógica de negócio. 
○ Essa separação foi fundamental para o desenvolvimento de serviços web. 
Então, fica: 
● O Cliente faz uma requisição ao Servidor; 
● O Servidor vai oferecer serviços a esse cliente, e esses serviços retornarão em forma de resposta 
através de protocolos HTTP (protocolos de comunicação cliente-servidor, é a base de qualquer troca 
de dados na Web, o que significa que as requisições são iniciadas pelo destinatário, geralmente um 
navegador da web); 
● Quando essa requisição sai do Cliente, ela percorre uma CAMADA WEB e uma CAMADA DE 
NEGÓCIO; 
● Assim, o serviço já está disponível para ser consumido; 
● Dessa forma, a requisição é encapsulada via HTTP e encaminhada através do protocolo SOAP ou 
REST até o UDDI, que é onde é buscada a descrição do serviço, que está em WSDL; 
● Ou seja, o pacote HTTP, quando sai tanto do cliente, quanto do servidor, precisa ter a descrição sobre 
qual serviço deve retornar. Ex: Eu quero um serviço que retorne nome ou data ou idade. Então, 
necessariamente, quando chego com minha requisição no UDDI, encontro a minha descrição desse 
serviço em WSDL. 
○ UDDI → Repositório onde os serviços ficam com suas descrições armazenadas em WSDL. 
○ Chega-se, então, até o BARRAMENTO DE SERVIÇOS (ESB) e, por exemplo, percebe-se que 
o serviço desejado é o serviço XPTO, que pode estar no próprio barramento, ou numa base de 
dados, ou num sistema etc; 
○ Supõe-se que ele está em um barramento de serviços SOA: 
■ É feita a busca pelo serviço → Ele é retornado pela camada de negócios → Atravessa 
a camada web → Chegando, enfim, ao cliente (seu destino final) 
○ Sendo assim, ao realizar uma requisição, o cliente sempre terá uma resposta, mesmo que ela 
seja negativa ou indicando que aquela requisição não existe. 
○ Ou seja: A resposta do serviço, após verificar a descrição em WSDL no UDDI, é retornada 
através de SOAP ou REST e, por fim, o cliente consome o serviço que foi exposto no 
Barramento de Serviços. 
 
AULA 11 - ENGENHARIA DE SOFTWARE ORIENTADA A ASPECTOS 
Desenvolvimento de SISTEMAS ORIENTADO A ASPECTOS → É como um setor da engenharia de software, 
reunindo um conjunto de normas e métodos capazes de auxiliar em todas as etapas de desenvolvimento. 
ENGENHARIA DE SOFTWARE ORIENTADA A ASPECTOS → É uma teoria apresentada para a criação de 
um software que objetiva solucionar questões relacionadas ao reúso de software, tornando os 
programas mais fáceis de manter e reusar. 
● É um paradigma de programação de computadores que permite aos desenvolvedores de 
software separar e organizar o código de acordo com a sua importância para a aplicação. 
● Ela tem como referência as abstrações (aspectos) que introduzem a atividade de sistema, podendo 
ser solicitada em setores distintos dentro de um programa. Os aspectos encapsulam a atividade que 
convive com outra funcionalidade existente no sistema, sendo que eles são empregados em paralelo 
com outras abstrações. 
● A combinação/composição automática de objetos, aspectos e métodos alinhados com as 
características contidas no código-fonte do programa gera um programa executável orientado a 
aspectos. 
Existe uma complexidade visível na relação entre os atributos e os componentes de um programa na maioria 
dos sistemas considerados de grande porte. Um conjunto de componentes consegue implementar um 
único requisito, sendo que cada componente pode acrescentar elementos de requisitos variados. Na 
prática, isso implica afirmar que a alteração desses requisitos leva ao conhecimento e à mudança de diversos 
componentes. O reúso pode envolver sua alteração para remover um código extra que não esteja associado 
com a funcionalidade central dos componentes (Reusa um componente que realiza funções a mais do que é 
necessário serem realizadas no sistema atual). 
 
IMPLEMENTAÇÃO DO SOFTWARE POR MEIO DE SEPARAÇÃO DE INTERESSES 
É preciso organizar o software, de maneira que cada método ou procedimento realize apenas uma 
atividade, sem a preocupação de atuar em outros elementos do programa. 
● Assim, pode-se compreender cada item que compõe o programa, verificando os seus interesses 
específicos. Havendo a necessidade de alteração, esta será realizada em uma quantidade reduzida 
de elementos. 
É preciso deixar claro que os mecanismos de estruturação de programas apresentam problemas quando 
determinados interesses entram em conflito com outros. Essa transversalidade não pode ser visualizada por 
meio de mecanismos estruturados. Para auxiliar no gerenciamento desses interesses transversais, 
foram introduzidos os conceitos relacionados à engenharia orientada a aspectos. 
 
INTERESSES SÃO PENSADOS COMO UMA FORMA DE ORGANIZAR REQUISITOS. 
● É mais simples acompanhar interesses apresentados na forma de requisitos, de maneira unitária 
ou conjunta, com os elementos de programa relacionados visando a implementação desses 
interesses. 
ENGENHARIA DE REQUISITOS ORIENTADA A INTERESSES 
INTERESSES → Indicam os atributos dos stakeholders. A funcionalidade solicitada por um stakeholders, 
as políticas aplicadas à organização ou a mensuração da qualidade do serviço do sistema são alguns dos 
aspectos em que os interesses podem refletir. Isso implica em uma abordagem direcionada à engenharia de 
requisitos, que reconheça e especifique quais são os interesses distintos dos stakeholders 
 
INTERESSES TRANSVERSAIS → Podem interferir na implementação de outros requisitos inseridos no 
sistema. Interesses que afetam múltiplas classes e/ou métodos que modularizam (organizam por partes, 
separam) outros interesses de um sistema. São direcionados ao sistema de maneira completa. 
● Exemplos de interesses transversais: Qualidade de serviço, Rastreamento, Auditoria, Persistência, 
Distribuição e Tratamento de erros. 
 
Há diferentes TIPOS DE INTERESSES DE STAKEHOLDERS: 
Interesse Funcional → Está ligado a uma determinada funcionalidade a ser acrescida no sistema. 
● Interesses Centrais → Quando os interesses funcionais estão direcionados a atender aos próprios 
objetivos. São interesses funcionais e estão relacionados com o seu objetivo principal. 
● Interesses Funcionais de Ordem Secundária → Se caracterizam por envolver as atividades que 
dividem informações com os interesses centrais. Outra característica é serem solicitados para que o 
sistema consiga atender aos seus atributos não funcionais. Apesar de não abrangerem o sistema 
como um todo, é possível considerar que os interesses funcionais secundários são transversais. 
Normalmente, eles são ligados a conjuntos de interesses centrais que possibilitam a funcionalidade 
apresentada. 
Interesses de Qualidade de Serviço → Estão ligados ao desempenho não funcional do sistema. A 
disponibilidade, o desempenho e a confiabilidade são aspectos presentes nesses interesses. 
Interesses de Políticas → Acrescentam interesses relacionados às normas que envolvem negócios e 
segurança, por estarem em alinhamento com as políticas gerais que administram o uso de um sistema. 
Interesses do Sistema → Aspectos relacionados à manutenção e à configuração. Se relacionam com os 
requisitos do sistema como um todo. 
Interesses Organizacionais → Se alinham às prioridades e metas da organização, acrescentando a 
criação de um sistema

Mais conteúdos dessa disciplina