Logo

dev-resources.site

for different kinds of informations.

Padrão JumpTable com Javascript

Published at
4/2/2024
Categories
javascript
react
patterns
braziliandevs
Author
lucasruy
Author
8 person written this
lucasruy
open
Padrão JumpTable com Javascript

JumpTable Pattern

O JumpTable é uma forma inteligente de evitar grandes trechos de if-else ou switch-case no seu código. A ideia principal consiste em você mapear em um objeto com chaves para funções ou blocos de código.

Dependendo do caso, com um simples objeto, você consegue substitui-lo pelos bons e velhos if-else ou switch-case, você simplesmente olha para uma "tabela" usando a chave que tem em mãos e encontra a função certa para executar.

Isso deixa tudo mais limpo e direto, especialmente quando você tem muitas ações diferentes que dependem de condições variadas. É como organizar o caos numa ordem que faz sentido e é fácil de seguir.

Exemplos

Vamos supor que você tenha um aplicativo que executa ações diferentes com base em comandos de texto que recebe, como "create", "edit" ou "delete".

Sem usar JumpTable, você poderia fazer algo parecido com isso:

function runCommand(command) {
  if (command === "create") {
    console.log("Criando item...");
  } else if (command === "edit") {
    console.log("Editando item...");
  } else if (command === "delete") {
    console.log("Deletando item...");
  } else {
    console.log("Comando inválido!");
  }
}

runCommand("create") // Retorna o texto "Criando item..."
Enter fullscreen mode Exit fullscreen mode

Com o padrão JumpTable, o código fica assim:

const commands = {
  create: () => console.log("Criando item..."),
  edit: () => console.log("Editando item..."),
  delete: () => console.log("Deletando item..."),
  default: () => console.log("Comando inválido!"),
};

function runCommand(command) {
  // Se "command" existir dentro de "commands", retorna o item com o nome correspondente
  // Se "command" não existir, retorna o item `default`
  const action = commands[command] || commands.default;

  // Apenas executa a função atribuída a variável
  return action();
}

runCommand("create") // Retorna o texto "Criando item..."
runCommand("new") // Retorna o texto "Comando inválido!"
Enter fullscreen mode Exit fullscreen mode

Vamos dar uma olhada no que acabamos de ver no código. O objeto commands é o JumpTable. Ele conecta cada comando com uma função específica.

Quando chamamos a função runCommand, ela vai consultar o objeto commands, procurando pela chave que a gente passou pra ela por parâmetros. Se achar essa chave, ótimo, ela traz de volta o que encontrou. Se não achar, ela vai pegar a propriedade default do objeto commands e retornar como se fosse um plano B.

Esse padrão é muito útil para tornar o código mais organizado e fácil de expandir. Se você quiser adicionar um novo comando, basta adicionar uma nova chave e função ao objeto commands e é apensa isso, sem a necessidade de modificar a estrutura condicional existente. Ou seja, apenas modificando o objeto commands você é capaz de incluir ou remover novos comandos do seu código.

Aplicando JumpTable no React

Para um aplicativo React, o padrão JumpTable pode ser uma boa alternativa para simplificar a lógica de seleção de comportamentos baseados em condições específicas.

A integração com estados e props, em cenários onde a lógica do componente depende do estado atual ou props recebidas, um JumpTable pode ajudar a decidir qual componente renderizar sem recorrer a múltiplos if-else ou switch-case por exemplo.

Vamos pensar em um exemplo do dia a dia. Imagine o componente HomePage, que é tipo a vitrine que mostra vários estilos de layout diferentes, dependendo de quem tá navegando pelo app. A responsabilidade dele é mudar o visual conforme o tipo de pessoa que tá usando o app:

import { Menu } from "@/components/Menu";
import { AdminPage } from "@/components/AdminPage";
import { ModeratorPage } from "@/components/ModeratorPage";
import { UserPage } from "@/components/UserPage";
import { GuestPage } from "@/components/GuestPage";

// Atribui cada componente a uma chave do objeto
const LAYOUTS = {
  admin: AdminPage,
  moderator: ModeratorPage,
  user: UserPage,
  guest: GuestPage,
}

function HomePage(profile) {
  // Com base no perfil, busca o componente desejado
  const Component = LAYOUTS[profile];

  return (
   <div className="home-page">
    <Menu />
    {/* Renderiza o componente de forma clara e limpa */}
    <Component />
   </div>
  )
}
Enter fullscreen mode Exit fullscreen mode

Este exemplo mostra como um JumpTable pode simplificar e organizar a lógica, eliminando a necessidade de repetidas verificações condicionais dentro do JSX.

Desvantagens

Embora o padrão JumpTable ofereça várias vantagens em termos de simplificação da lógica condicional e manutenção do código, ele também possui suas desvantagens e limitações.

Quando o JumpTable tem muitas entradas, isso pode afetar a performance, principalmente se não for bem otimizada. Esse problema pode aparecer mais em lugares com poucos recursos como dispositivos menos potentes por exemplo.

Para quem é novo ou não conhece bem o padrão JumpTable, o código pode parecer menos claro que o uso de if-else ou switch-case, tornando a aprendizagem mais difícil e podendo complicar um pouco a leitura e manutenção do código.

Embora o JumpTable torne o código mais simples, testá-lo pode ser mais difícil se as funções envolvidas forem complexas ou numerosas, exigindo testes individuais para cada função.

Conclusão

O JumpTable pode ser uma mão na roda, tanto para quem usa React quanto para quem tá no JavaScript puro. Ele torna tudo mais simples e objetivo.

No React, ele é ótimo para aplicar renderizações condicionais sem fazer uma bagunça. Já no JavaScript, ele organiza suas funções e o que elas devem fazer de uma maneira bem direta, te poupando de um monte de if-else ou switch-case.

Em qualquer um dos casos, usar o JumpTable deixa seu código mais organizado e fácil de pegar no tranco, sendo um verdadeiro herói para quem busca eficiência sem querer quebrar a cabeça.

patterns Article's
30 articles in total
Favicon
Streamlining Data Flow in Angular: The Power of the Adapter Pattern 🔄
Favicon
CQRS — Command Query Responsibility Segregation — A Java, Spring, SpringBoot, and Axon Example
Favicon
Mastering the Container-Presenter Pattern in Angular: A Deep Dive
Favicon
Repository Design Pattern, Promoting Packages via ADS, and New Arabic Article ✨
Favicon
Flexibilidad y Escalabilidad: Usando Strategy y Factory Patterns
Favicon
Understanding Domain Events in TypeScript: Making Events Work for You
Favicon
Padrões de Projeto em React [HOCs, Render Props, Hooks]
Favicon
Mobile Development Platforms and software architecture pattern in mobile development
Favicon
Finite-state machine example in JavaScript
Favicon
OOP Simplified: Quick Factory Methods with Encapsulation, Abstraction, and Polymorphism in TypeScript
Favicon
Finite-state machine example in JavaScript
Favicon
How to avoid N + 1 and keep your Ruby on Rails controller clean
Favicon
Types Of Software Architecture
Favicon
Testando das trincheiras: Usando um "clock" fixo
Favicon
¿POR QUÉ no estás usando estos providers de Angular?
Favicon
Common and Useful Deployment Patterns
Favicon
Reusing state management: HOC vs Hook
Favicon
Understanding JavaScript Creational Patterns for Object Creation
Favicon
Understanding Design First: Principles, Patterns, and Best Practices Explained
Favicon
The Architecture Might Not Be the Problem
Favicon
Padrão JumpTable com Javascript
Favicon
Explorando os Fundamentos dos Padrões de Projeto: Conceitos Básicos
Favicon
Six Factors That Raise The Risk Of Bugs In A Codebase
Favicon
Microservices: Avoiding the Pitfalls, Embracing the Potential - A Guide to Anti-Patterns
Favicon
Android Presentation Patterns: MVI
Favicon
Entendendo o Pub/Sub com Javascript
Favicon
The Consumer Conundrum: Navigating Change in Microservices Without Gridlock
Favicon
𝗪𝗵𝗮𝘁 𝗮𝗿𝗲 𝘁𝗵𝗲 𝗥𝗲𝗴𝗘𝘅 𝗣𝗮𝘁𝘁𝗲𝗿𝗻𝘀?
Favicon
Using a Trait in Builder CLIs
Favicon
CLI Contexts

Featured ones: