Prévia do material em texto
5 - Padrões de Projeto Padrões de projeto (Design Patterns) de software são frequentemente usados para resolver um problema comum, por meio de uma abordagem genérica para esse problema. O padrão de projeto fornece um modelo conceitual de uma solução de melhores práticas, que por sua vez é utilizada pelos desenvolvedores para criar uma implementação concreta para seu problema específico. O uso de tais padrões de projeto tem várias vantagens importantes. Em primeiro lugar, o padrão fornece uma orientação para as melhores práticas. Em segundo lugar, o uso do padrão fornece aos desenvolvedores um vocabulário compartilhado que permite que eles comuniquem conceitos de design complexos de maneira fácil e clara. A maioria dos padrões de projeto de software não inclui princípios de segurança como parte da solução genérica para o problema comum. Isso ocorre porque durante o desenvolvimento de software, a segurança é frequentemente tratada como um complemento. Isso significa que as considerações de segurança não são necessariamente vistas como parte integrante da solução geral e podem até ser deixadas de fora de um design. Analise a imagem Observe o diálogo no recurso abaixo. Note que o profissional que está em pé, sugere que o código do programa seja alterado, porém, mantendo a sua base original. Como é possível? A resposta é: utlizando padrões de projeto. Os padrões de projeto (design patterns) foram criados para poderem servir de base para que novos desenvolvimento possam ser criados, sem alterar o código original. · · · · · · · Ao final deste conteúdo, você será capaz de: · compreender os diferentes tipos de padrões de projetos de software. · criar soluções com os principais padrões de projeto e boas práticas de arquitetura de software. · identificar o diferencial de uma solução que utiliza padrões de projetos. Definindo padrões de projeto de software Um padrão de projeto, normalmente, é definido como uma solução reutilizável para um problema comum dentro de um determinado contexto no projeto de software. Mas essa solução não vem na forma de um atalho 'tamanho único' que pode ser introduzido diretamente em seu código. Em vez disso, é um modelo ou modelo de como resolver um problema - um que comprovadamente funciona - que pode ser personalizado e aplicado em muitas situações diferentes (PRESSMAN, 2021). Atenção! Por que os padrões de projeto são úteis para desenvolvedores? Em primeiro lugar, porque eles economizam tempo. Não há necessidade de gastar um recurso precioso (seu tempo) para encontrar uma nova solução para um problema quando já existem métodos testados e comprovados. Ao fornecer uma 'linguagem' universal para conceituar problemas recorrentes, os padrões também podem economizar tempo ao se comunicar com outros desenvolvedores. Se você disser que construiu algo usando um 'padrão único' (veja abaixo), os outros saberão o que você quer dizer. Como eles já estão bem refinados, os padrões de design também podem ajudar a manter o código simples e elegante, facilitando o entendimento de outras pessoas. Além disso, mesmo que você nunca os use, aprender padroões de projetos, também conhecidos por padrões de design ensinará como resolver todos os tipos de problemas usando os princípios do design orientado a objetos (OOD). Tipos de padrões de design Em 1994, Erich Gamma, John Vlissides, Ralph Johnson e Richard Helm – a chamada “Gang of Four” representada pela sigla GOF – identificaram 23 padrões de projeto em seu livro intitulado “Design Patterns: Elements of Reusable Object-Oriented Software”. Esses padrões comuns - um ponto de partida útil para qualquer desenvolvedor - foram agrupados em três categorias principais, com base em sua finalidade: *Clique nas abas para interagir com o conteúdo.* Recurso lista interativa: · Padrão de criação · Fornecem mecanismos de criação de objetos que podem criar objetos de maneira controlada e adequada à situação. Dessa forma, eles ajudam a reduzir complexidades e instabilidades, além de oferecer maior flexibilidade e permitir a reutilização de código. Os principais exemplos de padrões incluem: singleton (único), factory (fábrica) e constructor (construtor). · Padrão estrutural Explicam como montar objetos e classes em estruturas maiores, mantendo essas estruturas flexíveis e eficientes. Eles fornecem uma maneira de definir relacionamentos entre os componentes de um aplicativo e são particularmente úteis em sistemas maiores. Exemplos incluem adapter (adaptador), decorator (decorador) e facade (fachada). · Padrão comportamental Cuida da comunicação eficaz entre os componentes. Esse padrão está preocupado com a interação entre os objetos, bem como a atribuição de responsabilidades. O objetivo é tornar esses processos tão simples e compreensíveis quanto possível. Exemplos incluem o observer (observador), chain of responsability (cadeia de responsabilidade) e strategy (estratégia). Mais recentemente, os desenvolvedores têm buscado novos padrões apropriados para sistemas distribuídos, como a arquitetura de microsserviços cada vez mais popular. Essas novas estruturas deram origem a novos problemas recorrentes e suas correspondentes soluções de melhores práticas. Aprofundando nos padrões populares Trabalhando em componentes de software simples ou estruturas arquitetônicas complexas, é provável que a pessoa encontre e use padrões de design de software. Já foi explorado o conceito de padrões de projeto: eles são essencialmente uma solução reutilizável para um problema comum dentro de um determinado contexto no projeto de software. Deve-se pensar neles como um modelo ou receita de como resolver um problema. Isso significa que diferentes tipos de padrões de projeto podem ser facilmente personalizados para serem aplicados em diferentes contextos e situações. Estudo Guiado Leia da página 443 a 450 do livro Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e desenvolvimento interativo Clique no link e leia o livro LARMAN, Craig. Utilizando UML e padrões. Porto Alegre: Grupo A, 2011. E-book. ISBN 9788577800476. Disponível em: https://integrada.minhabiblioteca.com.br/#/books/9788577800476/. Acesso em: 29 ago. 2024. Padrões de design são grandes poupadores de tempo para desenvolvedores de software. Afinal, não há necessidade de criar uma solução do zero quando já existe uma que foi testada exaustivamente e comprovadamente funciona. Além disso, como esses padrões são recorrentes, eles se tornam facilmente identificáveis e tornam mais fácil para outros desenvolvedores entenderem o que está acontecendo no código de outra pessoa. Como os padrões foram ajustados ao longo do tempo, eles também, provavelmente, tornarão o código mais elegante e conciso. Observe que, para perceber os benefícios dos padrões de projeto de software, você precisa saber quais estão disponíveis, porque são úteis e quando são adequados na prática. Antes de olhar para os tipos mais populares de padrões de design disponíveis hoje, é crucial lembrar que eles não são atalhos para serem copiados sem pensar em seu código. Nem devem ser vistos como substitutos para a solução de problemas na engenharia de software. Com isso entendido, vamos conhecer os padrões de projeto mais comuns. Como apresentado, os tipos de padrões de design costumam ser divididos em três grandes categorias: criacional, estrutural e comportamental. Padrões criacionais Esses padrões de projeto de software, oferecem diversas alternativas de criação de objetos, o que aumenta a flexibilidade e a reutilização de código. Singleton Um padrão de design simples, mas poderoso, que limita uma classe a uma única instância, enquanto fornece acesso global a essa instância. Uma analogia comum na vida real é a de uma impressora de escritório sendo compartilhada por vários funcionários. Uma única instância da impressora que todos podem acessar é mais útil do que criar novas instâncias para cada pessoa que deseja imprimir um documento. Factory Este padrão é para a produção em massa de objetos, sem especificar sua classeexata - um pouco como uma fábrica do mundo real produzindo mercadorias em escala. No método de fábrica, as subclasses são normalmente responsáveis por criar a instância específica da classe. É útil quando não se sabe de antemão as especificidades e dependências exatas dos objetos com os quais seu código trabalhará. Figura 1 | Fábrica Considere uma fábrica de sorvete - primeiro você precisa da funcionalidade comum para fazer sorvete e, em seguida, pode adicionar especificações para diferentes sabores. O método de fábrica permite a fácil adição de subclasses para determinar novas instâncias. Constructor Este padrão é frequentemente usado para simplificar a construção de objetos complexos ou compostos, com uma abordagem passo a passo. Uma maneira de pensar nisso é como fazer uma pizza - você começa com a base, depois adiciona molho, queijo e uma variedade de coberturas. Em cada etapa, há variáveis a serem consideradas: a espessura da massa, a quantidade de molho e a combinação de coberturas. O padrão construtor organiza cada uma dessas etapas simples para entregar o produto final, com a capacidade de construir diferentes representações do objeto, ou seja, diferentes "tipos de pizza". Assista aos vídeos a seguir, para conhecer mais sobre padrões de projetos Videoaula · · · · · · · Videoaula Padrões estruturais Esses padrões de projeto de software estão preocupados com a montagem de objetos e classes em estruturas maiores, mantendo essas estruturas flexíveis e eficientes. Eles fornecem uma maneira de definir relacionamentos entre os componentes de um aplicativo e são particularmente úteis em sistemas maiores. Adapter Funciona como uma ponte entre duas interfaces incompatíveis. Pense em um intérprete sentado entre duas pessoas conversando em idiomas diferentes (um problema comum em programação!), ou um simples adaptador de tomada que permite carregar seu telefone americano em qualquer país. Ao permitir que os objetos se comuniquem de uma maneira que ambos entendam, o padrão do adaptador combina a capacidade de duas interfaces independentes. Decorator Este padrão permite que a funcionalidade seja adicionada a um objeto individual sem alterar sua estrutura básica. Em outras palavras, ele é usado para adicionar uma interface aprimorada ao objeto existente - como adicionar luzes e enfeites a uma árvore de Natal ou glacê e polvilhar a um donut. Ele permite que os desenvolvedores adicionem comportamentos e recursos a objetos sem alterar o código-fonte. É necessário, apenas, tomar cuidado ao adicionar muitas camadas e complexidades ao objeto original. Facade Como o nome sugere, este padrão esconde as complexidades de um sistema do cliente, fornecendo uma interface simples e atraente. A principal vantagem para os desenvolvedores é tornar as bibliotecas ou estruturas de software complexas mais fáceis de entender e acessar. Ele também pode isolar o código 'externo' dos sistemas internos complexos. Trabalhando com padrões de design Saber quais padrões estão disponíveis e quando aplicá-los em uma situação específica é fundamental para usá-los de forma eficaz. Lembre-se de que esses padrões não fornecem a solução em si, mas podem orientá-lo e inspirá-lo a encontrar a melhor solução para o problema que está enfrentando. Estudo Guiado Leia da página 453 a 454 do livro Utilizando UML e padrões: uma introdução à análise e ao projeto orientados a objetos e desenvolvimento interativo Clique no link e leia o livro LARMAN, Craig. Utilizando UML e padrões. Porto Alegre: Grupo A, 2011. E-book. ISBN 9788577800476. Disponível em: https://integrada.minhabiblioteca.com.br/#/books/9788577800476/. Acesso em: 29 ago. 2024. Os padrões de nível mais baixo são conhecidos como expressões idiomáticas - eles normalmente descrevem como implementar aspectos específicos de componentes ou o relacionamento entre eles, dentro da estrutura de apenas uma linguagem de programação, por exemplo, escrever um loop infinito. Outra maneira de pensar em expressões idiomáticas é como realizar o uso correto ou elegante de uma linguagem de programação. Se você domina o vocabulário francês, mas ainda constrói frases no estilo inglês, não estará usando o idioma de maneira ideal. A mesma lógica se aplica se você estiver trabalhando com C++ e Python. Programar idiomaticamente é a chave para tornar o código mais legível e acessível para outras pessoas. Na outra extremidade do espectro estão os padrões de arquitetura, que orientam o desenvolvimento de um aplicativo inteiro. Novamente, o propósito básico é o mesmo: reutilizar e adaptar padrões básicos de design - ou, nesse caso, uma sequência deles - que comprovadamente funcionam, ao invés de tentar reinventar a roda toda vez que você inicia um novo projeto de software. O termo, às vezes, é usado de forma intercambiável com estilo de arquitetura e, mesmo com sobreposições, a principal diferença é que um padrão visa resolver um problema recorrente, pois um estilo não precisa necessariamente resolver nada. Exemplos comuns de padrões de arquitetura incluem Microkernel, Microservices e Camadas. Geralmente, as decisões sobre a arquitetura de software são feitas no início de um projeto e influenciam tudo, desde o desempenho até a segurança e a escalabilidade. Entender quais padrões de arquitetura são mais adequados para um determinado requisito de negócios - bem como aplicá-los e personalizá-los para a situação específica em questão - é, portanto, crucial para o desenvolvimento de software bem-sucedido. Embora estejam em uma parte vital do kit de ferramentas de qualquer desenvolvedor, é importante lembrar que os padrões de projeto não substituem recursos genuínos de solução de problemas no desenvolvimento de software. Aprender os padrões mais comuns é uma obrigação, mas é preciso, ainda, descobrir qual padrão usar e como adaptá-lo para resolver o problema específico. Então, se a pessoa está tentando ajustar um problema para se adequar a um padrão de projeto específico que acabou de aprender e está ansiosa para experimentar, provavelmente está no caminho errado. Chegamos ao fim deste conteúdo! Confira a seguir, uma breve síntese sobre o que estudamos aqui. image3.jpeg image1.jpeg image2.png