Oi gente! O bom desenvolvedor de software deve se preocupar com a arquitetura do software que ele está criando. Quando você desenvolve programa você deve pensar quais são os elementos que compõem esse software, e como eles se interrelacionam. Porque a arquitetura de softwares se refere então aos principais elementos que compõem determinado sistema de software, e os inter-relacionamentos entre esses componentes. Quando a gente está desenvolvendo software a gente muitas vezes fala modelar determinado conceito ou determinar, modelar algo que existe no mundo real para software. O que é modelar? O que é modelagem orientada objetos. Modelo é uma representação simplificada de alguma coisa que elimina características consideradas menos importantes e foca naquilo que é mais importante mais útil para a gente. Então, o que a gente vai fazer? A gente vai abstrair, ou seja simplificar, remover coisas menos importantes para se concentrar naquilo que mais importante para o desenvolvimento do software que a gente está fazendo. E como que a gente pode capturar, ou registrar determinado modelo? E é o que a gente vai ver na aula de hoje. A gente vai ver UML que é uma linguagem de modelagem orientada a objetos. UML significa Unified Modelling Language e UML é uma linguagem padrão que é utilizada hoje dia no mundo inteiro para fazer o que? Para visualizar software orientado a objetos. A gente vai ver que gente pode desenhar quais são os principais elementos de sistema de software usando essa linguagem, uma linguagem gráfica, visual. De uma forma muito boa a gente vai poder visualizar sistemas de software. Arquiteturas de sistemais de software. Mas elas não servem só para visualizar a gente pode especificar. Se a gente quer por exemplo contratar alguém para desenvolver determinado software e a gente já tem uma ideia de quais são os principais elementos do domínio ou do próprio software que a gente vai construir a gente pode usar essa linguagem o UML para especificar como a gente quer que o sistema seja feito. Ele serve também para documentar. Se você fez, desenvolveu determinado sistema e vai entregar esse sistema para cliente ou para outro desenvolvedor para parceiro seu você pode usar a linguagem UML para explicar os principais elementos desse sistema. Além disso a gente pode na verdade até construir novos sistemas usando o UML. Hoje dia existem ferramentas que a partir do diagrama UML, da imagem UML, ele gera altomaticamento código fonte numa linguagem de programação que você escolha. E também tem o oposto, por exemplo no ambiente Eclipse você pode pegar sistema Java que você implementou com as várias classes e tem alguns plugins que geram diagrama UML a partir do código fonte que você gerou. O legal desses diagramas UML é como uma forma de comunicação rápida. A gente bate o olho diagrama e a gente já tem uma visão geral de como o sistema funciona, e portanto isso pode ser usado entre desenvolvedores para discutir, refletir sobre determinado sistema sobre a arquitetura de determinado sistema. Eu gosto de quando eu estou trabalhando uma equipe de ter quadro branco com uma canetinha onde a gente discute diferentes arquiteturas por exemplo. Então, a gente vai quadro branco e desenha lá diferentes pedaços do sistema usando o UML. Então, é uma ferramenta muito útil para comunicação e para reflexão sobre a arquitetura de software orientada a objetos. Vamos ver então, como que é essa linguagem padrão. Coisa mais simples que você pode desenhar é uma classe e o UML a gente vai ver tem vários tipos de diagramas diferentes. A gente vai ser concentrar nesse curso no diagrama de classes, e é o que eu vou falar hoje para vocês sobre o diagrama de classes que vai ser bastante útil para a gente. Tem outros tipos de diagramas que eu vou falar no finalzinho. Então, o jeito mais simples de representar uma classe é simplesmente ter retângulo e o nome da classe. Isso aqui já é uma classe. É jeito de representar uma classe sistema de classes de UML. Se você quiser, você pode ter esse jeito aqui mais completo onde além do nome da classe você coloca aqui os atributos. As propriedades de uma determinada classe. Opcionalmente, você também pode colocar também as operações, os métodos dessa classe. Tem ainda uma quarta coisa que você pode colocar mais claro que são as responsabilidades. Normalmente a gente vai ver, ou essa forma bem simples que é simplesmente o nome da classe, ou a classe atributos de operações. Aí fica ou a critério de você que como desenvolvedor ou como nesse caso como arquiteto de software, definir que que você vai, que nível de detalhamento que você vai colocar. Você não quer colocar detalhe demais, porque daí seu diagrama vai ficar poluído com muita coisa, mas também você não quer colocar detalhe de menos,. então você vai escolher qual é nível bom de infirmação que você vai querer colocar no seu documento, então o diagrama é de classes vai ter esses três componentes, e se você quiser detalhar ainda mais para cada dos atributos você pode dizer se é atributo público com sinalzinho de mais (+) ou atributo privado, sinalzinho de menos (-). É a mesma coisa para os métodos, e também tem essa opção aqui protegido, Protected. Geral Protected significa que nesse caso esse método ele só pode ser acessado pela própria classe, ou pela sua subclasse. Privado quer dizer que só pode ser acessado pela sua própria classe e público quer dizer que pode ser acessado por qualquer. É isso aqui é só se você for detalhar bastante. É você que vai escolher se você quer entrar nesse nível de detalhes ou não. O que mais a gente pode ter diagrama de classes? A gente pode ter associações entre classes. Então, aqui tem pequeno modelo. Isso aqui é uma pequena arquitetura de software para representar as pessoas de uma determinada empresa. Então, o que está dizendo esse modelo? Que eu tenho duas classes, uma chama Pessoas e outra chama Empresas. O que mais que diz? Essa linha aqui representa uma associação. Está dizendo que existe uma associação entre essa pessoa e essa empresa. Dai numa linguagem de pronação você vai implementar essa associação de diferentes formas. Por exemplo uma referencia. Uma peça, como se fosse apontador na linguagem C, uma referência numa linguagem Java numa linguagem Python aqui a gente vê por exemplo que tem esses números. O que que é isso? É a multiplicidade da associação. Então, está dizendo que uma pessoa está associada a uma ou duas empresas. Isso aqui quer dizer 1.2 Então, nesse meu contexto aqui uma pessoa pode ser está uma empresa, pode estar duas empresas. Não pode estar nenhuma empresa, nem mais que duas empresas neste meu modelo. E aqui está dizendo que uma empresa pode estar associada a ela uma ou mais. 1..* significa entre e infinito, uma ou mais pessoas estão associadas aquela empresa. Então, se meu modelo proíbe pessoas com zero empresas com zero pessoas por exemplo. Fora zero pode ser qualquer número inteiro de pessoas. E tem isso aqui que é o papel dessa classe nesta relação. Então, esta pessoa tem o papel de empregado na relação com a empresa e já esta empresa tem o papel de empregador dessa pessoa. Se fosse implementar essa aqui numa linguagem meta objetos uma pessoa como ela tem uma ou duas empresas eu provavelmente teria dois atributos na classe pessoas. Empresa 1 e Empresa 2. Que seria uma referencia do tipo empresa. Já empresa tem uma ou mais pessoas então não seria atributo para cada pessoa, seria provavelmente uma lista de pessoas. Array ou vetor. Dependendo da sua linguagem de pronação você vai escolher jeito e representar uma lista de pessoas. E você colocaria então atributo na empresa que seria uma lista de pessoas. Continuando aqui, pode ser que eu queira detalhar mais a relação entre pessoa e empresa. Então, poderia ter uma terceira classe aqui só para detalhar este relacionamento. Então nesse caso seria ter uma classe emprego que teria a descrição do emprego a data de contratação, salário e assim por diante. Herança, como a gente viu Herança é uma coisa fundamental orientação de objetos e UML representa Herança com uma flechinha assim da subclasse para a superclasse com triângulo assim aberto, assim, vazio perto da superclasse. Então, esse é modelo aqui que diz que na minha empresa por exemplo eu tenho cliente e tenho tipo específico de cliente, que é o cliente preferencial. Então o cliente preferencial é uma subclasse que herda de cliente assim com características de cliente mas acrescenta algo novo para refletir aqui que ele é cliente preferencial. Então, é jeito de representar Herança. Particular, você pode ter uma superclasse que tem várias subclasses e daí você faz triângulo e ele se ramifica para as subclasses. Então aqui nessa minha empresa eu tenho, algo que chama Venda, cada vez que a empresa faz uma Venda eu gero uma Venda mas tem três tipos específicos de Venda. Venda por Cartão, Venda via Pix ou Venda por Dinheiro. Então essa aqui é a herança. Então, a gente diz que venda é uma generalização desses três tipos específicos aqui de venda. e a gente pode dizer que esses três tipos são uma especificação, especialização realização da venda genérica. Tá bom? O que mais que a gente pode fazer no diagrama de classes? A gente pode ter uma agregação. Uma agregação significa que uma classe possui uma ou mais coisas dentro dela. Ela é proprietária de uma ou mais coisas. Então, aqui eu estou dizendo, por exemplo, instituto de uma universidade é composto por, essa estrela significa 0 ou mais, 0 ou mais departamentos. Então, o instituto onde eu trabalho tem quatro departamentos diferentes. E aqui está dizendo que cada departamento tem único instituto, por isso, há esse único número aqui. Então, essa é a agregação. A gente poderia mostrar outro tipo de agregação. A gente poderia dizer que carro é uma agregação de quatro rodas, porque carro tem quatro rodas. Agora tem tipo específico de agregação que é a composição. A composição, o símbolo é o mesmo, que é esse diamantezinho aqui, esse losango, só que é losango cheio. Na agregação simples, é losango vazio. Qual a diferença da composição? Então, aqui, pensando sistema de janelas de computador, de uma interface gráfica de computador. Tem a classe 'window', que representa uma janela, lá no meu sistema de janelas, e dentro dessa 'window' tem várias quadras, vários 'frames'. Então, 'window' é uma agregação de frames. A diferença é que uma composição quem está aqui embaixo, aqui a gente chama de todo e aqui a parte. Essas partes do todo não fazem sentido, elas existirem sem a parte de cima, sem o todo. Então, quando eu fecho a janela, sistema de janelas, todos os frames que estão lá dentro são removidos. A janela que eu fechei é removida, é apagada, e tudo que está dentro dela é apagada também. Então, tipicamente, uma composição, quando você remove, deleta do sistema a classe de cima, todas as classes de baixo são também removidas. Já na agregação, não necessariamente. Na agregação, por exemplo, carro que tem quatro rodas; eu posso destruir aquele carro e ainda usar as rodas. Eu posso pegar a roda e usar carro diferente. Eu posso usar a roda e usar como brinquedo, dar para uma criança brincar com a roda. Posso reciclar a roda. Então, carro e rodas, a gente pode dizer que é uma agregação que, não necessariamente, é uma composição, porque as rodas sobrevivem, conseguem ter uma vida própria independente do carro. Sobre os tipos de relações que nós temos então. Nós temos associação, que é o tipo mais simples. Na associação, se ela tem uma flecha, aí normalmente a gente está querendo dizer que quem está do esquerdo tem uma referência para quem está do lado direito. Mas não, necessariamente, vice e versa. Quem está do lado direito não tem uma referência. Se a gente não tem a flecha, aí, tipicamente, ou não interessa muito, ou, os dois, tem uma relação, uma referência para o outro. Herança, a gente já viu, que é esse triângulo aqui, uma flecha do tipo triângulo. Tem aqui esse tipo 'Realização/implementação'. Isso normalmente é quando você está querendo dizer que uma classe implementa uma determinada interface. Daí você usa esse tipo de flecha para dizer que uma classe está implementando uma interface. 'Dependência' é uma relação que existe uma dependência entre uma classe e outra classe do sistema. Então, dependência é conceito lógico, não necessariamente na linguagem de programação vá ter alguma coisa para essa dependência. Simplesmente, você está querendo dizer que pedaço do sistema depende de outro. Agregação, a gente já viu. É esse losango, diamante aqui aberto. E composição é diamante pintado. É uma figura que eu peguei lá da 'wikipedia'. Os tipos de relações diagrama de classes UML. Então, esse aqui é exemplo de típico sistema que você vai encontrar mundo afora codificado UML. Então, o que se está dizendo aqui? Esse aqui é sistema. Eu dei uma olhada e já dá para perceber que, mais ou menos, é sistema, por exemplo, para uma livraria on-line que vende livros on-line. Como é isso aqui? Tem livro. Está dizendo que o livro é associado a uma editora e ele também é associado a autor, ou vários autores. Não colocou a multiplicidade aqui. Quem desenhou o diagrama optou por não colocar a multiplicidade. E na relação entre o autor e o livro tem uma outra classe que define o papel. Talvez o autor possa ser quem escreveu o livro, pode ser alguém que traduziu o livro, ou pode ser organizador que fez uma coletânea de artigos. Então, tem diferentes papéis ali. Pode ser primeiro autor, segundo autor, terceiro autor e assim por diante. Além disso, os livros têm avaliações que são escritas por avaliador. O avaliador escreve uma avaliação. E daí, usando herança, tem dois tipos de avaliação. A avaliação de determinado cliente, que ele dá nota e pode calcular a média. Ou uma avaliação editorial; talvez é o editor que dá a avaliação de livro. Além disso, a gente tem pedido. Pedido é uma agregação de livros. E o pedido tem informação de envio que está associado a uma transportadora. Pedido, também, tem uma agregação de informações de cobrança, provavelmente para o cliente pagar. E essas informações de cobrança estão associadas a uma conta. E aqui a gente tem uma classe cliente, que tanto está associado com a avaliação do cliente, dos livros, quanto com a conta. Então, isso aqui é simplesmente uma possível representação de sistema de uma livraria on-line. Mais para frente eu irei gravar outro vídeo com vários exemplos de diagramas UML. Nesse curso a gente vai usar coisas desse tipo. E vamos ter exercício para vocês fazerem diagrama desse tipo também. Outros diagramas UML úteis que a gente não vai ver, mas você pode estudar se você quiser. Tem duas famílias principais de diagramas UML. Os diagramas estruturais que falam sobre a estrutura do sistema. É uma estrutura mais estática do sistema. E diagramas comportamentais que falam mais sobre a dinâmica. Como o sistema se comporta quando ele esta sendo executado. Os diagramas estruturais, tem o diagrama de classes que a gente viu aqui. E se você quiser estudar, outros diagramas que eu recomendo que são úteis são diagramas de objetos que mostram relação entre as instâncias tempo de execução. Diagrama de componentes. Isso é para sistemas de grande porte que têm vários componentes, onde cada componente tem várias classes lá dentro. E diagramas de implantação, que dizem como você implanta sistema na internet, ou 'cluster' de computador, descreve essa forma de implantar sistema. Nos diagramas comportamentais, eu diria que o mais útil é o diagrama de sequência, que mostra a sequência de chamadas de métodos de objeto para o outro. Tem o diagrama de atividades que mostra uma sequência de atividades que você deve fazer determinado sistema. E uma máquina de estados, que é uma coisa bem comum e que existe há decadas na engenharia, na ciência da computação, para representar diferentes estados do sistema; e transições entre os estados, e quais são as características de cada estado. Então, esses aqui, eu diria que são os diagramas UML mais úteis. Tem outros também, que talvez eu não esteja sendo justo com algum outro, porque tem vários outros diagramas UML. Mas nesse curso a gente vai se concentrar mais no diagramas de classes mesmo. Se você quiser aprender muito mais sobre o UML, primeiro, tem vários sites na web que têm tutoriais, informações e documentação sobre os diagramas UML; tanto diagrama de classes quanto os outros. Se você quiser comprar livro bom, eu recomendo esse "UML2 Uma abordagem prática", do Gilleanes Guedes, que tem uma série de exemplos muito bons e é livro muito didático. Eu achei bastante interessante, de autor brasileiro. Vale a pena a gente prestigiar. Então, é isso.