Refactoring  

En af de store forbedringerne i Visual Studio 2005 er introduktionen af Refactoring.

Refactoring er omstruktureringen af eksisterende kode. Man foretager ændringer af den indre struktur uden at koden udadtil virker anderledes. Formålet er at opnå bedre struktureret kode, som er lettere at forstå og dermed lettere at vedligeholde og udvikle videre på.

I Visual Studio 2005 stilles en række af de mest anvendelige refactorings til rådighed:

  • Extract Method
  • Rename
  • Encapsulate Field
  • Extract Interface
  • Promote Local Variable To Parameter
  • Remove Parameters
  • Reorder Parameters

Men, og der er et lille men, desværre findes Visual Studio 2005s refactorings indtil videre kun til C#. Kun renaming er for øjeblikket understøttet i Visual Basic.

Refactorings kan findes under punktet Refactor i hovedmenuen, i contextmenuen i kode vinduet eller som smart tags i kode vinduet. Endelig kan tilgå refactorings ved hjælp af følgende genveje:

  • Extract Method - Ctrl+Alt+m efterfulgt af m
  • Rename - Ctrl+Alt+m efterfulgt af r
  • Encapsulate Field - Ctrl+Alt+m efterfulgt af e
  • Extract Interface - Ctrl+Alt+m efterfulgt af i
  • Promote Local Variable To Parameter - Ctrl+Alt+m efterfulgt af p
  • Remove Parameters - Ctrl+Alt+m efterfulgt af v
  • Reorder Parameters - Ctrl+Alt+m efterfulgt af o

Der er fuld undo på alle refactorings. Så man kan fortryde enhver refactoring.

Encapsulate Field

Med Encapsulate Field er det muligt at få genereret en property udfra en eksisterende instans variabel.

I dette eksempel er vi ved at lave en lille Gave-klasse, og vi har lavet de private instans variable, vi mener at få brug for. Og nu skal der laves properties.

Vi sætter cursoren i _titel og vælger Encapsulate Field.

Der popper en lille dialog op, som giver mulighed for at angive et navn på propertien, og hvordan man ønsker referencer til instans variablen opdateret. Man kan få et preview på ændringerne inden man godkender dem.

Ved klik på OK, laves en property ved navn Titel til instans variablen _titel.

Reorder Parameters og Remove Parameters

Både Reorder og Remove Parameters er som navnene antyder beregnet til at ændre i metoders og kontruktørers liste af parametre.

I vores lille Gave-klasse har vi også lavet en konstruktør, som tager imod en række parametre. Hvis vi stiller cursoren i konstruktøren, kommer der et lille smart tag frem. Hvis vi klikker på smart tagget, kommer der følgende menu frem

Vi vælger Reorder Parameters, og følgende dialog popper op.

Her kan vi bytte om på rækkefølgen af konstruktørens / metodens parametre.

Havde vi valgt Remove Parameters ville følgende dialog poppe op.

Her kunne vi slette en eller flere parametre... men vi kan også lade være :^).

Extract Interface

Extract Interface gør det let at generere et interface på baggrund af en konkret implementation. Smart og meget anvendeligt, da kodning mod interfaces frem for mod konkrete implementationer giver fleksibilitet i forhold til at kunne udskifte implementationen i fremtiden.

I vores lille eksempel kan vi generere et interface ud fra Gave-klassen. (og jo, det er overkill :^))
Vi stiller cursoren i klassens navn, og vælger Extract Interface fra context menuen.

Der popper en dialog op, hvor vi kan angive interface navn, filnavn til interfacet og angive hvilke metoder og properties, der skal medtages i interfacet.

Vi klikker OK, og der genereres et interface ved navn IGave, som ligger i sin egen kildekode-fil.

Der er endda også blevet tilføjet : IGave til erklæringen af Gave-klassen.

Extract Method

I vores eksempel har vi også en lille form, der kan vise gaver. I formens konstruktør har vi fået placeret noget kode til initialisering af en collection til gaverne, indsætningen af nogle gaver i collectionen samt noget databinding initialisering.
Glimrende kode, men placeringen af den er noget rod.
Man bør tilstræbe at de forskellige statements i en metode er på samme abstraktionsniveau, og dette gælder absolut ikke for vores konstruktør. Kaldet til InitializeComponent( ) og vores manuelt indsatte initialiseringskode, er på to forskellige niveauer. Det vil vi gerne have gjort noget ved, så vi benytter Extract Method til at få udfaktoreret vores manuelt indsatte initialiseringskode i en metode for sig.

Vi markerer den blok, vi ønsker at udfaktorere, og vælger Extract Method fra context menuen.

En dialog popper op, hvor vi kan angive et fornuftigt navn.

Vi klikker ok, og der indsættes en privat metode med den kodeblok, vi havde markeret, og et kald til den genererede metode i kontruktøren.

Rename

Med Rename refactoring kan man let fortage renaming af alle typer af identifiers. Som den eneste refactoring findes denne også i Visual Basic.
Man vælger blot den identifier, man ønsker at rename, og vælger Rename fra context menuen

Der popper en dialog op, hvor man kan angive et nyt navn. Man kan vælge at se et preview af ændringerne før man accepterer.

Ved renaming opdateres også alle referencer til den identifier, der har fået nyt navn. Opdatering af renamede identifiers på tværs af projekter i en solution sker kun, for projekter der er skrevet i samme sprog.

Promote Local Variable To Parameter

Den indtil videre sidste refactoring er Promote Local Variable To Parameter. Med Promote Local Variable To Parameter kan man generere en parameter til erstatning for en lokal variabel i en metode.

I vores eksempel har formen en liste over gaver. Når man vælger en gave på listen, skal data for gaven vises i et detail billede. Med Extract Method refactoring har vi fået udfaktoreret en metode (ShowSelected) til at vise den valgte gave.
I ShowSelected findes den valgte gave i listen, og gavens data vises. Vi er imidlertid lidt kede af, at ShowSelected selv tager fat i listen. For som ShowSelected ser ud nu, kan vi ikke vise en vilkårlig gave med metoden, men kun dén der er valgt i listen.

Vi vil derfor gerne have en gave med som parameter til ShowSelected, istedet for at den selv tager fat i listen. Og så er det jo godt at vi har Promote Local Variable To Parameter.

Vi vælger linien, hvor vi tager fat i listen og lægger indholdet i en lokal variabel, og vælger Promote Local Variable To Parameter fra context menuen

Og selected bliver nu til en parameter. Koden, hvor der tages fat i listen og det valgte element typecastes til en Gave, flyttes til stedet hvor ShowSelected kaldes.

Som en lille bonus skal det nævnes, at C# understøtter stub-generering. Det vil sige, at har man en instans af en type og skriver et metode-navn, der ikke findes, vil Visual Studio 2005 tilbyde at generere en stub i kildekode-filen for typen. Dette er specielt anvendeligt, når man laver test-først programmering.