Refactorización/Extraer método

Extraer método (Refactorización, C#) editar

Extraer método es una operación de refactorización que proporciona una manera sencilla para crear un nuevo método a partir de un fragmento de código de un miembro existente.

Utilizando Extraer método se puede crear un nuevo método extrayendo una selección del código dentro del bloque del mismo; de un miembro ya existente. El nuevo método que se ha extraído contiene el código seleccionado, y el código seleccionado del miembro existente se reemplaza por una llamada al nuevo método. Convertir un fragmento de código en su propio método permite reorganizar el código de forma rápida y precisa para que sea posible volver a utilizarlo y lograr una mejor legibilidad.

Extraer método tiene las ventajas siguientes:

  • Fomenta el uso de mejores métodos de codificación, dando énfasis a métodos discretos y reutilizables.
  • Recomienda el código autodocumentado a través de una buena organización.

Si se utilizan nombres descriptivos, los métodos de alto nivel se pueden leer como una serie de comentarios.

  • Fomenta la creación de métodos más detallados para simplificar la sustitución.


Para utilizar Extraer método editar

  1. Cree una aplicación de consola denominada ExtractMethod y, a continuación, reemplace Program por el ejemplo de código siguiente.
  class A
  {
    const double PI = 3.141592;
    double CalculatePaintNeeded(double paintPerUnit, double radius)
    {
        // Seleccione cualquiera de los siguientes:
        // 1. toda la siguiente línea de código.
        // 2. el lado derecho de la siguiente línea de código.
        // 3. solo “pi” del lado derecho de la siguiente línea
        //    de codigo (to see the prompt for selection expansion).
        // 4.  todo el código dentro del cuerpo del método.
        // ...luego extraer método.
        double area = PI * radius * radius;
        return area / paintPerUnit;
    }
  }

2. Seleccione el fragmento de código que se desea extraer:

  double area = PI * radius * radius;

3. En el menú Refactorizar, haga clic en Extraer método

Aparecerá el cuadro de diálogo Extraer método.

De forma alternativa, también puede escribir el método abreviado de teclado CTRL+R, M para mostrar el cuadro de diálogo Extraer método.

O bien, puede hacer clic con el botón secundario del mouse en el código seleccionado, seleccionar Refactorizar y, a continuación, hacer clic en Extraer método para mostrar el cuadro de diálogo Extraer método.


4. Especifique un nombre para el nuevo método, por ejemplo CircleArea, en el cuadro de texto Nombre del nuevo método. Aparecerá una vista previa de la nueva firma de método en Vista previa de la firma del método.


5. Haga clic en Aceptar.

Comentarios editar

Cuando se utiliza el comando Extraer método, el nuevo método se inserta a continuación del miembro de origen en la misma clase.

Tipos parciales editar

Si la clase es un tipo parcial, Extraer método genera el nuevo método inmediatamente después del miembro de origen. Extraer método determina la firma del nuevo método, creando un método estático si el código incluido en el nuevo método no hace ninguna referencia a los datos de la instancia.

Parámetros de tipo genérico editar

Si extrae un método que tiene un parámetro de tipo genérico sin restricciones, el código generado no agregará el modificador ref a dicho parámetro a no ser que se le asigne un valor. Si el método extraído admite tipos de referencia como el argumento de tipo genérico, deberá agregar manualmente el modificador ref al parámetro en la firma del método.

Métodos anónimos editar

Si intenta extraer parte de un método anónimo que incluye una referencia a una variable local que se declara o a la que se hace referencia fuera del método anónimo, Visual Studio le advertirá que se pueden producir cambios semánticos.

Cuando un método anónimo utiliza el valor de una variable local, el valor se obtiene en el momento en que se ejecuta el método anónimo. Cuando un método anónimo se extrae en otro método, el valor de la variable local se obtiene en el momento de la llamada al método extraído.

El siguiente ejemplo ilustra este cambio semántico. Si se ejecuta este código, 11 se imprimirá en la consola. Si usa Extraer método para extraer el área de código que está marcada con comentarios de código en su propio método y, a continuación, ejecuta el código refactorizado, 10 se imprimirá en la consola

   class Program
   {
    delegate void D();
    D d;
    static void Main(string[] args)
    {
        Program p = new Program();
        int i = 10;
        /*Comenzar extracción */
            p.d = delegate { Console.WriteLine(i++); };
        /*Fin extraccion*/
        i++;
        p.d();
    }
  }

Para evitar esta situación, convierta las variables locales que se usan en el método anónimo en campos de la clase.

Referencias editar