ESPAÇO PUBLICITÁRIO DISPONÍVEL · FALE CONOSCO

Como refatorar funções complexas com linguagem natural usando a extensão Mutable.ai e o Auto Edit no VS Code

365Finds Editorial
11.430 artigos Wiki catalogados

Use o 365 Wiki com sua IA

Copie o prompt abaixo, cole na IA que você já usa e faça sua pergunta.

Baixar o Skill completo

Experimente primeiro com o prompt. Se você usa o 365 Wiki com frequência, instale o Skill completo do 365Wiki para não precisar colá-lo novamente. Se não usa uma IA específica, as versões web do Gemini ou Microsoft Copilot também servem.

Na rotina de engenharia de software, refatorar funções legadas e densas manualmente é uma das tarefas mais propensas a erros. Quando um desenvolvedor tenta reorganizar uma função de centenas de linhas sobrecarregada por estruturas condicionais aninhadas, cadeias de callbacks (callback hell), mutações implícitas de estado e trechos de "código zumbi" obsoletos, a edição manual linha a linha frequentemente introduz erros de sintaxe, corrompe o escopo de variáveis e desencadeia falhas de regressão.

Para solucionar esse gargalo, a Mutable.ai integrou o recurso Auto Edit diretamente em sua extensão oficial para o Visual Studio Code. Diferente do mero autocompletar baseado na posição do cursor ou de assistentes de chat externos que exigem copiar e colar trechos de código o tempo todo, o Auto Edit opera como um motor de refatoração incorporado ao próprio editor. Ele permite que o desenvolvedor selecione um bloco de código, digite instruções em linguagem natural e utilize o contexto integral do repositório para conduzir transformações atômicas e auditáveis.


1. Como o Auto Edit difere do autocompletar tradicional e do chat com IA

Os assistentes de programação orientados por IA costumam atuar em dois formatos distintos:

  1. Autocompletar em linha (Ghost Text): Ferramentas como o GitHub Copilot ou o Tabnine preveem os próximos tokens ou linhas a partir da posição atual do cursor. Esse formato é excelente para acelerar a escrita de código repetitivo, mas é incapaz de reorganizar a arquitetura de uma função inteira ou reorganizar dependências complexas com segurança.
  2. Painéis de chat laterais: Interfaces de chat possibilitam solicitar propostas de refatoração, mas exigem retirar o código do editor, colá-lo na barra lateral e colar o retorno de volta no arquivo de origem. Essa dinâmica interrompe o estado de concentração (flow) do programador e dificulta o controle de alterações locais.

O Auto Edit da Mutable.ai une o poder dos comandos em linguagem natural à experiência nativa da IDE:


2. Formas de acionar o Auto Edit no Visual Studio Code

A extensão da Mutable.ai disponibiliza três pontos de entrada principais no VS Code:

Método de acionamentoOnde encontrarCenário de uso recomendado
Code LensClique no rótulo flutuante Auto Edit exibido logo acima da declaração da funçãoRefatoração cirúrgica de um método, função ou classe específica
Barra de statusClique no ícone da Mutable.ai na barra inferior do VS CodeAcesso ágil a comandos globais ou verificação de status da extensão
Menu de contextoClique com o botão direito na seleção ou no explorador de arquivos e escolha Mutable.ai: Auto EditEdições em múltiplos blocos ou alterações em nível de módulo

Ao selecionar qualquer uma dessas opções, uma barra de entrada flutuante surge sobre o trecho de código selecionado, aguardando o comando em linguagem natural.


3. Fluxo de trabalho prático para refatoração com Auto Edit

O processo sistemático para refatorar funções de alta complexidade ciclomática com o Auto Edit é estruturado em cinco etapas:

[Função complexa original]
           │
           ▼
[Etapa 1: Delimitar escopo] ──► [Etapa 2: Acionar Auto Edit] ──► [Etapa 3: Prompt preciso]
                                                                          │
                                                                          ▼
[Etapa 5: Confirmar / Testar] ◄── [Etapa 4: Analisar Diff] ◄── [Síntese contextual da IA]

Etapa 1: Delimitar o escopo da função

Selecione todo o bloco da função ou posicione o cursor na linha da assinatura do método. Delimitar com exatidão a área de trabalho impede que o motor de IA realize alterações indesejadas em funções vizinhas ou importações no cabeçalho do arquivo.

Etapa 2: Iniciar o Auto Edit pelo Code Lens

Clique na opção Auto Edit exibida no Code Lens acima do cabeçalho da função. A extensão fixará a seleção como o alvo da operação e exibirá o campo de texto para o comando.

Etapa 3: Redigir um prompt de refatoração estruturado

Evite comandos vagos como "melhore esta função". É fundamental explicitar o objetivo arquitetural, as restrições estruturais e a manutenção de compatibilidade:

Etapa 4: Analisar a visualização de Diff no editor

A Mutable.ai gera o código refatorado e abre a visualização de diferenças diretamente no VS Code:

Examine com atenção se os formatos de retorno e o comportamento de emissão de erros continuam compatíveis com o restante do sistema.

Etapa 5: Aceitar, ajustar ou descartar


4. Exemplo prático: Modernização de uma rotina legada de pedidos

Veja a seguir um exemplo real de uma função JavaScript legada com encadeamento excessivo de callbacks, mutação implícita e resquícios de regras promocionais descontinuadas.

Código original (Antes)

function processOrder(order, callback) {
    if (order) {
        if (order.id && order.items && order.items.length > 0) {
            var total = 0;
            for (var i = 0; i < order.items.length; i++) {
                if (order.items[i].price && order.items[i].qty) {
                    total += order.items[i].price * order.items[i].qty;
                } else {
                    // Fallback de uma promoção temporária de 2021
                    if (order.legacyPromo) {
                        total += 10;
                    }
                }
            }
            if (order.user && order.user.email) {
                database.saveOrder(order.id, total, function(err, res) {
                    if (err) {
                        callback(err, null);
                    } else {
                        emailService.sendReceipt(order.user.email, res, function(err2) {
                            if (err2) {
                                callback(null, { status: "partial_success", res: res });
                            } else {
                                callback(null, { status: "success", res: res });
                            }
                        });
                    }
                });
            } else {
                callback(new Error("Missing user email"), null);
            }
        } else {
            callback(new Error("Invalid items payload"), null);
        }
    } else {
        callback(new Error("Empty order"), null);
    }
}

Instrução em linguagem natural para o Auto Edit

"Refatore a função processOrder para TypeScript moderno: converta os callbacks para async/await, simplifique as estruturas condicionais aninhadas usando cláusulas de guarda com retorno precoce, extraia o cálculo do valor total para uma função auxiliar dedicada, remova a lógica obsoleta de legacyPromo e crie interfaces estritas para Order e OrderResult."

Código refatorado (Depois)

interface OrderItem {
    id: string;
    price: number;
    qty: number;
}

interface Order {
    id: string;
    items: OrderItem[];
    user: { email: string };
}

interface OrderResult {
    status: "success" | "partial_success";
    res: unknown;
}

function calculateOrderTotal(items: OrderItem[]): number {
    return items.reduce((sum, item) => sum + item.price * item.qty, 0);
}

async function processOrder(order: Order): Promise<OrderResult> {
    if (!order) {
        throw new Error("Empty order");
    }
    if (!order.id || !order.items || order.items.length === 0) {
        throw new Error("Invalid items payload");
    }
    if (!order.user?.email) {
        throw new Error("Missing user email");
    }

    const total = calculateOrderTotal(order.items);
    const res = await database.saveOrder(order.id, total);

    try {
        await emailService.sendReceipt(order.user.email, res);
        return { status: "success", res };
    } catch (emailError) {
        return { status: "partial_success", res };
    }
}

Benefícios obtidos com a refatoração:

  1. Redução significativa da complexidade ciclomática: O aninhamento profundo de 6 camadas foi reduzido para um fluxo limpo e linear.
  2. Eliminação de débito técnico: A regra extinta legacyPromo foi expurgada com segurança.
  3. Desacoplamento de responsabilidades: O cálculo do montante foi isolado em calculateOrderTotal, facilitando testes unitários individuais.
  4. Segurança em tempo de compilação: O contrato formal do TypeScript impede chamadas com parâmetros inválidos pelos consumidores da função.

5. Boas práticas e armadilhas a evitar

Para obter resultados confiáveis em refatorações via linguagem natural, adote as seguintes práticas recomendadas:

Práticas recomendadas

Armadilhas a evitar


6. Situação atual da plataforma e ecossistema moderno

A Mutable.ai foi fundada em 2021 por Omar Shams e Maxwell Siegelman no âmbito da Y Combinator (W22), ganhando destaque técnico por seus recursos de geração automatizada de documentação de repositórios ("Auto Wiki") e assistência ao código com visão global do repositório.

Em dezembro de 2024, a Mutable.ai foi adquirida pela Alphabet (Google). Após a aquisição, a operação independente da Mutable.ai e sua extensão no marketplace oficial do VS Code foram descontinuadas como produto autônomo, com suas tecnologias integradas às iniciativas internas do Google. Embora a extensão original não esteja mais em distribuição ativa independente, os princípios centrais introduzidos pela Mutable.ai — edição assistida por linguagem natural in-loco, compreensão estrutural do repositório e validação visual de diffs — tornaram-se o alicerce fundamental de ferramentas modernas como Cursor Composer, GitHub Copilot Edits, Continue.dev e Aider.


Referências