Documente Academic
Documente Profesional
Documente Cultură
de refactorizacin no actualizar las referencias a un elemento dentro de dicho mtodo. El ejemplo siguiente muestra este comportamiento.
La refactorizacin es el proceso que consiste en mejorar el cdigo una vez escrito cambiando su estructura interna sin modificar su comportamiento externo. Visual C# proporciona los siguientes comandos de refactorizacin en el men Refactorizacin: Extraer mtodo (Refactorizacin, C#) Cambiar el nombre de refactorizacin (C#) Encapsular campo (Refactorizacin, C#) Extraer interfaz (Refactorizacin, C#) Quitar parmetros (Refactorizacin, C#) Reordenar parmetros de refactorizacin (C#)
Advertencias de refactorizacin
Si el compilador no tiene un conocimiento completo del programa y es posible que el motor de refactorizacin no pueda actualizar todas las referencias apropiadas, se muestra el cuadro de dilogo de advertencia. Este cuadro de dilogo de advertencia tambin ofrece la posibilidad de realizar una vista previa del cdigo en el cuadro de dilogo Obtener vista previa de cambios antes de confirmar los cambios.
De forma predeterminada, si ejecuta una operacin de refactorizacin sin realizar una vista previa de los cambios de las referencias y el programa detecta un error de compilacin, el entorno de desarrollo mostrar este cuadro de dilogo de advertencia. Si ejecuta una operacin de refactorizacin que tiene habilitada la opcin Vista previa de los cambios de referencia y el programa detecta un error de compilacin, el entorno de desarrollo mostrar el siguiente mensaje de advertencia en la parte inferior del cuadro de dilogo Obtener vista previa de cambios, en lugar de mostrar el cuadro de dilogo Advertencia de refactorizacin: El proyecto o una de sus dependencias no se genera actualmente. Puede que las referencias no estn actualizadas. Esta advertencia de refactorizacin solo est disponible para las operaciones de refactorizacin que proporcionan la opcin Vista previa de los cambios de referencia.
} } Si utiliza la refactorizacin para cambiar el nombre de a por b, aparece este cuadro de dilogo. La referencia a la variable a, cuyo nombre ha cambiado, ahora se enlaza al parmetro que se pasa al constructor, en lugar de enlazarse al campo.
Si se utilizan nombres descriptivos, los mtodos de alto nivel se pueden leer como una serie de comentarios. Fomenta la creacin de mtodos ms detallados para simplificar la sustitucin. Reduce la duplicacin del cdigo.
double area = PI * radius * radius; return area / paintPerUnit; } } 2. Seleccione el fragmento de cdigo que se desea extraer: C# double area = PI * radius * radius;
3.
En el men Refactorizar, haga clic en Extraer mtodo. Aparecer el cuadro de dilogo Extraer mtodo. De forma alternativa, tambin puede escribir el mtodo abreviado de teclado CTRL+R, M para mostrar el cuadro de dilogo Extraer mtodo. O bien, puede hacer clic con el botn secundario del mouse en el cdigo seleccionado, seleccionar Refactorizar y, a continuacin, hacer clic enExtraer mtodo para mostrar el cuadro de dilogo Extraer mtodo.
4.
Especifique un nombre para el nuevo mtodo, por ejemplo texto Nombre del nuevo mtodo.
CircleArea, en el cuadro de
Aparecer una vista previa de la nueva firma de mtodo en Vista previa de la firma del mtodo. 5. Haga clic en Aceptar.
Comentarios
Cuando se utiliza el comando Extraer mtodo, el nuevo mtodo se inserta a continuacin del miembro de origen en la misma clase.
Tipos parciales
Si la clase es un tipo parcial, Extraer mtodo genera el nuevo mtodo inmediatamente despus del miembro de origen. Extraer mtodo determina la firma del nuevo mtodo, creando un mtodo esttico si el cdigo incluido en el nuevo mtodo no hace ninguna referencia a los datos de la instancia.
Mtodos annimos
Si intenta extraer parte de un mtodo annimo que incluye una referencia a una variable local que se declara o a la que se hace referencia fuera del mtodo annimo, Visual Studio le advertir que se pueden producir cambios semnticos. Cuando un mtodo annimo utiliza el valor de una variable local, el valor se obtiene en el momento en que se ejecuta el mtodo annimo. Cuando un mtodo annimo se extrae en otro mtodo, el valor de la variable local se obtiene en el momento de la llamada al mtodo extrado. El siguiente ejemplo ilustra este cambio semntico. Si se ejecuta este cdigo, 11 se imprimir en la consola. Si usa Extraer mtodo para extraer el rea de cdigo que est marcada con comentarios de cdigo en su propio mtodo y, a continuacin, ejecuta el cdigo refactorizado, 10 se imprimir en la consola. C#
class Program { delegate void D(); D d; static void Main(string[] args) { Program p = new Program(); int i = 10; /*begin extraction*/ p.d = delegate { Console.WriteLine(i++); }; /*end extraction*/ i++; p.d(); } } Para evitar esta situacin, convierta las variables locales que se usan en el mtodo annimo en campos de la clase.
Nota
Cuando utilice control de cdigo fuente para Visual Studio, obtenga siempre la ltima versin de los archivos intentar ejecutar la refactorizacin de cambio de nombre.
La operacin de refactorizacin Cambiar nombre est disponible en las caractersticas de Visual Studio siguientes:
Caracterstica
Editor de cdigo
Vista de clases
refactorizacin Cambiar nombre est disponible en el men contextual y en el men Refactorizar. Examinador de objetos Cuando se selecciona un identificador en el Examinador de objetos, la operacin de refactorizacin Cambiar nombre slo est disponible en el men Refactorizar. En la Cuadrcula de propiedades del Diseador de Windows Forms, cuando se cambia el nombre de un control se inicia una operacin Cambiar nombre para ese control. No aparece el cuadro de dilogo Cambiar nombre. En el Explorador de soluciones, el comando Cambiar nombre est disponible en el men contextual. Si el archivo de cdigo fuente seleccionado contiene una clase cuyo nombre es el mismo que el del archivo, puede utilizar este comando para, simultneamente, cambiar el nombre del archivo de cdigo fuente y ejecutar la operacin de refactorizacin Cambiar nombre. Por ejemplo, si crea una aplicacin predeterminada basada en Windows y luego cambia el nombre de Form1.cs por TestForm.cs, entonces el nombre del archivo de cdigo fuente Form1.cs cambiar a TestForm.cs, y la clase Form1 y todas las referencias a ella tambin recibirn el nuevo nombre TestForm.
Nota El comando Deshacer (CTRL+Z) nicamente deshar la operacin de refactorizacin Cambiar nombre dentro del cdigo, pero no restablecer el nombre original del archivo.
Si el archivo de cdigo fuente seleccionado no contiene una clase cuyo nombre sea el mismo que el del archivo, el comando Cambiar nombre del Explorador de soluciones nicamente cambiar el nombre del archivo de cdigo fuente y no ejecutar la operacin de refactorizacin Cambiar nombre.
Al ejecutar Cambiar nombre, el motor de refactorizacin realiza una operacin de cambio de nombre especfica para cada smbolo de cdigo, como se describe en la tabla siguiente.
Cambia la declaracin y los usos del campo al nuevo nombre. Cambia la declaracin y los usos de la variable por el nuevo nombre.
Cambia el nombre del mtodo y todas las referencias a ese mtodo al nuevo nombre.
Nota Al cambiar el nombre de un mtodo de extensin, la operacin de cambio de nombre se propaga a todas las instancias del mtodo que estn dentro del mbito, sin tener en cuenta si el mtodo de extensin se utiliza como un mtodo esttico o un mtodo de instancia.Para obtener ms informacin, vea Mtodos de extensin (Gua de programacin de C#).
Espacio de nombres
Cambia el nombre del espacio de nombres al nuevo nombre en la declaracin, en todas las instrucciones using y en los nombres completos.
Nota Al cambiar el nombre de un espacio de nombres, Visual Studio actualiza tambin la propiedad Default Namespace en la pgina Aplicacin del Diseador de proyectos.Esta propiedad no se puede restablecer seleccionando Deshacer en el men Editar.Para restablecer el valor de la propiedad Default Namespace, debe modificar la propiedad en el Diseador de proyectos.Para obtener ms informacin, vea Pgina Aplicacin.
Propiedad Tipo
Cambia la declaracin y los usos de la propiedad al nuevo nombre. Cambia todas las declaraciones y todos los usos del tipo por el nuevo nombre, incluso los constructores y destructores. Para los tipos parciales, la operacin Cambiar nombre se propaga a todas las partes.
{ void D() { ProtoClassA MyClassA = new ProtoClassA(); // Invoke on 'MethodB'. MyClassA.MethodB(0, false); } } 2. 3. Coloque el cursor en MethodB, en la declaracin de mtodo o la llamada al mtodo. En el men Refactorizar, seleccione Cambiar nombre. Aparece el cuadro de dilogo Cambiar nombre. Tambin puede usar el mtodo abreviado de teclado F2 para mostrar el cuadro de dilogo Cambiar nombre. O bien, puede hacer clic con el botn secundario en el cursor, sealar Refactorizar en el men contextual y, a continuacin, hacer clic en Cambiar nombre para mostrar el cuadro de dilogo Cambiar nombre. 4. 5. 6. 7. En el cuadro Nuevo nombre, escriba MethodC. Active la casilla Buscar en los comentarios. Haga clic en Aceptar. En el cuadro de dilogo Obtener vista previa de cambios, haga clic en Aplicar.
2.
En la declaracin para MethodB, escriba o retroceda sobre el identificador de mtodo. Aparecer el texto de la etiqueta inteligente debajo de este identificador.
Nota
Slo puede invocar la operacin de refactorizacin Cambiar nombre utilizando etiquetas inteligentes en la declaracin de un identificador.
3. Presione MAYS+ALT+F10 y, a continuacin, la FLECHA ABAJO para mostrar el men de etiquetas inteligentes. O bien Mueva el puntero del mouse sobre el texto de la etiqueta inteligente para mostrarla. A continuacin, mueva el puntero del mouse sobre la etiqueta inteligente y haga clic en FLECHA ABAJO para mostrar el men de etiquetas inteligentes. 4. Seleccione la opcin de men Cambiar nombre de '<identificador1>' a '<identificador2>', para invocar la refactorizacin de cambio de nombre sin ver una vista previa de los cambios del cdigo. Todas las referencias a <identificador1> se actualizarn automticamente a <identificador2>. O bien Seleccione el elemento de men Cambiar nombre con vista previa, para invocar la refactorizacin de cambio de nombre con una vista previa de los cambios del cdigo. Aparecer el cuadro de dilogo Obtener vista previa de cambios.
Comentarios
interface IBase { void Method(); } public class Base { public void Method() { } public virtual void Method(int i) { } } public class Derived : Base, IBase { public new void Method() { } public override void Method(int i) { } } public class C : IBase { public void Method() { } }
En el ejemplo anterior, al cambiar el nombre de C.Method() se cambia tambin el nombre de Ibase.Method(), ya que C.Method() implementaIbase.Method(). A continuacin, el motor de refactorizacin determina de forma recursiva que Ibase.Method() est implementado porDerived.Method() y cambia el nombre de Derived.Method(). El motor de refactorizacin no cambia el nombre de Base.Method(), porqueDerived.Method() no reemplaza Base.Method(). El motor de refactorizacin se detiene aqu a menos que haya activado Cambiar el nombre de las sobrecargas en el cuadro de dilogo Cambiar nombre. Si Cambiar el nombre de las sobrecargas est activado, el motor de refactorizacin cambia el nombre de Derived.Method(int i) porque sobrecarga Derived.Method(), de Base.Method(int i) porque es reemplazado por Derived.Method(int i) y de Base.Method() porque es una sobrecarga de Base.Method(int i).
Nota
Al cambiar el nombre de un miembro que se ha definido en un ensamblado al que se hace referencia, aparece un cuadro de dilogo en el que se explica que ese cambio producir errores de compilacin.
Cambiar el nombre a propiedades de tipos annimos
Al cambiar el nombre a una propiedad en tipos annimos, la operacin de cambio de nombre se propagar a las propiedades de otros tipos annimos que tengan las mismas propiedades. En el siguiente ejemplo, se muestra este comportamiento: C# var a = new { ID = 1}; var b = new { ID = 2}; En el cdigo anterior, al cambiar el nombre de ID, se cambiar ID en ambas instrucciones, ya que poseen el mismo tipo annimo subyacente. C# var companyIDs = from c in companylist select new { ID = c.ID, Name = c.Name}; var orderIDs = from o in orderlist select new { ID = o.ID, Item = o.Name}; En el cdigo anterior, al cambiar el nombre a ID, cambiar slo el nombre de una instancia de ID, ya que companyIDs y orderIDs no tienen las mismas propiedades.
C# class Square { // Select the word 'width' and then use Encapsulate Field. public int width, height; } class MainClass { public static void Main() { Square mySquare = new Square(); mySquare.width = 110; mySquare.height = 150; // Output values for width and height. Console.WriteLine("width = {0}", mySquare.width); Console.WriteLine("height = {0}", mySquare.height); } } 2. En Editor de cdigo y de texto, coloque el cursor en la declaracin, en el nombre del campo que desea encapsular. En el ejemplo siguiente, coloque el cursor en palabra width: C# public int width, height; 3. En el men Refactorizar, haga clic en Encapsular campo. El cuadro de dilogo Encapsular campo aparece. Tambin puede presionar CTRL+R, E, que es el mtodo abreviado de teclado para mostrar el cuadro de dilogo Encapsular campo. O bien, puede hacer clic con el botn secundario en el cursor, sealar Refactorizar y, a continuacin, hacer clic en Encapsular campo para mostrar el cuadro de dilogo Encapsular campo. 4. 5. 6. Especifique la configuracin. Presione ENTRAR o haga clic en el botn Aceptar. Si ha seleccionado la opcin Vista previa de los cambios de referencia, se abrir la ventana Vista previa de los cambios de referencia. Haga clic en el botn Aplicar. Aparece el siguiente cdigo fuente de los descriptores de acceso get y set en el archivo de cdigo fuente: C# public int Width {
get { return width; } set { width = value; } } El cdigo del mtodo Main tambin se actualiza con el nuevo nombre de propiedad Width. C# Square mySquare = new Square(); mySquare.Width = 110; mySquare.height = 150; // Output values for width and height. Console.WriteLine("width = {0}", mySquare.Width);
Comentarios
La operacin Encapsular campo slo es posible cuando el cursor se encuentra en la misma lnea que la declaracin de campo. Para las declaraciones de varios campos, Encapsular campo usa la coma como lmite de separacin entre los campos e inicia la refactorizacin en el campo que est ms cerca del cursor, en la misma lnea que el cursor. Tambin puede especificar qu campo desea encapsular seleccionando el nombre de dicho campo en la declaracin. El cdigo generado por esta operacin de refactorizacin se modela mediante la caracterstica de fragmentos de cdigo de Encapsular campo. Los fragmentos de cdigo se pueden modificar. Para obtener ms informacin, vea Cmo: Administrar fragmentos de cdigo.
C# // Invoke Extract Interface on ProtoA. // Note: the extracted interface will be created in a new file. class ProtoA { public void MethodB(string s) { } } 2. Con el cursor colocado en MethodB, haga clic en Extraer interfaz en el men Refactorizar. Aparecer el cuadro de dilogo Extraer interfaz. Tambin puede presionar el mtodo abreviado de teclado CTRL+R, I para mostrar el cuadro de dilogo Extraer interfaz. O bien, puede hacer clic con el botn secundario del mouse, seleccionar Refactorizar y, a continuacin, hacer clic en Extraer interfaz para mostrar el cuadro de dilogo Extraer interfaz. 3. 4. Haga clic en Seleccionar todo. Haga clic en Aceptar. Aparece el nuevo archivo, IProtoA.cs y el cdigo siguiente: C# using System; namespace TopThreeRefactorings { interface IProtoA { void MethodB(string s); } }
Comentarios
nicamente se puede tener acceso a esta caracterstica cuando el cursor est situado en la clase, el struct o la interfaz que contiene los miembros que se desea extraer. Cuando el cursor est en esta posicin, invoque la operacin de refactorizacin Extraer interfaz. Cuando se invoca Extraer interfaz en una clase o struct, la lista de bases e interfaces se modifica, a fin de incluir el nombre de la nueva interfaz. Cuando se invoca Extraer interfaz en una interfaz, la lista de bases e interfaces no se modifica.
Nota
No se puede quitar el primer parmetro de un mtodo de extensin.
Para quitar los parmetros
1. Cree una aplicacin de consola denominada RemoveParameters y, a continuacin, reemplace Program por el ejemplo siguiente. C# class A { // Invoke on 'A'. public A(string s, int i) { } } class B { void C() { // Invoke on 'A'. A a = new A("a", 2); } } 2. 3. Coloque el cursor en el mtodo A, bien en la declaracin de mtodo o bien en la llamada al mtodo. En el men Refactorizar, seleccione Quitar parmetros para mostrar el cuadro de dilogo Quitar parmetros. Tambin puede presionar CTRL+R, V, que es el mtodo abreviado de teclado para mostrar el cuadro de dilogo Quitar parmetros.
O bien, puede hacer clic con el botn secundario en el cursor, sealar Refactorizar y, a continuacin, hacer clic en Quitar parmetros para mostrar el cuadro de dilogo Quitar parmetros. 4. 5. 6. Utilizando el campo Parmetros, site el cursor en int i y, a continuacin, haga clic en Quitar. Haga clic en Aceptar. En el cuadro de dilogo Obtener vista previa de cambios - Quitar parmetros, haga clic en Aplicar.
Comentarios
Es posible quitar los parmetros de una declaracin de mtodo o de una llamada al mtodo. Coloque el cursor en la declaracin de mtodo o en el nombre de delegado e invoque a Quitar parmetros.
Precaucin
Quitar parmetros permite eliminar un parmetro al que se hace referencia en el cuerpo del miembro, pero no quita las referencias a dicho parmetro en el cuerpo del mtodo. Esto puede producir errores de compilacin en el cdigo. Sin embargo, puede usar el cuadro de dilogo Vista previa de los cambios para revisar el cdigo antes de ejecutar la operacin de refactorizacin.
Si un parmetro que se est quitando se modifica durante la llamada a un mtodo, la eliminacin del parmetro tambin quitar la modificacin. Por ejemplo, si se cambia una llamada a un mtodo de C# MyMethod(param1++, param2); por C# MyMethod(param2); no se incrementar param1 mediante la operacin de refactorizacin.
Nota
No puede reordenar el primer parmetro de un mtodo de extensin.
Para reordenar parmetros
1. Cree una biblioteca de clases denominada ReorderParameters y, a continuacin, reemplace Class1 por el ejemplo de cdigo siguiente. C# class ProtoClassA { // Invoke on 'MethodB'. public void MethodB(int i, bool b) { } } class ProtoClassC { void D() { ProtoClassA MyClassA = new ProtoClassA(); // Invoke on 'MethodB'. MyClassA.MethodB(0, false); } } 2. 3. Coloque el cursor en MethodB, en la declaracin de mtodo o la llamada al mtodo. En el men Refactorizar, haga clic en Reordenar parmetros. Aparece el cuadro de dilogo Reordenar parmetros.
4.
En el cuadro de dilogo Reordenar parmetros, seleccione int i en la lista Parmetros y, a continuacin, haga clic en el botn de la flecha hacia abajo. Como alternativa, puede arrastrar int i despus de bool b en la lista Parmetros.
5.
En el cuadro de dilogo Reordenar parmetros, haga clic en Aceptar. Si selecciona la opcin Vista previa de los cambios de referencia en el cuadro de dilogo Reordenar parmetros, aparecer el cuadro de dilogoObtener vista previa de cambios - Reordenar parmetros. Proporciona una vista previa de los cambios realizados en la lista de parmetros deMethodB en la firma y la llamada al mtodo. a. Si aparece el cuadro de dilogo Obtener vista previa de cambios - Reordenar parmetros, haga clic en Aplicar. En este ejemplo, se actualiza la declaracin de mtodo y todos los sitios de llamada al mtodo MethodB.
Comentarios
Puede reordenar los parmetros de una declaracin de mtodo o una llamada al mtodo. Site el cursor sobre la declaracin de mtodo o delegado o al lado de stos, pero no en el cuerpo.