[Música] Olá sejam bem-vindos ao canal engenharia de software com ênfase uml Eu sou professor gilian GES e eu já T na área de modelagem de software há vários anos eu tenho quatro livos publicados sobre o assunto e eu já ministrei diversas palestras e cursos técnicos sobre modelagem de software utilizando a linguagem uml na aula de hoje eu vou dar continuidade ao conteúdo sobre o diagrama de sequência eu vou apresentar alguns exemplos práticos mais de do diagrama de sequência e vou explicar os conceitos de fragmentos de interação e fragmentos combinados Então vamos iniciar a nossa aula
Então essa é a segunda aula sobre diagrama de sequência Conforme falei eu vou apresentar alguns exemplos e conceitos mais avançados sobre esse diagrama então eu gosto sempre de fazer uma pequena propaganda eu já ministrei aliás eu já quatro livros sobre o assunto o meu primeiro livro foi o Mr uma abordagem prática que na época tratava da Mr 1.5 mas já abordava o ml2 no final do livro depois eu lancei o livro O ml2 Guar de consulta rápida Poucos Anos depois eu transformei esse livro num livro um pouco mais completo que foi o ml2 guia prático
e depois eu lancei o meu livro mais atual que é o ml2 uma abordagem prática que se encontra na terceira Edição Mas eu já estou trabalhando na quarta Edição e pretendo lançar essa nova edição ainda esse ano Mas vamos ao conteúdo primeiramente Vamos definir o conceito de fragmentos de interação essencialmente um fragmento de interação é qualquer trecho de um diagrama de interação no caso da aula de hoje Qualquer treo de um diagrama de sequência incluindo um diagrama de sequência completo isso é muito útil no momento que eh nós podemos referenciar fragmentos de interação vamos ver
como ao longo dessa aula então Aqui nós temos um exemplo de fragmento de interação que se refere a um diagrama de sequência completo esse diagrama de sequência ele é um ele está associado ele se refere ao processo de emissão de salvo que foi definido no diagrama de caso de uso os diagramas de caso de uso foram explicados nos vídeos sobre esse diagrama Mas nós vamos apresentar o diagrama eh de caso de uso do Sistema de Controle bancário Ah Para efeito de comparação ao longo dessa aula então esse é o diagrama de sequência do processo de
emissão de saldo do Sistema de Controle bancário que nós temos modelado ao longo do noss dos nossos vídeos esse diagrama de sequência ele contém quatro lifelines uma lifeline essencialmente é uma Instância que participa de um processo bom ela é chamada de lifeline porque ela pode passar ela pode existir desde o início do processo ou ser criada ao longo do processo ou mesmo ser destruída durante esse processo então uma lifeline ela possui uma linha de vida que é uma linha tracejada abaixo da instância abaixo do objeto que determina o tempo em que essa esse essa lifeline
existe quando a lifeline ela é engrossada como nós podemos ver aqui isso é chamado de foco de controle e representa uma situação em que aquela lifeline está participando ativamente do processo então Aqui nós temos uma lifeline do ator cliente que foi definido no diagrama de caso de uso do Sistema de Controle bancário nós temos uma lifeline da classe eh visão emitir saldo que se refere a a interface entre o cliente e o sistema nós temos uma lifeline da classe contro emtir saldo e nós temos uma lifeline da classe de entidade contra comum bom eu sei
que essas lifelines pertencem a esse tipo de classes porque elas receberam os estereótipos dessas classes Ou seja a lifeline des ti saldo recebeu estereótipo boundary ou seja era uma classe de Fronteira ela interage com os usuários que participam eh desse processo ah a lifeline contol in saldo recebeu o estereótipo control ou seja ela pertence a uma classe de controle que que interpreta os eventos que ocorrem sobre visão e a lifeline conta comum recebeu o stere entity identificando que ela pertence a uma classe de entidade uma classe que contém a lógica do negócio ã ela contém
muito ela possui muitos objetos e esses objetos Possivelmente serão persistentes bom num diagrama de sequência como Foi explicado na aula anterior eh ocorre muitos eventos que são representados por mensagens e essas mensagens muitas vezes disparam métodos então H Aqui nós temos mensagens disparadas entre o ator e uma lifeline mensagens disparadas entre lifelines e nós temos mensagem de retorno que contém o resultado da execução de eh um método bom eh é importante destacar que lifelines divisão e de controle também pode solicitar o disparo de métodos entre si mas nós nos concentramos em representar eh métodos disparados
nas classes de entidade porque esses métodos representam a lógica do negócio bom ã Então como já foi explicado antes uma mensagem é representada com uma seta se uma seta ela é tracejada Ela representa uma mensagem de retorno isso já foi eh explicado eh no vídeo anterior Mas então o ator cliente ele dispara uma mensagem na lifeline divisão representando o evento que inicia esse processo que esse evento é a informação do número da conta para emissão do sal a visão ela repassa esse número da conta para controlador e a controladora em resposta solicita que ael conta
comum Execute o método consultar conta recebendo com parâmetro um long que contém o número da conta inform a lifeline conta comum retorna verdadeiro quer dizer que a conta existe a controladora em resposta solicita a visão que peça senha cliente o cliente em resposta formar a senha abrindo parênteses a visão não precisa disparar uma mensagem do cliente como ela representa essencialmente a interface o cliente já tá enxergando a solicitação então o cliente resposta ele inform fora a senha a senha é informada a senha informada é repassada pra controladora a controladora em resposta solicita que a lifeline
da classe conta comum Execute o método validar senha passando com parâmetro a senha informada Após a execução do método a lifeline retorna verdadeiro para controladora significa que a senha é válida em resposta a controladora ela solicita que a lifeline conta comum Execute o método emitir saldo e após a sua execução a lifeline conta comum retorna o saldo daquela conta a controladora então é de que a visão Apresente o saldo para o cliente ah alguns comentários Esse é um diagrama simples mas ele é um diagrama completo referente ao processo de emissão de saldo um diagrama de
sequência ele normalmente ele trabalha com caminho feliz ou seja ele apresenta situações em que ah tudo funciona conforme esperado claro que é perfeitamente possível representar situações alternativas situações de sessão nós vamos ver exemplos disso na aula de hoje e também nas aulas seguintes mas na medida do possível deve se tentar procurar representar o caminho feliz situação ideal eh só se representa eh situações alternativas ou de sessão quando elas forem realmente importantes para evitar deixar o diagrama muito extenso bom continuando então vou falar sobre uso de interação uso de interação é um recurso inovador a partir
da umr 2 que é bastante útil para deixar os diagramas de sequência mais enxutos e reaproveitar diagramas já modelados anteriormente Então os usos de interação basicamente eles fazem referência a um diagrama que já foi modelado anteriormente eles reaproveitam a o comportamento daquele diagrama Então não é necessário modelar passos que já foram modelados anteriormente então isso torna A modelagem mais rápida facilita a manutenção uma vez que eu só preciso se houver necessidade de alterar algum processo referenciado eu só faço a alteração no processo propriamente dito no diagrama propriamente dito não tenho que mexer nos outros diagramas
bom Aqui nós temos exemplo de uso de interação esse uso de interação é representado por esse retângulo contendo o operador ref ISO significa então que se está fazendo referência ao diagrama emitir sal eu tenho que procurar um diagrama de mesmo nome para visualizar os passos que ocorrem nesse processo bom aqui esse diagrama é um trecho do processo de encerrar conta conforme eu posso ver por esta aba aqui SD significa simplesmente Sequence da é uma informação exra bom esse processo ele contém cinco lifelines uma lifeline da do ator cliente uma lifeline do ator funcionário uma lifeline
da visão do processo de encerramento de conta uma lifeline da controladora do encerramento de conta e uma lifeline da classe de entidade contto especial então Eh cliente e funcionário são instâncias dos atores representados no modelo de caso de uso hã e visão controle e conta especial são instâncias de classes definidas nos modelos de classes desse desse do projeto de Sistema de Controle bancário ah cada uma dessas lifelines dessas três lifelines visão controle e conta especial recebeu o estereótipo do tipo de classe que elas eh pertencem então visão é uma classe de Fronteira ou seja uma
classe de interação entre o funcionário e o sistema controle é uma classe de controle controle encerramento de conta é uma classe de controle era interpreta os eventos que ocorrem sobre a visão e conta especial uma classe de entidade perceber o estereótipo entre então uma classe de entidade é uma classe que contém a lógica do negócio está ligada diretamente ao domínio do problema vai ter muitos objetos e eles deverão provavelmente ser persistentes já controle recebeu um estereótipo control e a visão recebeu um estereótipo Bound o estereótipo de Fronteira bom mas nesse trecho do processo de encerrar
conta o cliente ele solicita ao funcionário o encerramento de Conta isso isso apresentado por uma mensagem Entre esses dois atores ah essa interação não era totalmente obrigatória Mas elas mas ela ajuda a deixar o diagrama mais fácil de entender mais completo O funcionário então em resposta ele solicita a emissão de saldo só que a emissão de saldo já está modelada nós modelamos isso agora a pouquinho aqui nós temos o diagrama de emissão de saldo Então não é prod não é não é útil não é não é inteligente eu repetir esses Passos novamente no processo de
encerrar conta então para deixar o diagrama mais enxuto para fazer com que a modelagem se torne mais rápida Eu simplesmente referencio o processo de emissão de saldo colocando esse processo sobre as linhas de vida das minhas lifelines agora vamos fazer uma comparação com o diagrama de caso de uso do do Sistema de Controle bancário esse diagrama ele já foi explicado nos vídeos sobre o sistema de controle bancário mas notem que eu tenho aqui o caso de uso encerrar conta ah do qual interagem o cliente e o funcionário mas esse caso de uso encerrar conta ele
tem uma associação de inclusão com o caso de uso emitir saldo a associação de inclusão ela indica uma obrigatoriedade significa que quando executar o caso de uso encerrar eu tenho que Obrigatoriamente executar o caso de uso emitir saldo Ou seja eu vou incluir o comportamento do processo de emissão de saldo no processo de encerramento de conta o momento em que esse comportamento será incluído no comportamento do processo de encerramento de conta é definido da documentação desse caso de uso ou então por meio de um diagrama de interação como o diagrama de sequência por exemplo então
aqui eu estou dizendo que no momento que é solicitado o encerramento de conta a primeira coisa que o funcionário faz é verificar o saldo da conta para verificar se ele está positivo ou negativo ou se está zerado Então isto aqui corresponde a uma inclusão a uma associação de inclusão do diagrama de caso de uso então Normalmente quando eu tenho uma associação de inclusão no diagrama de caso de uso quando eu for modelar essas interações por meio de um diagrama de sequência por exemplo eu vou ter que um uso de interação Ok bom continuando Aqui nós
temos um outro diagrama de sequência é um fragmento de interação completa que que se refere ao processo de realizar saque então aqui eu tenho também quatro lifelines eu tenho uma lifeline do ator cliente eu tenho uma lifeline do da classe Deão realizar que é uma classe de Fronteira Como eu posso perceber pelo estereótipo Lembrando que estereótipos são uma forma de estender um determinado componente atribuindo-lhe características novas diferenciando dos seus iguais Ah aqui eu tenho uma lifeline da classe de controle realizar SAC que é um receb histerico de controle ou seja ela interpreta os eventos que
ocorrem sobre a visão e solicita a execução de métodos em classe de entidade se ela julgar isso necessário e aqui eu tenho uma lifeline de uma classe de entidade que no caso é a classe conta comum e recebeu o estereótipo entity então eu sei que ele é uma classe que contém a lógica de negócios relativo a esse trecho do do do problema H ela vai ter muitos objetos e que também esses projetos provavelmente deverão ser persistentes ou seja precisarão ser gravados em disco bom então o processo e de realizar saque ele se inicia com o
cliente informando o número da conta na visão a visão ela ela disp ela Repassa o número da conta pro para controladora a controladora solicita que a lifeline da classe conta comum eh consulte a conta recebendo com parâmetro o número o número da conta informada aqui no caso então é disparado o método consultar Conta Ah a lifeline conta como retorna verdadeiro significando que a conta existe a controladora Então pede que a a visão solicite a senha para o cliente o Cliente informa a senha a visão Repassa a senha paraa controladora a controladora então solicita que seja
executado o método validar senha na lifeline conta comum Após a execução desse método a conta comum retorna verdadeiro quer dizer que a senha é válida a controladora pede que a visão solicite o valor a ser sacado para o cliente o Cliente informa o valor a sacar o valor repassado paraa controladora a controladora dispara o método sacar valor passando com parâmetro o valor informado para a lifeline da classe conta comum e a classe contra comum retorna verdadeiro Aliás a lifeline da classe contra comum retorna verdadeiro notando que o método foi executado com sucesso que foi possível
sacar o valor e a controladora pede que a visão libere a quantia para o cliente a visão aqui pode estar representando por exemplo um caixa eletrônico Então agora vocês vão notar que depois da quantia ser liberada existe um ah uso de uso de interação ou também chamado de ocorrência de interação em versões anteriores onde eu faço referência ao processo de registrar movimento quer dizer que após ter sido sacado aquele valor é necessário registrar esse movimento realizado sobre a aquela conta comum Ah vocês vão perceber se nós voltarmos a examinar aquele diagrama de caso de uso
que o processo de realizar saque possui uma associação de inclusão com processo de registrar movimento então como eu falei numa inclusão uma Isso significa que o comportamento do caso de uso incluído deverá ser incluído no comportamento do caso de uso que inclui então aqui o comportamento do processo de registrar movimento deverá ser incluído no comportamento do processo de realizar saque isso é definido o momento dessa dessa inclusão de comportamento é definido nessa situação por meio desse diagrama de sequência então aqui eu fiz um uso de interação simplesmente quando se trata de inclusões eu simplesmente coloco
a a referência o uso de interação sobre as linhas de vida das lifelines envolvidas Bom agora vou falar sobre fragmentos combinados e operadores de interação Esse é um recurso que passou a existir a partir da umr 2 e resolver um problema que os diagramas de sequência tinham que era a de modelar situações como testes do Tipo C então ã laços operações atômicas processamentos paralelos sessões entre outras situações então Eh os fragmentos combinados eles permitem uma modelagem sem dependente uma vez que eles isolam aquele trecho do do diagrama para tratar essa situação específica nós vamos ver
como ao longo dessa aula Então primeiramente eu vou falar sobre o fragmento combinado do tipo Alt Alt é é abreviatura de alternatives ou seja alternativas ele define uma situação em que é necessário escolher entre dois ou mais comportamentos possíveis essa escolha ela é apoiada por meio de condições de guarda vamos ver um exemplo disso então Aqui nós temos uma continuação do processo de encerrar conta Ele ainda não está concluído mas após a emissão do saldo Eu tenho um fragmento combinado representando duas possíveis alternativas então aqui eu tenho fragmento combinado que é esse retângulo contendo esse
operador aqui chamado out que é abreviação de alternativos contendo dois operandos de interação são duas as duas situações possíveis esses operandos eles são divididos por essa linha tracejada que é chamada divisor de operando de interação e aqui eu tenho duas condições de guarda para cada operando de interação ten uma condição de guarda que é esse trecho entre colchetes então ah a primeira situação é se o saldo for positivo se o saldo for se o saldo da conta for positivo após a emissão do saldo eu vou descobrir os vou descobrir se o saldo da conta é
positivo ou negativo Então se o saldo for Positivo eu faço referência ao processo de realizar saque já se o saldo for negativo eu faço referência ao processo de realizar depósito então isso aqui um exemplo de fragmento combinado do tipo alternativos representando duas situações poderia ter mais situações nessa nesse neste exemplo temos apenas duas bom agora comparando com aquele mesmo modelo de caso de uso que eu já tinha mostrado anteriormente nós vamos ver que o processo de encerrar conta além de ter aquela Associação de inclusão com processo de de emissão de saldo ele também tinha uma
associação de extensão com os processos de realizar saque realizar depósito e gerenciar clientes uma associação de extensão é diferente de uma associação de inclusão no momento em que o comportamento estendido só estenderá o comportamento que estende se uma condição for satisfeita enquanto que a inclusão indica uma obrigatoriedade tem que incluir o comportamento a extensão não inclui se uma condição for satisfeita Então essa condição ela é demonstrada por meio do fragmento combinado tipo al que estabelece aqui se o saldo for positivo então estende o comportamento do processo encerrar conta por meio de do da execução do
processo realizar saque já se o saldo for negativo então estende o comportamento do processo encerrar conta por meio do comportamento do realizar depósito notem que a inclusão do comportamento do processo de emissão de saldo no processo de encerrar conta não precisou de nenhum fragmento simplesmente foi colocado sobre a lei de vida vai ser executado eh não existe opção de executar ou não será executado enquanto que que os processos de realizar saque e realizar depósito serão executados ou não dependendo se a condição for satisfeita Então isso é necessário por quê Porque para encerrar uma conta eu
preciso que o saldo esteja igual a zero esteja Zerado então tenho que saber se o saldo não esver zerado se ele for Positivo eu tenho que sacar o valor da conta antes de encerrá-lo já se o saldo for negativo antes de ser encerrado antes de ser encerrada A conta precisa receber um depósito bom então vocês vão notar que o diagrama de sequência do processo Serra conta ele ah obedece às associações que foram definidas no modelo de caso de uso agora nós vamos ver e um exemplo de fragmento combinado tipo opt opt abator de option opção
um fragmento combinado Tipo opt ele representa uma situação em que é feito um teste simples para ver se um comportamento ou com conjunto de operações poderá ser executado ou não diferente do alternativos não há Escolha entre mais de uma opção simplesmente tem uma opção única que poderá ser executada ou não se a condição for verdadeira então aqui nós continuamos com o processo de cerrar conta onde depois de determinar se o saldo era positivo ou negativo se verifica se aquela que está sendo encerrada é a única conta do cliente então tem um fragmento combinado tipo option
que é esse retângulo aqui e eu tenho uma condição de guarda se for a única conta eu faço referência ao processo de gerenciar clientes então novamente comparando com o modelo de caso de uso nós percebemos que o processo de encerrar conta ou seja o caso de uso encerrar a conta ele possui uma solação de extensão com o processo de gerenciar clientes quer dizer que se for a única conta daquele cliente ele tem que ser marcado como Inativo por isso que esta é uma situação de extensão porque uma condição precisa ser satisfeita Então essa condição aqui
é representada por um fragmento combinado tipo opt apoiado pela condição de guarda se for a única conta então Aqui nós temos o processo de encerrar conta completo O diagrama referente ao processo de encerrar conta completo é um fragmento de interação completo então vocês notem que só depois que foi emitido o saldo depois que Foi verificado se o salo é positivo ou negativo depois que Foi verificado se é a única conta do cliente então é que o processo de encerrar conta é executado realmente então após tudo isso o funcionário solicita o encerramento da conta esse na
visão a visão Repassa essa solicitação para o controle o controle solicita a execução do método encerrar conta na lifeline da classe conta especial ela retorna verdadeiro e aí então significa que foi possível encerrar a conta Lembrando que a conta não vai ser excluída apenas marcada como rrado aí a controladora ela pede que a visão ã mostra a mensagem de que a conta foi H encerrada com sucesso para o funcionário então mais um exemplo de diagrama de sequência apresentado aqui Ah nós temos ainda fragment latura de paralel que basicamente representa uma situação em que dois Sub
processos ocorrem ah concorrentemente em paralelo Aqui nós temos o exemplo de fragmento combinado tipo par onde eu estou identificando um diagrama de sequência chamado pesquisa de informações ele representa uma situação simplificada de uma pesquisa web onde além de retornar as informações relativas à pesquisa também são retornadas ofertas relacionadas a essa pesquisa então eu tenho cinco lifelines eu tenho uma lifeline do ator usuário eu tenho uma lifeline de uma classe divão Recebe founder como a gente pode ver aqui pelo símbolo utilizado eu tenho uma lifeline de controle que interpreta os eventos que ocorrem na visão e
eu tenho duas lifelines de entidade a lifeline informação e a lifeline oferta então a essas lifelines elas contém as que vão ser pesquisadas e as ofertas que podem estar disponíveis então aqui eu tenho um fragmento combinado este retângulo contendo o operador par de paralel ou seja paralelo que representa uma situação de paralelismo em que dois processos são executados concorrentemente então aqui Ah também esse fragmento ele possui uma divisão para identificar cada uma das cada um do processos e essa divisão também é apoiada por condição de guarda que são esses textos entre colchetes busca de informações
e busca de ofertas então a controladora ela ela recebe da visão que foi solicitada uma pesquisa então paralelamente ela solicita que a classe de entidade que a lifeline da classe entidade informação Execute o método pesquisar informação e ao mesmo tempo ela solicita que a lifeline da classe de oferta Execute o método pesquisar ofertas Então essas duas operações vão ser executadas concorrentemente E então a controladora ela vai obter as informações solicitadas pelo usuário e ofertas relacionadas à pesquisa que ele fez e vai apresentar as duas para usuário então isso aqui é um exemplo simples de fragmento
combinado do tipo para ã um outro tipo de operador é o operador loop que é a abreviatura de looping ou seja laço e como o nome diz né representa uma situação que pode se repetir várias vezes então Aqui nós temos um exemplo aqui nós estamos enfocando H um processo de atualizações de produto então Imaginem uma empresa que possui uma grande quantidade de produtos divididos em categorias e se deseja alterar o valor do produto o valor de todos os produtos de uma determinada categoria então aqui eu tenho C lifelines eu tenho uma lifeline do ator funcionário
uma lifeline da visão do processo de atualização de produtos uma lifeline da controladora do processo de atualização de produtos e uma lifeline da classe entidade categoria uma lifeline da classe entidade da classe da classe entidade produto então categoria contém as categorias de produtos que existem na empresa e os produtos informações dos produtos priamente inditos então o funcionário ele dispara uma mensagem solicitando a seleção de uma determinada categoria ah a categoria selecionada é repassada pra controladora a controladora consulta essa categoria eh solicitando que a lifeline da classe categoria Execute o método consultar categoria após isso o
funcionário ele dispara um evento informando o percentual de aumento ah da visão a visão Repassa o percentual de aumento para controladora e a controladora ela inicia um laço que é representado por esse retângulo contendo esse operador ã loop né e apoiado pela condição de guarda para cada produto Então dentro desse laço significa que esse processo vai ser executado várias vezes Enquanto essa condição for verdadeira enquanto a condição de que ainda existe são produtos para verdadeira então dentro desse laço é solicitado a execução do método atualizar valor do produto para a lifeline da da classe produto
Então isto aqui vai se repetir várias vezes até que todos os produtos sejam atualizados bom então isso aqui é exemplo de laço de um laço representado por um fragmento combinado tipo loop Ahã nós temos temos também fragmento combinado do tipo break break significa literalmente quebra e normalmente é utilizado para representar exceções então aqui dentro do mesmo exemplo de atualização de produtos dentro do laço de atualização se colocou um outro fragmento combinado tipo Break e se acrescentou uma outra Light line da classe de exceção essa Light Line ela não recebeu nenhum estereótipo Então ela Ela utiliza
o desenho de objeto padrão cont obviamente a sua linha de vida ã essa lifeline não recebeu estereótipo porque ela não é uma classe de entidade não é uma classe Deão não é uma classe controle ela está aqui para tratar exceções então aqui eu tenho fragmento combinado tipo Break e ele tem a condição se alguma exceção ocorrer Então deve ser disparado o método tratar exceção na lifeline da classe de exceção Então esse essa exceção será tratada e isso vai impedir que o laço seja interrompido então para isso que serve esse Break Ocorreu algum problema se trata
aquela exceção representado aqui por esse fragmento combinado do tipo Break e existe também o fragmento combinado do tipo Critical rion o Critical rion ele representa uma operação atômica ou seja uma situação que não pode ser interrompida ela precisa ser concluída até o final não pode haver interrupção então Aqui nós temos um fragmento combinado do tipo Critical do operador Critical que envolve o laço e o tratamento de exceção da atualização de produtos por que isso foi tratado com operação atômica porque imagine uma situação em que eu tenha uma categoria com centenas ou milhares de produtos se
durante a execução do laço ele for interrompido eu não tenho como saber até onde foi feita a atualização dos produtos isso pode me causar um grande problema então aqui o coloco um fragmento combinado tipo Critical indicando que a operação precisa ser concluída até o final ou então totalmente cancelada então h eu sei que esse laço não pode ser interrompido esse Break inclusive está aqui para impedir que haja uma interrupção se houver algum produto corrompido esse esse essa esse fragmento combinado ele representa o tratamento daa sessão para impedir que o laço eh sofra uma quebra então
depois da execução do laço se houver algum produto corrompido eh é gerado um um relatório de log dizendo olha tal produto não pode ser analizado por devido a determinado problema bom então isso aqui é um exemplo de fragmento combinado tipo pfal region representando operação atômica eu também eu também consigo perceber que eu posso colocar fragmentos combinados dentro de fragmentos combinados na na verdade existem outros fragmentos combinados aind mas esses são os que eu considero mais importantes mas se vocês pesquisarem vocês vão encontrar outros tipos de fragmentos combinados bom então é isso nós concluímos a aula
de hoje eu espero que ela tenha sido útil se vocês gostaram dessa aula eu peço que vocês curtem e compartilhem comentem eu agradeço a atenção de todos e nós nos vemos novamente na no pros vos nas prossim