Excelência operacional – Padrões de automação


Saiba mais sobre a excelência operacional bem projetada → Automação e eficiência

Padrões

Onde procurarQual é a boa aparência
Plataforma | Painéis✅ Todas as métricas relacionadas a KPIs estão incluídas em pelo menos um painel
Plataforma | Documentação✅ Saídas para cada automação são mensuráveis e temporizadas
Plataforma | Documentação✅ Partes interessadas responsáveis são listadas para cada KPI

Anti-Padrões

Onde procurarQual é a aparência ruim
Plataforma | Painéis⚡️ O relatório de KPI não existe ou os painéis estão sem métricas relacionadas a alguns KPIs
Plataforma | Documentação⚡️ Há KPIs sem partes interessadas responsáveis
Plataforma | Documentação⚡️ Os KPIs não existem para automações ou têm períodos de tempo imprecisos para medidas

Padrões

Onde procurarQual é a boa aparência
Plataforma | Fluxo✅ O Flow Builder é usado para automação acionada por registro (substituindo o Criador de processos e as Regras de fluxo de trabalho)
Plataforma | Fluxo✅ Fluxos acionados por registro com execução antes de salvar são usados para preenchimento de campo antes da criação do registro
Plataforma | Fluxo✅ Os fluxos lidam com lógica de decisão, loops, chamadas à API, operações DML e orquestração complexa de várias etapas
Plataforma | Fluxo✅ O controle de transação de fluxo é usado para confirmar alterações intermediárias quando necessário
Plataforma | Fluxo✅ O tratamento de falhas é implementado para uma boa recuperação de erros em fluxos
Plataforma | Fluxo✅ Fluxos de tela reativos proporcionam experiências de usuário dinâmicas
Plataforma | Fluxo✅ Automação declarativa é escolhida quando usuários comerciais ou administradores precisam modificar a lógica sem o envolvimento do desenvolvedor
Plataforma | Fluxo✅ Variáveis não se referem a valores embutidos em código (para tipos de registro, usuários etc.)
Plataforma | Fluxo✅ Lógica manual de fluxos para Apex em contextos de grande volume de dados
Plataforma | Fluxo✅ Os subfluxos são usados para seções de processos que precisam ser reutilizadas em todo o negócio
Plataforma | Fluxo✅ Todos os fluxos iniciados automaticamente usam elementos de decisão e/ou pausa para avaliar critérios de entrada e evitar loops ou execuções infinitas em grandes volumes de dados
Plataforma | Fluxo✅ Os usuários são solicitados a fornecer dados apenas quando os dados do sistema existentes não puderem ser usados
Plataforma | Fluxo✅ Os fluxos são organizados em uma estrutura hierárquica que consiste em um fluxo principal e subfluxos de suporte
Plataforma | Fluxo✅ Todas as entradas do usuário têm um propósito claro no fluxo
Plataforma | Fluxo✅ Cada fluxo atende a uma única finalidade específica
Plataforma | Fluxo✅ Cada etapa realiza uma tarefa granular específica
Plataforma | Fluxo✅ Todos os fluxos iniciados no contexto do usuário abstraem transações de contexto do sistema para subfluxos, colocadas de modo consistente após o elemento Pausar para criar nova transação
Plataforma | Fluxo✅ Todos os fluxos acionados por registro têm valores de ordem do acionador preenchidos
Plataforma | Fluxo✅ Fluxos que envolvem chamadas do sistema externo ou processos de execução longa usam caminhos assíncronos
Plataforma | Fluxo✅ Sequências complexas de operações de dados relacionadas são criadas com o Orquestrador (em vez de invocar vários subfluxos em um fluxo monolítico)
Plataforma | Validação✅ A integridade de dados é imposta no nível da plataforma usando regras de validação, regras de duplicados e campos obrigatórios
Plataforma | Validação✅ Regras de validação impedem a entrada de dados inválidos antes de salvar (mais eficiente do que a validação de acionador)
Plataforma | Processos de aprovação✅ O roteamento de aprovação de várias etapas lida com caminhos de aprovação paralelos e sequenciais com aprovadores delegados
Plataforma | Processos de aprovação✅ A arquitetura de aprovação considera cenários de exceção (todos os aprovadores em férias, exigência de negócios urgente ignorando a aprovação normal)

Anti-Padrões

Onde procurarQual é a aparência ruim
Plataforma | Fluxo⚡️ Criador de processos e regras de fluxo de trabalho usadas para nova automação (o Flow Builder é a direção estratégica)
Plataforma | FluxoAutomação programática usada quando usuários de negócios ou administradores precisam modificar a lógica sem o envolvimento do desenvolvedor
Plataforma | FluxoFluxos carecem de tratamento de falha, resultando em má recuperação de erros
Plataforma | Fluxo⚡️ As variáveis têm valores embutidos em código
Plataforma | Fluxo⚡️ Os fluxos devem ser desativados manualmente antes do carregamento de dados em massa
Plataforma | Fluxo⚡️ Partes de um fluxo são repetidas entre fluxos em vez de usar subfluxos
Plataforma | FluxoFluxos acionam avisos de “exceção não tratada”
Plataforma | Fluxo⚡️ Mesmo fluxos simples geralmente causam erros relacionados aos limites do regulador
Plataforma | FluxoFluxos exigem entradas adicionais para fornecer contexto
Plataforma | FluxoFluxos atendem a várias finalidades
Plataforma | FluxoGrupos de etapas relacionadas contêm funcionalidade que se sobrepõe a grupos de etapas em outros fluxos
Plataforma | Fluxo⚡️ Os fluxos solicitam entradas do usuário quando os dados armazenados podem ser usados
Plataforma | FluxoFluxos exigem entradas cujos dados não são usados
Plataforma | Fluxo⚡️ Realizar DML usando a coleção que é gerada do componente de tela (utilizando a configuração “Usar os IDs e todos os valores de campo de um registro ou coleção de registros” ao criar, atualizar ou excluir o elemento quando a coleção é gerada do componente de tela)
Plataforma | FluxoFluxos acionados por registro não usam atributos de ordem de acionador ou não usam valores de ordem de acionador de modo consistente
Plataforma | Fluxo⚡️ Caminhos assíncronos não usados de modo consistente ou de modo algum
Plataforma | FluxoFluxos grandes e monolíticos tentam coordenar sequências complexas de operações de dados relacionadas (com ou sem subfluxos)
Plataforma | Processos de aprovação⚡️ A arquitetura de aprovação não considera cenários de exceção (todos os aprovadores em férias, requisitos de negócios urgentes)
Plataforma | ValidaçãoIntegridade de dados imposta apenas em acionadores em vez de regras de validação (a validação do acionador é menos eficiente e mais complexa)

Padrões

Onde procurarQual é a boa aparência
Plataforma | Apex✅ A estrutura do manipulador do acionador impõe acionador único por objeto, massificação, separação de preocupações e prevenção de execução recursiva
Plataforma | Apex✅ Acione manipuladores delegados a classes de serviço para lógica de negócios, mantendo uma separação clara das preocupações
Plataforma | Apex✅ Os acionadores usam proteção contra recursão usando sinalizadores estáticos ou classe de controle de recursão dedicada
Plataforma | Apex✅ Futuro Apex é usado com moderação, para chamadas ou DML de objeto do sistema
Plataforma | Apex✅ As invocações assíncronas do Apex usam DML complexo enfileirável para ‘corrente’ em transações
Plataforma | Apex✅ O Apex em lote é usado para grandes volumes de dados (processam grandes quantidades de dados com limites de regulador dedicados por bloco)
Plataforma | Apex✅ Os trabalhos em lote têm o tratamento de erros que registra registros com falha sem interromper toda a execução do lote
Plataforma | Apex✅ A API em massa é usada apenas quando grandes quantidades de dados precisam ser processadas (APIs SOAP e REST nativas aproveitadas para quantidades menores de dados)
Plataforma | Apex✅ O Apex enfileirável é usado para orquestração de fluxo de trabalho complexo, chamadas externas com lógica de repetição e processamento que se beneficia de limites assíncronos
Plataforma | Apex✅ O Apex agendado executa o processamento em agendas fixas para manutenção noturna, relatórios diários, sincronização de integração periódica e regras de negócios baseadas em tempo
Plataforma | Padrões de design✅ Casos de uso para operações síncronas e assíncronas em automações são descritos claramente como parte dos padrões de design
Plataforma | Documentação✅ Caminhos de execução planejados e em potencial para automações são descritos claramente

Anti-Padrões

Onde procurarQual é a aparência ruim
Plataforma | Apex⚡️ Vários acionadores em um objeto com ordem de execução imprevisível e lógica sobreposta
Plataforma | Apex⚡️ Lógica de negócios integrada diretamente em arquivos de acionador, dificultando o teste
Plataforma | Apex⚡️ Nenhuma estrutura de manipulador de acionador ou padrões de acionador inconsistentes entre objetos
Plataforma | ApexOs trabalhos do Apex em lote têm um tamanho de escopo muito pequeno (por exemplo, tamanho de escopo = 1)
Plataforma | ApexApex em lote usado para chamadas externas (grandes volumes de dados do Salesforce enviados para um sistema externo usando o Apex em lote)
Plataforma | ApexRecursos do Apex assíncronos usados arbitrariamente (Métodos futuros e Apex enfileirável usados de forma inconsistente ou intercambiável)
Plataforma | ApexApex assíncrono raramente usado
Plataforma | ApexOperações de banco de dados não têm lógica clara e consistente para passar a execução para o Apex em lote quando necessário
Plataforma | Padrões de design⚡️ Casos de uso para operações síncronas e assíncronas não são tratados
Plataforma | DocumentaçãoA invocação de automação não está documentada

Padrões

Onde procurarQual é a boa aparência
Plataforma | Eventos de plataforma✅ Os eventos de plataforma são usados para automação conduzida por evento que separa editores dos assinantes
Plataforma | Eventos de plataforma✅ Os editores não estão cientes dos assinantes e publicam o fire-and-forget
Plataforma | Eventos de plataforma✅ Vários assinantes reagem de forma independente a eventos por meio de fluxos acionados por evento de plataforma, acionadores do Apex ou integrações externas
Plataforma | Eventos de plataforma✅ IDs de reprodução são usados para reproduzir eventos perdidos de qualquer ponto na janela de retenção de 72 horas
Plataforma | Eventos de plataforma✅ Eventos de plataforma habilitam comunicação entre organizações, notificação do sistema externo e orquestração de fluxo de trabalho interno

Anti-Padrões

Onde procurarQual é a aparência ruim
Plataforma | Eventos de plataformaCópia direta entre editores e assinantes, impedindo a automação composível
Plataforma | Eventos de plataformaA atualização do nível da conta chama diretamente a atualização da oportunidade, a notificação da equipe da conta e a sincronização do armazém de dados em uma transação (o acoplamento rígido exige alterações na lógica da conta sempre que um novo processamento downstream for necessário)
Plataforma | Apex⚡️ Publicar eventos de plataforma imediatamente usado adhoc (eventos em tempo real usados em vez de Publicar após confirmação, independentemente dos requisitos de pedido de publicação ou riscos de bloqueio de registro)

Padrões

Onde procurarQual é a boa aparência
Plataforma | Apex✅ As instruções SOQL usam operadores de comparação de lógica positiva (INCLUDES, IN) como lógica primária ou única
Plataforma | Apex✅ SOQL evita = NULL, != NULL ou usa-os com moderação após operadores de comparação positivos
Plataforma | Apex✅ SOQL não usa instruções de LIMIT 1
Plataforma | Apex✅ SOQL não usa palavra-chave ALL ROWS
Plataforma | Apex✅ SOQL não aparece em loops
Plataforma | Apex✅ Critérios de curinga aparecem em SOSL (não SOQL)
Plataforma | Apex✅ As instruções SOQL evitam comparações de LIKE ou comparações parciais de texto
Plataforma | Apex✅ SOQL é agrupado em blocos de try-catch
Plataforma | Apex✅ Variáveis não se referem a valores embutidos em código (para tipos de registro, usuários etc.)
Plataforma | Apex✅ Cada classe atende a um único propósito específico
Plataforma | Apex✅ Cada método realiza uma tarefa granular específica
Plataforma | Apex✅ Todas as variáveis de entrada têm um propósito claro dentro da classe
Plataforma | Apex✅ A execução de código requer um número mínimo de recursos

Anti-Padrões

Onde procurarQual é a aparência ruim
Plataforma | ApexAs instruções SOQL usam NOT, critérios de NOT IN como principal ou único operador de comparação (não seletivo)
Plataforma | Apex⚡️ As instruções SOQL usam palavra-chave ALL ROWS (não seletiva)
Plataforma | ApexAs instruções SOQL usam = NULL, critérios de != NULL como principal ou único operador de comparação (não seletivo)
Plataforma | Apex⚡️ As variáveis têm valores embutidos em código
Plataforma | Apex⚡️ SOQL aparece dentro de loops
Plataforma | ApexAs instruções SOQL usam critérios de filtro de curinga e LIKE com frequência (não seletivo)
Plataforma | Apex⚡️ SOQL não encapsulado em blocos de try-catch
Plataforma | Apex⚡️ As instruções SOQL usam LIMIT 1 (não seletivo)
Plataforma | Apex⚡️ SOSL raramente ou não é usado de modo consistente para critérios de seleção de curinga
Plataforma | Apex⚡️ As classes têm várias finalidades
Plataforma | ApexMétodos realizam várias tarefas ou métodos realizam tarefas que não estão alinhadas ao propósito declarado da classe da qual fazem parte
Plataforma | ApexAs variáveis de entrada não são, na verdade, usadas em métodos
Plataforma | ApexMétodos que recuperam dados desnecessariamente do banco de dados ou de sistemas externos

Padrões

Onde procurarQual é a boa aparência
Plataforma | Apex✅ Exceções personalizadas são usadas para criar mensagens de erro avançadas e lógica
Plataforma | Apex✅ O código engloba todas as etapas de DML, SOQL, chamadas e outros processos críticos em blocos de try-catch
Plataforma | Apex✅ Os métodos de classe de banco de dados podem ser usados exclusivamente para todas as operações de dados (em vez de DML)
Plataforma | Apex✅ Em contextos assíncronos e em massa, métodos de classe de banco de dados são usados em vez de DML
Plataforma | Aura✅ JavaScript engloba todas as operações de dados e etapas críticas do processo em blocos de try-catch
Plataforma | Aura✅ Dentro de blocos de try-catch, Error JavaScript nativo é usado em instruções de tiro (sem uso de $A.error())
Plataforma | Aura✅ Todas as lógicas de erro recuperáveis aparecem nas instruções de catch e fornecem mensagens claras do usuário
Plataforma | Fluxo✅ Fluxos com operações de dados, chamadas e outra lógica de processamento crítica têm caminhos de falha para todas as ações-chave
Plataforma | Fluxo✅ Fluxos de tela usam consistentemente conectores de falha para mostrar erros aos usuários
Plataforma | Fluxo✅ Mensagens de erro personalizadas são configuradas para erros que aparecerão na tela
Plataforma | Componentes da Web Lightning (LWC)✅ JavaScript engloba todas as operações de dados e etapas críticas do processo em blocos if ()/else if ()
Plataforma | Componentes da Web Lightning (LWC)✅ Todas as funções de @wire usam propriedades de data e error fornecidas pela API
Plataforma | Componentes da Web Lightning (LWC)✅ Todas as instruções if (error)/else if (error) contêm lógica para processar erros e fornecer mensagens informativas

Anti-Padrões

Onde procurarQual é a aparência ruim
Plataforma | Apex⚡️ DML, SOQL, chamadas ou outras etapas do processo críticas não colocadas consistentemente em blocos de captura de teste
Plataforma | Apex⚡️ Nenhum método de classe de banco de dados é usado
Plataforma | Apex⚡️ Operações de dados feitas exclusivamente com DML
Plataforma | ApexAs declarações de System.debug aparecem no código de produção (e não são comentadas)
Plataforma | Aura⚡️ O JavaScript não engloba consistentemente operações de dados e etapas críticas do processo em blocos de try-catch
Plataforma | AuraComponentes usam $A.error()
Plataforma | Aura⚡️ Lógica de erro recuperável não aparece consistentemente nas instruções de catch, e as mensagens de erro para os usuários não estão claras
Plataforma | Fluxo⚡️ Os fluxos não usam caminhos de falha de modo consistente ou de modo algum
Plataforma | Fluxo⚡️ Mensagens de erro personalizadas não usadas, portanto, os usuários veem a mensagem padrão “Uma falha não tratada ocorreu nesse fluxo”
Plataforma | Componentes da Web Lightning (LWC)Funções de @wire não usam propriedades de data e error fornecidas pela API (ou não as usam de forma consistente)
Plataforma | Componentes da Web Lightning (LWC)⚡️ Se usado, as instruções if (error)/else if (error) na verdade não contêm lógica para processar erros e fornecer mensagens úteis de erro
Plataforma | Componentes da Web Lightning (LWC)O JavaScript não usa consistentemente blocos if ()/else if () com operações de dados ou etapas críticas do processo