ESPACIO PUBLICITARIO DISPONIBLE · HABLEMOS

Cómo refactorizar funciones complejas con lenguaje natural usando la extensión de Mutable.ai y Auto Edit en VS Code

365Finds Editorial
11.430 artículos Wiki recopilados

Usa 365 Wiki con tu IA

Copia el prompt de abajo, pégalo en la IA que ya usas y haz tu pregunta.

Descargar el Skill completo

Pruébalo primero con el prompt. Si usas 365 Wiki a menudo, instala el Skill completo de 365Wiki y no tendrás que volver a pegarlo. Si no tienes una IA habitual, también sirven las versiones web de Gemini o Microsoft Copilot.

En el mantenimiento de software, refactorizar funciones heredadas y complejas a mano representa uno de los mayores cuellos de botella de productividad. Al intentar desenredar una función monolítica de varios cientos de líneas repleta de condicionales anidados, cadenas de retrollamadas (callback hell), mutaciones implícitas de estado y código zombi obsoleto, la modificación manual línea a línea suele introducir errores de sintaxis, romper el alcance de las variables y provocar costosas regresiones.

Para solucionar este dilema de ingeniería, Mutable.ai integró la función Auto Edit directamente en su extensión oficial para Visual Studio Code. A diferencia del autocompletado básico a nivel de cursor o de las interfaces de chat externas que obligan a copiar, pegar y sincronizar código constantemente, Auto Edit funciona como un motor de refactorización integrado en el propio editor. Permite a los desarrolladores seleccionar un bloque de código, emitir instrucciones en lenguaje natural y aprovechar el contexto integral del repositorio para transformar la lógica de manera atómica y verificable.


1. En qué se diferencia Auto Edit del autocompletado y del chat convencional

Los asistentes de programación basados en IA suelen dividirse en dos categorías clásicas:

  1. Autocompletado en línea (Ghost Text): Herramientas como GitHub Copilot o Tabnine predicen los siguientes tokens o líneas a partir de la posición del cursor. Resultan muy útiles para generar código repetitivo, pero no pueden reestructurar la arquitectura de una función completa ni reorganizar dependencias complejas.
  2. Paneles de chat laterales: Permiten solicitar propuestas de refactorización, pero exigen extraer el código del editor, pegarlo en una barra lateral y volver a insertarlo manualmente en el archivo fuente. Esto rompe la concentración del programador y dificulta el control de versiones local.

Auto Edit de Mutable.ai combina las órdenes en lenguaje natural con la experiencia nativa del entorno de desarrollo:


2. Métodos para activar Auto Edit en Visual Studio Code

La extensión de Mutable.ai ofrece tres puntos de acceso adaptados a diferentes dinámicas de trabajo:

Método de activaciónDónde encontrarloCaso de uso idóneo
Code LensClic en la etiqueta interactiva Auto Edit situada sobre la declaración de la funciónRefactorización dirigida de un método, función o clase específica
Barra de estadoClic en el icono de Mutable.ai en la barra inferior de VS CodeAcceso rápido a comandos globales o comprobación del estado del servicio
Menú contextualClic derecho sobre el bloque seleccionado o un archivo en el explorador y elegir Mutable.ai: Auto EditModificaciones multirango o ajustes de nivel de módulo

Al ejecutar cualquiera de estos accesos, se abre una barra flotante de entrada sobre el código seleccionado a la espera de las instrucciones del desarrollador.


3. Flujo de trabajo paso a paso para refactorizar con Auto Edit

El procedimiento recomendado para refactorizar funciones con alta complejidad ciclomática consta de cinco etapas:

[Función compleja de origen]
            │
            ▼
[Paso 1: Delimitar bloque] ──► [Paso 2: Activar Auto Edit] ──► [Paso 3: Prompt preciso]
                                                                        │
                                                                        ▼
[Paso 5: Confirmar / Validar] ◄── [Paso 4: Revisar Diff] ◄── [Síntesis contextual de IA]

Paso 1: Delimitar el alcance de la función

Selecciona todo el bloque de la función o coloca el cursor en la línea de su firma. Delimitar con precisión el objetivo evita que el modelo modifique accidentalmente declaraciones adyacentes o importaciones del archivo.

Paso 2: Iniciar Auto Edit desde Code Lens

Haz clic en el indicador Auto Edit de Code Lens situado encima de la función. La extensión bloqueará el fragmento como contexto de trabajo y activará el cuadro de texto para el comando.

Paso 3: Redactar un prompt de refactorización preciso

Evita solicitudes genéricas como "mejora este código". Es fundamental especificar el propósito arquitectónico, las reglas estructurales y la compatibilidad hacia atrás:

Paso 4: Examinar la vista de diferencias (Diff) en el editor

Mutable.ai generará la propuesta y la mostrará en una vista comparativa integrada:

Verifica minuciosamente que la firma de salida y los errores lanzados sigan cumpliendo los contratos esperados por los módulos que invocan esta función.

Paso 5: Aceptar, iterar o descartar


4. Ejemplo práctico: Modernización de una función de pedidos

A continuación se muestra una función heredada en JavaScript con anidación excesiva, llamadas asíncronas tradicionales y código muerto de promociones extintas.

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 una promoción temporal 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);
    }
}

Instrucción en lenguaje natural para Auto Edit

"Refactoriza processOrder a TypeScript moderno: sustituye los callbacks por async/await, aplana las bifurcaciones anidadas mediante cláusulas de guarda con retorno temprano, extrae el cómputo del importe total a una función auxiliar, elimina por completo la lógica obsoleta de legacyPromo y define interfaces estrictas para Order y OrderResult."

Código refactorizado (Después)

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 };
    }
}

Beneficios obtenidos tras la refactorización:

  1. Reducción drástica de la complejidad ciclomática: De una anidación profunda de 6 niveles a un flujo lineal y legible.
  2. Eliminación de deuda técnica: Supresión limpia de la rama muerta legacyPromo.
  3. Desacoplamiento de responsabilidades: La lógica de cálculo se aísla en calculateOrderTotal, facilitando la creación de pruebas unitarias independientes.
  4. Seguridad en tiempo de compilación: Las interfaces TypeScript garantizan la validación estricta de tipos para los consumidores de la función.

5. Buenas prácticas y errores comunes

Para aplicar refactorizaciones asistidas por IA de forma segura, conviene seguir estos principios:

Prácticas recomendadas

Errores a evitar


6. Estado actual del producto y ecosistema moderno

Mutable.ai fue fundada en 2021 por Omar Shams y Maxwell Siegelman como parte del programa de aceleración Y Combinator (W22). La empresa alcanzó gran notoriedad por sus innovaciones en documentación automatizada de código ("Auto Wiki") y asistentes de programación con visión contextual de repositorios completos.

En diciembre de 2024, Mutable.ai fue adquirida por Alphabet (Google). Como consecuencia de esta operación, el servicio independiente de Mutable.ai y su extensión en el marketplace oficial de VS Code concluyeron su ciclo de distribución individual, integrando sus tecnologías en el equipo de ingeniería de Google. Si bien la extensión original ya no se distribuye de manera autónoma, los paradigmas que impulsó —edición en lenguaje natural directamente en el editor, comprensión contextual de todo el repositorio y revisión visual interactiva de diffs— constituyen hoy la base fundamental de herramientas como Cursor Composer, GitHub Copilot Edits, Continue.dev y Aider.


Referencias