Como aplicar SOLID em uma aplicação Angular 18+

A versão 18+ do Angular trouxe uma série de melhorias significativas, como a introdução do modo standalone e um suporte aprimorado à injeção de dependência, facilitando a aplicação dos princípios SOLID de forma mais eficiente e intuitiva.

Para ajudar você a colocar esses conceitos em prática, aqui está um guia com exemplos práticos, mostrando tanto as abordagens incorretas quanto as corretas para cada um dos princípios do SOLID.

1. SRP – Princípio da Responsabilidade Única

“Uma classe deve ter apenas uma razão para mudar e focar exclusivamente em uma única responsabilidade.”
Em outras palavras, cada componente ou classe deve resolver um único problema, evitando a mistura de tarefas não relacionadas. Isso garante código mais coeso, fácil de manter e menos propenso a bugs. Por exemplo, não deve misturar lógica de negócios com chamadas HTTP ou outras tarefas que não sejam diretamente relacionadas à sua função principal.

Exemplo Errado: Componente fazendo tudo

import { Component, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-user-profile',
  standalone: true,
  template: `
    <div *ngIf="user">
      <h1>{{ user.name }}</h1>
      <p>Email: {{ user.email }}</p>
    </div>
  `,
})
export class UserProfileComponent {
  user: any;
  private http = inject(HttpClient);

  constructor() {
    this.loadUser();
  }

  loadUser() {
    this.http.get('/api/user').subscribe((data) => (this.user = data));
  }
}
Continue reading →

Um pouco sobre SOLID.

O SOLID é um conjunto de cinco princípios de design de software que visam melhorar a qualidade, a manutenibilidade e a escalabilidade do código. Vamos começar pela letra S, que representa o Princípio da Responsabilidade Única (Single Responsibility Principle – SRP).

S – Princípio da Responsabilidade Única (SRP)

Definição: Uma classe deve ter apenas uma razão para mudar, ou seja, deve ter apenas uma responsabilidade.

Explicação: Esse princípio sugere que uma classe deve ser focada em fazer apenas uma coisa. Se uma classe tem múltiplas responsabilidades, ela se torna mais complexa e difícil de manter. Quando uma classe tem uma única responsabilidade, fica mais fácil de entender, testar e modificar.

Exemplo Prático:

Suponha que você tenha uma classe Pedido que é responsável por gerenciar os detalhes de um pedido e também por salvar o pedido no banco de dados.

class Pedido:
    def __init__(self, id, cliente, itens):
        self.id = id
        self.cliente = cliente
        self.itens = itens

    def calcular_total(self):
        return sum(item['preco'] * item['quantidade'] for item in self.itens)

    def salvar_pedido(self):
        # Lógica para salvar o pedido no banco de dados
        pass
Continue reading →

Como Integrar o Firebase Auth com um autenticador customizado?

Integrar o Firebase Authentication com um autenticador customizado envolve a criação de um sistema de autenticação personalizado que pode ser vinculado ao Firebase. Isso é útil quando você já tem um sistema de autenticação existente e deseja aproveitar os recursos do Firebase, como o Firebase Auth, para gerenciar usuários, tokens, e outras funcionalidades.

Link para a documentação do Firebase.

https://firebase.google.com/docs/auth/web/custom-auth?hl=pt-br

Aqui está um guia passo a passo para integrar o Firebase Auth com um autenticador customizado:

1. Configuração do Firebase

Primeiro, você precisa configurar o Firebase no seu projeto:

  1. Crie um projeto no Firebase Console: Acesse o Firebase Console e crie um novo projeto.
  2. Adicione o Firebase ao seu aplicativo: Siga as instruções para adicionar o Firebase ao seu aplicativo (Android, iOS, ou Web).
  3. Habilite o Firebase Authentication: No Firebase Console, vá para a seção “Authentication” e habilite o método de autenticação “Email/Senha” ou qualquer outro método que você deseja usar.

2. Criar um Autenticador Customizado

Continue reading →

Um Pouco Sobre Complexidade de Código

Volta e meia eu vejo em algumas redes algumas pessoas desenvolvedoras falando sobre, use isso, não use tal, e dizendo que devs juniors já deviam saber disso ou daquilo, porém normalmente isso tem relação a funções extendidas de javascript, python, etc.. mas poucos se atentam a uma questão que pode ser bem crítica, que é a complexidade do código gerado usando essas funções, e nesse artigo gostaria apenas de mostrar exemplos do que são e de pequenas implementações de algoritmos e diversos momentos de complexidade, a notação usada será a Big O
Espero que gostem 🙂

Primeiramente, o que é Big O?

Na ciência da computação, a notação Big O é uma notação matemática que descreve o comportamento limitante de uma função quando o argumento tende a um valor específico ou ao infinito. É membro de uma família maior de notações conhecida como notação Landau, notação Bachmann–Landau, ou notação assintótica.

A notação Big O é usada para classificar algoritmos de acordo com seu tempo de execução ou requisitos de espaço, conforme a entrada de dados aumenta.

Continue reading →

Estruturas de Dados com Java – Playlist Youtube

Essa playlist dos professores Leandro Guarino e Luiz Eduardo Guarino explica muito bem sobre estrutura de dados, não só pra Java, mas para qualquer linguagem, e tbm ensina de maneira bem didática sobre complexidade de código, com exemplo práticos e mostrando quem tem melhor e pior performance seguindo a notação Big O, para pesquisa e ordenação como busca binária, bubble sort, insert sort, entre outras coisas muito interessantes. 
Eu gostei muito, espero que gostem tbm =D

Estruturas de Dados com Java

Firebase Databases Indexes

Realtime Database

Na Realtime Database do Firebase, os índices (indexes) desempenham um papel importante na otimização das consultas. Quando você executa uma consulta em sua base de dados, os índices ajudam a melhorar a eficiência da busca, permitindo que o Firebase recupere os dados de forma mais rápida.

Os índices na Realtime Database do Firebase são um mecanismo que permite que o Firebase armazene os dados de forma mais eficiente, facilitando a consulta e a recuperação dos dados.

Os índices são criados para campos específicos em um documento. Quando um índice é criado, o Firebase armazena uma lista de todos os valores possíveis para esse campo. Essa lista é organizada de forma ordenada, o que facilita a consulta dos dados.

Por exemplo, imagine que você tenha um documento no banco de dados com os seguintes dados:

Continue reading →

Um pouco sobre o IONIC framework

O Ionic é um framework de código aberto para o desenvolvimento de aplicativos móveis híbridos e progressivos(PWA). Ele permite criar aplicativos para várias plataformas, como iOS, Android e web, usando tecnologias web como HTML, CSS e JavaScript.

O IONIC utiliza o Capacitor como base para acessar os recursos nativos dos dispositivos, como câmera, GPS, contatos, etc. Além disso, o IONIC usa o TypeScript e o Angular para prover uma solução de mais alto nível em termos de código e arquitetura. O IONIC também possui uma interface de linha de comando (CLI) que facilita a criação, o gerenciamento e o teste dos aplicativos.

Principais recursos e benefícios do Ionic:

  1. Desenvolvimento multiplataforma: Com o Ionic, é possível criar aplicativos para várias plataformas, como iOS, Android e web, a partir de um único código-base. Isso economiza tempo e esforço, evitando a necessidade de desenvolver aplicativos separados para cada plataforma.
  2. Componentes estilizados: O Ionic possui uma biblioteca extensa de componentes de interface de usuário pré-construídos, como botões, listas, menus, abas, sliders e muito mais. Esses componentes são estilizados e prontos para uso, permitindo criar interfaces de usuário atraentes e consistentes em seus aplicativos.
  3. Facilidade de uso: O Ionic é projetado para ser fácil de usar, especialmente para desenvolvedores web que estão familiarizados com tecnologias como HTML, CSS e JavaScript. Ele utiliza conceitos familiares, como a criação de páginas e o uso de componentes, facilitando a transição para o desenvolvimento de aplicativos móveis.
  4. Integração com Angular: O Ionic é construído em cima do Angular, o que significa que você pode aproveitar os recursos poderosos do Angular para criar aplicativos mais robustos. Isso inclui recursos como gerenciamento de estado, injeção de dependência e a capacidade de criar componentes reutilizáveis.
  5. Acesso a recursos nativos: Com o Ionic, é possível acessar recursos nativos do dispositivo, como câmera, GPS, armazenamento local e notificações push, usando plugins específicos do Ionic ou do Capacitor (uma biblioteca de abstração para acessar recursos nativos).
  6. Comunidade e ecossistema: O Ionic possui uma comunidade ativa e um ecossistema robusto de plugins, temas e bibliotecas adicionais. Isso significa que você pode encontrar suporte, recursos adicionais e soluções para desafios comuns ao desenvolver aplicativos com o Ionic.
Continue reading →

Desenvolvimento Móvel Nativo vs Híbrido

Desenvolvimento móvel nativo e desenvolvimento móvel híbrido são duas formas de criar aplicativos para dispositivos móveis, como smartphones e tablets. Cada uma tem suas vantagens e desvantagens, dependendo do objetivo, do público-alvo e do orçamento do projeto.

Um aplicativo nativo é aquele que é desenvolvido especificamente para uma plataforma ou sistema operacional, como Android ou iOS. Isso significa que ele usa a linguagem de programação, as ferramentas e os recursos nativos da plataforma, como a interface gráfica, os sensores, a câmera, o GPS, etc. Um aplicativo nativo pode oferecer uma melhor experiência de usuário, um maior desempenho e uma maior integração com o dispositivo.

No entanto, um aplicativo nativo também tem algumas desvantagens. Ele requer mais tempo e custo de desenvolvimento, pois é preciso criar um código diferente para cada plataforma. Além disso, ele depende da aprovação das lojas de aplicativos, como a Google Play ou a App Store, para ser distribuído e atualizado. E ele pode ter problemas de compatibilidade com diferentes versões ou modelos de dispositivos.

Continue reading →

O que é o Firebase?

Ou, tudo o que você gostaria de saber sobre o Firebase mas tinha medo de perguntar.

Uma das principais características do Firebase é a sua integração perfeita com outros produtos do Google Cloud, o que oferece escalabilidade e confiabilidade aos aplicativos. Ele oferece uma ampla gama de recursos que abrangem várias áreas-chave do desenvolvimento de aplicativos, incluindo autenticação de usuários, armazenamento de dados em tempo real, hospedagem, mensagens em nuvem, testes e muito mais.

O Firebase oferece uma solução completa para lidar com a autenticação de usuários, permitindo que os desenvolvedores implementem facilmente recursos de login com várias opções, como e-mail/senha, autenticação social (Google, Facebook, Twitter, etc.) e autenticação de telefone.

Além disso, o Firebase inclui o Realtime Database, um banco de dados em tempo real baseado em nuvem, que permite armazenar e sincronizar dados em tempo real entre os clientes e o servidor. Essa funcionalidade é ideal para aplicativos colaborativos ou aplicativos que requerem atualizações em tempo real, como chat em tempo real, jogos multiplayer e muito mais.

Continue reading →

Firebase Cloud Functions Em Seu Próprio Servidor

Essa é uma série de vídeos onde mostro como executar gatilhos das Cloud Functions do Firebase em servidor próprio.

Video 1

Como o Firebase agora colocou as Cloud Functions dentro do plano Blaze, o plano pago, resolvi mostrar como usá-las em seu servidor próprio, com acesso administrador Nesse primeiro vídeo mostro como isso e muito simples

Continue reading →