Julekalender 2004 om Whidbey


23. dec 2004 14:33

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

Refactoring er at foretage omstruktureringer 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 udvide.

I Visual Studio 2005 stilles en række af de mest anvendelige refactorings tilrådighed. Men, og der er et lille men, desværre findes Visual Studio 2005s refactorings indtil videre kun til C#. Man kan da håbe at de med tiden også kommer til Visual Basic, men indtil videre må Visual Basic folket foretage refactoring manuelt. De refactorings der stilles til rådighed i Visual Studio 2005 er

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

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

  • 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

Endvidere er der 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 existerende 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.

Vi klikker OK, og vupti, så er der lavet en property ved navn Titel til instans variablen _titel.

Reorder Parameters og Remove Parameters

De næste to refactorings vi skal kigge på er Reorder Parameters og Remove Parameters. Begge er som navnene beregnet til at ændre i metoder 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 en 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 og angive hvilke metoder og properties, der skal medtages i interfacet.

Vi klikker OK, og wooosh, der genereres et interface ved navn IGave.

Smart, og 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 det er noget rod, at det ligger hvor det ligger.
Man bør jo tilstræbe at indholdet af en metode er på samme abstraktionsniveau, og dette gælder absolut ikke for vores kontruktø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. Og vi kan angive et fornuftigt navn.

Vi klikker ok, og vupti, så er der indsat en privat metode med den kodeblok, vi havde markeret, og et kald til den generede 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

Ved renaming opdateres også alle referencer til den identifier, der har fået nyt navn.

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 på 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 pling, på magisk vis bliver selected 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.



Abonnér på mit RSS feed.   Læs også de øvrige indlæg i denne Blog.