terça-feira, 31 de outubro de 2023

Design Patterns - Padrões Comportamentais - Iterator

O padrão de design Iterator (Iterador) é um padrão comportamental que fornece uma maneira eficiente de acessar sequencialmente os elementos de uma coleção sem expor a complexidade subjacente da estrutura de dados. Ele permite que você percorra uma coleção de objetos sem precisar entender como essa coleção é realmente implementada.

O padrão Iterator é composto por vários elementos:

  1. Iterador (Iterator): Define uma interface para acessar e percorrer os elementos de uma coleção. O iterador mantém uma posição na coleção e fornece métodos como next(), hasNext(), first(), etc.

  2. Coleção (Collection): Define uma interface para criar um objeto iterador. Qualquer classe que implementa essa interface deve fornecer um método para criar um objeto iterador que percorrerá os elementos da coleção.

  3. Iterador Concreto (Concrete Iterator): Implementa a interface do iterador e é responsável por rastrear a posição atual dentro da coleção e implementar operações de navegação, como next(), hasNext(), etc.

  4. Coleção Concreta (Concrete Collection): Implementa a interface da coleção e cria um objeto iterador que pode ser usado para percorrer os elementos da coleção.

Ao utilizar o padrão Iterator, os clientes podem percorrer uma coleção de objetos sem precisar conhecer a estrutura interna dessa coleção. Isso promove o princípio de encapsulamento, já que a coleção pode alterar sua estrutura interna sem afetar o código do cliente que a percorre.

Além disso, o padrão Iterator permite que várias iterações ocorram simultaneamente sobre a mesma coleção, já que cada iterador mantém seu próprio estado de iteração. Isso proporciona uma maneira eficiente de trabalhar com coleções de dados grandes ou complexas.

Em resumo, o padrão Iterator oferece uma maneira flexível e padronizada de acessar elementos de uma coleção sem expor sua estrutura interna, melhorando assim a modularidade e a flexibilidade do código.

segunda-feira, 30 de outubro de 2023

Design Patterns - Padrões Comportamentais - Interpreter

O padrão de design Interpreter, ou Intérprete em português, é um padrão comportamental que define uma gramática para uma linguagem e fornece um interprete para interpretar sentenças dessa linguagem. Ele é útil quando você precisa interpretar expressões complexas ou realizar operações em uma linguagem específica. O padrão Interpreter é composto por alguns elementos principais:

  1. Context (Contexto): Mantém as informações globais que são compartilhadas por todas as expressões da linguagem.

  2. AbstractExpression (Expressão Abstrata): É uma interface ou uma classe abstrata que define uma operação interpret() que é comum a todas as classes concretas de expressões.

  3. TerminalExpression (Expressão Terminal): Implementa a interface AbstractExpression e representa um terminal na gramática da linguagem. Um terminal é um elemento indivisível na expressão. Por exemplo, em uma linguagem que interpreta expressões matemáticas, um número ou uma variável pode ser um terminal.

  4. NonterminalExpression (Expressão Não Terminal): Também implementa a interface AbstractExpression e representa uma expressão composta por subexpressões. Um não terminal é uma expressão que pode ter subexpressões. Por exemplo, em uma expressão matemática, uma operação de adição pode ser uma expressão não terminal que tem duas subexpressões, uma para o operando da esquerda e outra para o operando da direita.

  5. Client (Cliente): Constrói a árvore de sintaxe abstrata (AST) usando objetos TerminalExpression e NonterminalExpression e chama a operação interpret() para realizar a interpretação.

O padrão Interpreter é útil em situações onde você precisa interpretar uma linguagem ou expressões complexas, como interpretadores de linguagens de programação, sistemas de consulta de banco de dados, compiladores, etc. Ele encapsula a lógica de interpretação em classes específicas, tornando mais fácil adicionar novas regras ou expressões à linguagem sem alterar o código do cliente.

sábado, 21 de outubro de 2023

Design Patterns - Padrões Comportamentais - Command Pattern

O Command Pattern (Padrão Comando) é um padrão de design comportamental que transforma solicitações ou operações em objetos independentes. Ele encapsula uma solicitação como um objeto, permitindo parametrizar clientes com operações, enfileirar solicitações, além de suportar operações que podem ser desfeitas.

Componentes Chave:

  1. Command (Comando): Define uma interface para executar uma ação específica. Geralmente, contém um método execute() que é chamado para realizar a operação associada.

  2. ConcreteCommand (Comando Concreto): Implementa a interface de comando e define a relação entre um objeto receptor e uma ação. Ele invoca métodos do objeto receptor para realizar a ação.

  3. Invoker (Invocador): Solicita que um comando seja executado. Geralmente, mantém uma lista de comandos e pode executar ou enfileirá-los.

  4. Receiver (Receptor): Sabe como realizar a operação associada ao comando. É o objeto que recebe a solicitação do comando.

  5. Client (Cliente): Cria um objeto de comando e associa-o com seu objeto receptor. O cliente também pode configurar o invocador com o comando.

Benefícios:

  1. Desacoplamento: O remetente não precisa conhecer os detalhes do receptor ou da operação sendo executada, promovendo baixo acoplamento.

  2. Enfileiramento e Log: Os comandos podem ser enfileirados, desfeitos e até mesmo registrados para fins de log, fornecendo um controle preciso sobre as ações do sistema.

  3. Flexibilidade: Novos comandos podem ser adicionados sem modificar o código existente, tornando o sistema mais flexível e fácil de estender.

Exemplo Prático:

Considere um controle remoto. Cada botão do controle remoto é um comando que executa uma operação específica em um dispositivo eletrônico (como ligar/desligar uma TV ou ajustar o volume). Cada botão é configurado com um comando específico (ConcreteCommand), que, quando pressionado, executa a operação apropriada no dispositivo (Receptor). O Invocador (o controle remoto) simplesmente aciona o comando associado ao botão pressionado.

Em resumo, o padrão Command é útil quando você precisa desacoplar remetentes de receptores, enfileirar solicitações, ou fornecer suporte a operações que podem ser desfeitas. Ele facilita a manipulação de ações complexas, adicionando uma camada de abstração entre os objetos do sistema.

sexta-feira, 20 de outubro de 2023

Design Patterns - Padrões Comportamentais - Chain of Responsibility Pattern

O Chain of Responsibility Pattern (Padrão Corrente de Responsabilidade) é um padrão de design comportamental que permite passar solicitações ao longo de uma cadeia de manipuladores. Cada manipulador decide, com base na sua lógica, se processa a solicitação ou a passa para o próximo manipulador na cadeia.

Componentes Chave:

  1. Handler (Manipulador): Define uma interface para lidar com solicitações. Implementações concretas decidem se processam a solicitação e/ou passam a solicitação para o próximo manipulador na cadeia.

  2. ConcreteHandler (Manipulador Concreto): Implementa a interface do manipulador. Cada manipulador decide se processa a solicitação ou a passa para o próximo manipulador na cadeia.

Benefícios:

  1. Desacoplamento: O remetente da solicitação não precisa saber qual objeto está lidando com a solicitação, resultando em um baixo acoplamento entre os objetos.

  2. Flexibilidade: Você pode adicionar ou remover manipuladores da cadeia sem alterar o código do cliente.

  3. Reusabilidade: Os manipuladores podem ser reutilizados em diferentes contextos ou cadeias.

Exemplo Prático:

Imagine um sistema de aprovação de documentos, onde diferentes funcionários têm autoridade para aprovar documentos até um determinado valor. O padrão Chain of Responsibility pode ser aplicado aqui. Cada nível de autoridade (por exemplo, Gerente, Diretor, CEO) é representado por um manipulador. Quando uma solicitação de aprovação é recebida, o manipulador adequado (baseado no valor do documento) decide se deve aprovar ou passar a solicitação para o próximo nível de autoridade.

Em resumo, o padrão Chain of Responsibility é útil quando você quer evitar acoplamentos rígidos entre remetentes de solicitações e seus receptores, permitindo que mais de um objeto possa tratar a solicitação. Ele promove a flexibilidade e a reutilização de código, tornando-o valioso em cenários onde o processamento de solicitações pode variar dinamicamente ou em situações onde um número desconhecido de objetos pode manipular uma solicitação.

quinta-feira, 19 de outubro de 2023

Design Patterns - Padrões Comportamentais - Strategy Pattern

O Strategy Pattern (Padrão Estratégia) é um dos padrões comportamentais do design pattern que permite que você defina uma família de algoritmos, coloque cada um deles em uma classe separada e torne-os intercambiáveis. Isso permite que o algoritmo varie independentemente dos clientes que o utilizam.

Componentes Chave:

  1. Context (Contexto): Mantém uma referência a uma estratégia específica. O contexto não conhece detalhes dos algoritmos, apenas interage com a interface comum definida para as estratégias.

  2. Strategy (Estratégia): Define uma interface comum para todos os algoritmos suportados. As classes de estratégia implementam essa interface.

  3. ConcreteStrategy (Estratégia Concreta): Implementa a interface da estratégia para fornecer a implementação específica do algoritmo.

Benefícios:

  1. Flexibilidade: Permite alterar algoritmos ou estratégias sem alterar o contexto. Isso oferece grande flexibilidade no comportamento do programa.

  2. Reutilização de Código: As estratégias podem ser reutilizadas em diferentes partes do aplicativo, já que são independentes e intercambiáveis.

  3. Facilidade de Manutenção: Cada algoritmo reside em sua própria classe, facilitando a manutenção e a compreensão do código.

Exemplo Prático:

Imagine um sistema de pagamento online. O contexto (por exemplo, um carrinho de compras) precisa calcular o valor total a ser pago. O Strategy Pattern pode ser aplicado aqui. Existem várias estratégias para calcular o total, como descontos sazonais, promoções especiais ou códigos de cupom. Cada estratégia seria implementada como uma classe de estratégia concreta. O contexto só precisa chamar a estratégia apropriada para calcular o total de acordo com a situação.

Em resumo, o padrão Strategy é poderoso para separar comportamentos em classes intercambiáveis, promovendo um código modular, flexível e fácil de manter. Ele é particularmente útil quando você precisa alternar entre diferentes algoritmos em tempo de execução ou quando há múltiplas variantes de um comportamento em um sistema.

 

quarta-feira, 18 de outubro de 2023

Design Patterns - Padrões Comportamentais - Observer Pattern

O Observer Pattern (Padrão Observador) é um dos padrões comportamentais mais amplamente utilizados no desenvolvimento de software. Ele estabelece uma relação de dependência um-para-muitos entre objetos, permitindo que, quando um objeto muda de estado, todos os seus observadores sejam notificados e atualizados automaticamente.

Componentes Chave:

  1. Subject (Assunto): Mantém uma lista de observadores, fornece métodos para adicionar e remover observadores, e notifica os observadores sobre mudanças de estado.

  2. Observer (Observador): Define uma interface para objetos que devem ser notificados sobre mudanças em um Subject.

  3. ConcreteSubject (Assunto Concreto): Implementa a interface do Subject. Ele mantém o estado e notifica os observadores quando o estado muda.

  4. ConcreteObserver (Observador Concreto): Implementa a interface do Observer para receber notificações do Subject e reagir de acordo com as mudanças de estado.

Benefícios:

  1. Desacoplamento: Observadores não precisam conhecer a estrutura interna do Subject, promovendo assim o desacoplamento entre os objetos.

  2. Manutenção Simples: Modificar ou adicionar novos observadores é fácil, pois eles não estão diretamente ligados ao Subject.

  3. Reusabilidade: Observadores podem ser reutilizados em diferentes partes do sistema, facilitando a modularidade.

Exemplo Prático:

Considere um sistema de previsão do tempo. O serviço meteorológico (Subject) monitora as mudanças climáticas. Várias plataformas, como um aplicativo móvel, um site e um dispositivo de IoT (Observadores), desejam ser atualizadas quando as condições climáticas mudam. Utilizando o padrão Observer, o serviço meteorológico pode notificar todas essas plataformas automaticamente sempre que houver uma alteração no clima, sem que elas precisem verificar repetidamente o estado.

Em resumo, o padrão Observer é crucial para construir sistemas que precisam responder dinamicamente a mudanças de estado, promovendo um design flexível e extensível.

 

terça-feira, 17 de outubro de 2023

Google Cloud - maior ataque DDoS da história

 

Google Cloud mitigou maior ataque DDoS da história !!

Na semana passada o Google anunciou que foi alvo do maior ataque DDoS já registrado. De acordo com a empresa, o ataque atingiu a incrível marca de 398 milhões de solicitações por segundo (conhecidas como requests per second, ou rps) em seu ponto mais alto. Esse número é 7,5 vezes maior que o recorde anterior, que registrava 49 milhões de rps.

Em um ataque DDoS, buscam desestabilizar um serviço online, deixando-o inoperante. Eles conseguem isso ao usar dispositivos comprometidos, desde computadores pessoais até câmeras de vigilância conectadas à internet, formando assim uma botnet ou rede zumbi. Essa rede é então utilizada para enviar milhões de acessos a um site específico. Como resultado, as solicitações por segundo sobrecarregam a infraestrutura do site, ultrapassando o limite de acessos que o servidor pode processar.

O Google Cloud divulgou que enfrentou uma onda de ataques a seus serviços desde agosto, além do Google Cloud, outros serviços da empresa e seus clientes foram alvo. Em um ataque que durou apenas 2 minutos, mas teve incríveis 398 milhões de solicitações por segundo (mais do que a Wikipedia recebeu de acessos em setembro), os cibercriminosos exploraram uma nova vulnerabilidade no protocolo HTTP/2, conforme revelado pelo Google. A empresa compartilhou em tempo real informações sobre os ataques com outras empresas que usam o mesmo protocolo e também recebeu detalhes das empresas afetadas. Graças às medidas de mitigação adotadas, os serviços do Google e de seus clientes conseguiram continuar operando normalmente na maior parte do tempo, frustrando os planos dos responsáveis pelo ataque, cuja identidade não foi revelada. Esse tipo de crime busca precisamente impedir o acesso a um serviço. Em 2020, um estudo do Google destacou que os ataques DDoS estão aumentando a cada ano. Considerando que 398 milhões de rps já são impressionantes, fica a questão: o que podemos esperar nos próximos recordes?

 


quarta-feira, 11 de outubro de 2023

iPhone 15 - Apple culpa Instagram e Uber por superaquecimento

🔥 Fogo Emoji

 

Após receber críticas dos usuários, a Apple reconheceu que o iPhone 15, que foi lançado no início de setembro, está enfrentando problemas de superaquecimento. De acordo com a empresa, os aplicativos Instagram, Uber e o jogo Asphalt 9 estão causando esse problema, conforme revelado em comunicado enviado à agência de notícias Associated Press.

A Apple afirmou ter identificado algumas condições que podem levar a um superaquecimento além do esperado nos iPhones. A empresa explicou que esses três aplicativos estão sobrecarregando o sistema operacional do iPhone e está atualmente trabalhando em uma atualização para o iOS 17 a fim de resolver esse problema.

O Instagram já implementou ajustes em seu aplicativo para evitar o superaquecimento do iPhone, de acordo com informações da Apple. A empresa também esclareceu que a Uber e outros aplicativos, incluindo o Asphalt 9, estão atualmente passando por processos de atualização para resolver o problema.

A Apple desmentiu as especulações que sugeriam que a questão do superaquecimento nos novos modelos de iPhone poderia estar relacionada à mudança da conexão Lightning para USB-C. Além disso, a empresa destacou que não é incomum que novos iPhones apresentem esse tipo de problema nos primeiros dias de uso ou durante a restauração de informações de backup armazenadas na nuvem, situações sobre as quais a Apple geralmente alerta os usuários com antecedência. Embora a empresa não tenha fornecido um cronograma específico para o lançamento da correção de software, ela assegurou aos proprietários que não há problemas de segurança que impeçam o uso de seus dispositivos iPhone 15 enquanto aguardam a atualização.

domingo, 8 de outubro de 2023

Design Patterns - Padrões Comportamentais

Os padrões comportamentais em design de software se concentram nos algoritmos e na atribuição de responsabilidades entre objetos. Eles lidam com a comunicação e a colaboração entre objetos, permitindo que os padrões comportamentais ajudem a definir como os objetos interagem e distribuem responsabilidades de maneira eficaz. Em vez de se preocupar com a estrutura das classes, esses padrões estão preocupados com a comunicação entre os objetos e como eles operam em conjunto para realizar tarefas.

Esses padrões são particularmente úteis quando há necessidade de comunicação eficiente entre objetos em um sistema complexo ou quando há variações na lógica de comportamento de uma classe. Ao aplicar padrões comportamentais, os desenvolvedores podem melhorar a flexibilidade e a extensibilidade de seus sistemas, tornando-os mais fáceis de entender e manter.

Além disso, os padrões comportamentais promovem a reutilização de código, uma vez que encapsulam comportamentos específicos em objetos, tornando esses comportamentos independentes de classes específicas. Isso torna mais fácil adicionar novos comportamentos ao sistema sem modificar seu código existente.

Esses padrões incluem estratégias para definir uma família de algoritmos, permitindo que eles sejam intercambiáveis, bem como padrões de comando que encapsulam uma solicitação como um objeto, permitindo a parametrização de clientes com operações, filas e solicitações de solicitações. Além disso, há padrões como Observer que definem uma dependência de um-para-muitos entre objetos para que, quando um objeto muda de estado, todos os seus dependentes sejam notificados e atualizados automaticamente.

Em resumo, os padrões comportamentais oferecem uma maneira eficaz de organizar a colaboração entre objetos, melhorando a flexibilidade, reusabilidade e manutenibilidade do código. Eles ajudam a definir como os objetos interagem e como as responsabilidades são atribuídas, facilitando o desenvolvimento de sistemas complexos e altamente interativos.

sábado, 7 de outubro de 2023

Design Patterns - Padrões Estruturais

Os padrões estruturais, em design de software, são diretrizes reutilizáveis para organizar a estrutura de classes e objetos. Eles ajudam a criar sistemas flexíveis e eficientes, promovendo a reutilização de código e facilitando a manutenção. Ao invés de se concentrarem nos detalhes de implementação, esses padrões se concentram em como as classes e objetos são compostos para formar estruturas mais complexas.

Esses padrões proporcionam uma maneira de definir relações entre objetos de forma que as mudanças na estrutura do sistema não afetem os componentes existentes. Isso significa que, ao aplicar padrões estruturais, você pode alterar a composição de objetos em um sistema sem alterar suas estruturas internas.

Além disso, os padrões estruturais também ajudam na organização do código-fonte, melhorando a legibilidade e a manutenibilidade do software. Eles promovem a utilização de princípios de design como a composição sobre herança, que é fundamental para criar sistemas flexíveis e fáceis de estender.

Em resumo, os padrões estruturais fornecem diretrizes abstratas para a organização de classes e objetos, permitindo que os desenvolvedores criem sistemas robustos, flexíveis e de fácil manutenção. Ao aplicar esses padrões de forma adequada, os desenvolvedores podem garantir que seus sistemas sejam escaláveis e capazes de se adaptar a mudanças futuras com o mínimo de esforço.

Design Patterns - Padrões de Criação - Prototype

O padrão Prototype é um padrão de design que permite a criação de novos objetos a partir de um modelo existente, também conhecido como protó...