Refaktoreringskod i C#

Refaktoreringskod i C#

Vad är Refactoring?

Detta är processen för att förbättra din kodläsbarhet, komplexitet och prestanda genom att ändra:

  • Kodens interna struktur.
  • Kodens externa beteende.

Refactoring hjälper till med:

  • Hur du strukturerar om din kod
  • Hur du minskar din kodlängd
  • Hur man övervinner komplexitet

Metoder

Det finns flera sätt att tillämpa effektiv refactoring över din kod, dessa metoder är redan tillgängliga i Visual studio:

  • Extrahera metod
  • Extrahera gränssnitt
  • Byt namn på
  • Flytta variabel till parametern
  • Inkapsla fält
  • Ändra signatur
  • Generera metodstub

Extrahera metod:

Extrahera metoden är det enklaste och bästa sättet att refaktorisera koden. Den delar upp din kod i flera små block eller metoder. Du kan enkelt tillämpa den här metoden i ditt kodsegment.

1. Alla lokala variabler som definieras före den valda koden men som används i den blir en indataparameter.
2. Alla sådana lokalvärdesvariabler som ändras av den valda koden kommer att konverteras till en referensparameter (med ref-kvalificeraren).
3.Om den valda koden inte använder några medlemsvariabler kommer den att extraheras till en statisk metod.

Välj valfritt kodblock från ditt kodsegment.

Det här kodblocket kan vara vilken villkorlig sats som helst som IF, kan vara en loopsats som för, kan vara en metod eller vad som helst du behöver för att omfaktoriseras inom ditt kodsegment.

Låt oss diskutera hur man refaktorerar med Visual Studio med hjälp av Extract Method:

  1. Du kan välja kodavsnittet och högerklicka och välja refactor med extraheringsmetoder.
    Det kommer att ersätta kodavsnittet med en ny metod och den nya metoden skapas automatiskt med det kodavsnittet.

2.Du kan välja kodavsnittet och gå till Redigera–>Refactor–>Extrahera metod.
Det kommer att ersätta kodavsnittet med en ny metod och den nya metoden skapas automatiskt med det kodavsnittet.

Byt namn på:

Du kan använda refactoring för att på ett intelligent sätt byta namn på en variabel, parameter, metod eller en typ.
Refaktoreringsverktyget kommer att skilja mellan bokstavliga namn och ord i kommentarer och olika versioner av en överbelastad metod.
Det vill säga, när du byter namn på en metod får du möjlighet att ändra namnet på den specifika versionen av metoden (i dess definition och alla dess anropsplatser), eller alla överbelastade versioner av den metoden

Om du till exempel vill byta namn på typen Form1 till ClientForm, högerklickar du var som helst i din kod där typ Form1 finns (i dess definition eller på platser där den används) och väljer Byt namn... från Refactor-menyn.

Extrahera gränssnitt:

Extrahera gränssnitt skapar en gränssnittsdefinition av de publika metoderna för en klass eller en struktur.

Låt oss ta ett exempel på klassen Kalkylator.

public abstract class Calculator
{
   public int Add(int number1,int number2)
   {
      return number1+number2;
   }
   public int Subtract(int number1,int number2)
   {
      return number1-number2;
   }
   public virtual int Divide(int number1,int number2)
   {
      return number1+number2;
   }
   public abstract int Multiply(int number1,int number2);
}

För att extrahera ett gränssnitt ur klassen Calculator, högerklicka var som helst i klassdefinitionen och välj Extrahera gränssnitt... från Refactor-menyn.
Detta kommer att visa dialogrutan Extrahera gränssnitt

Du kan till och med extrahera ett gränssnitt från definitionen av ett annat, i vilket fall det nya gränssnittet kommer att placeras i en ny fil, men den ursprungliga gränssnittsdefinitionen kommer inte att ändras

Fältinkapsling:

Det låter dig skapa en egenskap runt en klassmedlem. Du kan använda den för att kapsla in ett offentligt fält eller för att exponera ett privat fält som allmän egendom

Anta till exempel att du vill exponera medlemvariabeln test_Number som en offentlig egenskap:

public class MyClass
{
   int test_Number;
}

Placera markören på test_Number och välj Encapsulate Field... från Refactor-menyn. Detta kommer att ta upp dialogrutan Encapsulate Field.

Encapsulate Field låter dig namnge egenskapen som omsluter medlemmen, ställa in egenskapens synlighet och instruera hur du uppdaterar aktuella referenser till medlemmen.
EncapsulateField kan känna igen en vanlig namnkonvention för medlemsvariabler och generera lämpligt egenskapsnamn från det.
Det betyder att om medlemsvariabeln har prefixet test_ eller bara _, kommer Encapsulate Field att utelämna det prefixet när man föreslår ett egenskapsnamn.
Naturligtvis kan du ange vilket egenskapsnamn du vill. Du kan också ange fastighetens synlighet (offentlig, intern, skyddad intern, skyddad, privat), och vad som ska göras med externa referenser:Du kan låta refactoring-verktyget ersätta alla referenser till fältet (inuti typen eller utanför) med referenser till den nya egenskapen.
Även om standardvalet för referensuppdatering är inställt på Extern, rekommenderar vi att du alltid väljer Alla, eftersom det kommer att främja lösare intern koppling i själva typen och det gör underhållet lättare.
Alla affärsregler tillämpas av egenskapen senare kommer att tillämpas automatiskt i typen.
Du kan välja om du vill granska ändringarna av referenserna och tillämpa ändringen. Resultatet blir en offentlig egendom som omsluter medlemmen:

public class MyClass
{
   int m_Number;
   public int Number
   {
      get
      {
         return test_Number;
      }
      set
      {
         test_Number = value;
      }
   }
}

Du kan använda fältinkapslingskapaciteten för att göra precis vad namnet antyder. Till exempel, istället för denna offentliga medlemsvariabel:
public class MyClass
{
   public int test_Number;
}

Efter att ha använt refactoring för fältinkapsling kommer du att få en offentlig egenskap som heter Number, och den offentliga test_Number-medlemmen kommer att konverteras till en privat medlem:
public class MyClass
{
   private int test_Number;
   public int Number
   {
      get
      {...}
      set
      {...}
   }
}

Ändra signatur:

Refaktorering låter dig ändra signaturen för en metod genom att lägga till eller ta bort parametrar, och refactoring låter dig ändra ordningen på parametrarna.
Du kan dock inte ändra metoden som returneras.
Du kan ändra signaturerna av metoder, indexerare och konstruktörer

Till exempel vill du ändra metoden Add() i den här klassen Calculator för att använda double istället för int-parametrar

public class Calculator
{
   public int Add(int number1,int number2)
   {
      return number1+number2;
   }
}

Högerklicka var som helst i metoden och välj Ändra metodsignatur... från popupmenyn Refactor för att få fram dialogrutan Ändra metodsignatur

Ändra metodsignatur låter dig ändra, lägga till eller ta bort metodparametrar.
Använd dialogrutan för att ändra ordningen på parametrarna genom att flytta parametrar uppåt eller nedåt, lägga till eller ta bort en parameter och redigera en parametertyp och ett namn

välj parametern nummer1 och klicka på knappen Redigera... för att ta fram dialogrutan Parameter. Ändra parametertypen till dubbel.
Observera att dialogrutan Parameter endast låter dig ändra typen till en av de fördefinierade C#-typerna, såsom int eller string

När du har tillämpat signaturändringen måste du manuellt ändra Add()-metodens returnerade typ till dubbel

Omge med och expansioner:

surround med och expansioner handlar om automatisering av kodinmatning snarare än kodlayout och struktur
Surround med genererar en mall med tomma platshållare för vanligt använda uttalanden (som foreach- eller undantagshantering) runt en vald kodsektion
Det är viktigt att förstå att Kill() inte är samma sak som Dispose(). Kill() hanterar exekveringsflöden som applikationsavstängning eller snabb avslutning av trådar, medan Dispose() tar hand om minnes- och resurshantering och avyttring av andra resurser som WorkerThread-klassen kan innehålla.
Den enda anledningen till att du kan ha Dispose() call Kill() är som en oförutsedda händelse i fall klientutvecklaren glömmer att göra det

Expand-funktionen injicerar mallkod på plats.
När du använder Expand med kontrollsatser som For Each, finns det inget behov av att omge befintlig kod? Det kommer helt enkelt att expandera en för varje sats där du behöver fylla i tomrummen

Kodexpansion tillåter utvecklare att lägga till sina egna kodmallar (kallade exstenciler).

Utökning Beskrivning
namnutrymme Utökar en namnområdesdefinition
gränssnitt Utökar en gränssnittsnamnområdesdefinition
klass Utökar en klassdefinition
struct Utökar en strukturdefinition
~ Utökar en C#-destruktor (defensiv Finalize()-metod)
enum Utökar en enumdefinition
egenskap Utökar en egenskapsdefinition
indexerare Utökar en indexeringsdefinition
#if Expanderar en villkorlig kompileringssektion
Använder Expanderar en användningssats
Markerad Expanderar ett markerat kodblock
Avmarkerad Expanderar ett omarkerat kodblock
Osäkert Expanderar ett osäkert kodblock
Byt Expanderar en switch-sats
Forr Expanderar en omvänd för loop
För Expanderar en for-loop
Om Expanderar en if-sats
Annat Expanderar en else-sats
Medan Expanderar en while-loop
Gör Expanderar en do/while-loop
Foreach Expanderar en för varje slinga
försök/fånga Expanderar ett försöksfångstblock
Sim Expanderar en statisk heltalsmetod Main()
Svm Expanderar en statisk void Main()-metod
#region Utökar en regiondefinition
Lås Expanderar en låssats