{"id":345,"date":"2007-10-06T12:03:11","date_gmt":"2007-10-06T10:03:11","guid":{"rendered":"http:\/\/www.navision-blog.de\/2007\/10\/06\/resharper-30-fr-visual-studio-2005-im-test\/"},"modified":"2007-10-12T11:22:08","modified_gmt":"2007-10-12T09:22:08","slug":"resharper-30-fr-visual-studio-2005-im-test","status":"publish","type":"post","link":"http:\/\/www.navision-blog.de\/blog\/2007\/10\/06\/resharper-30-fr-visual-studio-2005-im-test\/","title":{"rendered":"ReSharper 3.0 f&uuml;r Visual Studio 2005 im Test &#8211; Refactoring f&#252;r Profis"},"content":{"rendered":"<p>ReSharper ist ein Plugin der Firma <a href=\"http:\/\/www.jetbrains.com\/index.html\">JetBrains<\/a> f&#252;r Visual Studio, das sich speziell die Produktivit&#228;tssteigerung beim Entwickeln als Ziel gesetzt hat. Besonderes Augenmerk wird dabei auf die Refactoring-Unterst&#252;zung gelegt, also auf das nachtr&#228;gliche Umgestalten von Quellcode. JetBrains wirbt damit das &#8220;intelligenteste AddIn f&#252;r Visual Studio&#8221; entwickelt zu haben &#8211; doch was kann ReSharper wirklich?\u00a0<\/p>\n<p><!--more--><\/p>\n<h5>Download &amp; Installation<\/h5>\n<p>ReSharper 3.0.2 gibt es bei JetBrains als <a href=\"http:\/\/www.jetbrains.com\/resharper\/download\/index.html#full\" title=\"ReSharper Download\">30-Tage Testversion<\/a> zum Download. Die Installation gestaltet sich wirklich einfach &#8211; empfehlenswert ist jedoch Visual Studio vorher zu schlie&#223;en. Nach vollendeter Installation und erneutem Starten von Visual Studio wird die Shortcutbelegung f&#252;r ReSharper abgefragt.\u00a0Es besteht die Wahl zwischen <a href=\"http:\/\/www.jetbrains.com\/resharper\/documentation\/ReSharper30DefaultKeymap.pdf\" title=\"Visual Studio Keyboard Schema\">&#8220;Visual Studio&#8221;<\/a> und <a href=\"http:\/\/www.jetbrains.com\/resharper\/documentation\/ReSharper30DefaultKeymap_2.pdf\" title=\"IntelliJ IDEA\">&#8220;IntelliJ IDEA&#8221;<\/a>. Beim &#8220;Visual Studio&#8221;-Schema werden die bekannten Standard-Refactoring-Features von Visual Studio einfach mit den analogen ReSharper-Features &#252;berschrieben, w&#228;hrend die zweite Einstellung f&#252;r Entwickler gedacht ist, die bereits mit IntelliJ IDEA oder ReSharper 2.5 gearbeitet haben.<\/p>\n<p><img loading=\"lazy\" border=\"0\" width=\"467\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/install-resharper.gif\" alt=\"ReSharper Keyboard Schema\" height=\"281\" style=\"border-width: 0px\" \/><\/p>\n<p>Seit der Version 3.0 kann man die Keyboard-Belegung nun auch jederzeit &#252;ber <em>ReSharper\/Options\/Environment\/General<\/em> editieren. Im weiteren werde ich jedoch nur auf die &#8220;Visual Studio&#8221;-Belegung eingehen.<\/p>\n<h5>IntelliSense-Erweiterungen<\/h5>\n<p>Visual Studio 2005 bringt standardm&#228;&#223;ig eine Reihe von <a href=\"http:\/\/de.wikipedia.org\/wiki\/IntelliSense\" title=\"IntelliSense - Wikipedia\">&#8220;IntelliSense&#8221;<\/a>-Features mit, die das Entwicklerleben einfacher gemacht haben. ReSharper erweitert diese Features noch um einige weitere M&#246;glichkeiten. So ist es zum Beispiel m&#246;glich alle im Projekt verwendeten Typen im IntelliSense auszuw&#228;hlen und nicht nur die Importierten. Das m&#246;glicherweise erforderliche Using-Statement wird von ReSharper automatisch erg&#228;nzt.<\/p>\n<h5>Code-Assistent<\/h5>\n<p>Immer wenn die Gl&#252;hbirne <img loading=\"lazy\" border=\"0\" width=\"14\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/bulb.gif\" alt=\"Code Assistent\" height=\"18\" \/> am linken Bildschirmrand erscheint, hat der Code-Assistent eine M&#246;glichkeit zum Refactoring gefunden. Durch Druck auf ALT+ENTER werden die gefundenen M&#246;glichkeiten aufgelistet. Hier einige Beispiele:<\/p>\n<ul>\n<li>Member-Variablen, die nicht beschrieben werden, k&#246;nnen &#8220;readonly&#8221; gesetzt werden:<\/li>\n<\/ul>\n<p>\u00a0<img loading=\"lazy\" border=\"0\" width=\"400\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/codeassistent1.gif\" alt=\"Code-Assistent\" height=\"88\" \/>\u00a0<\/p>\n<ul>\n<li>Stringverkettungen k&#246;nnen in String.Fomat() umgewandelt werden:<\/li>\n<\/ul>\n<p><img loading=\"lazy\" border=\"0\" width=\"393\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/codeassistent2.gif\" alt=\"Code-Assistent\" height=\"72\" \/><\/p>\n<ul>\n<li>Falls festgestellt wird, dass eine benutzte Variable NULL sein k&#246;nnte, wird ein &#8220;If(variable != null)&#8221; angeboten:<\/li>\n<\/ul>\n<p><img loading=\"lazy\" border=\"0\" width=\"400\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/codeassistent3.gif\" alt=\"Code-Assistent\" height=\"53\" \/><\/p>\n<ul>\n<li>Wenn erkannt wird, dass der benutzte Namespace in einer Datei nicht der Struktur innerhalb der Projektmappe entspricht, kann der Namespace verlagert werden:<\/li>\n<\/ul>\n<p><img loading=\"lazy\" border=\"0\" width=\"400\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/codeassistent4.gif\" alt=\"Code-Assistent\" height=\"93\" \/><\/p>\n<h5>Code-Navigation<\/h5>\n<p>ReSharper bildet intern den gesamten <a href=\"http:\/\/de.wikipedia.org\/wiki\/Abstract_Syntax_Tree\">abstrakten Syntaxbau<\/a> des Projektes ab und kann so genau erkennen, wann Refactoring eingesetzt werden kann. Das AddIn ist so u.a. in der Lage alle Aufrufe einer Funktion (ALT+F7) innerhalb der gesamten Projektmappe zu finden. Neben der Anzeige dieser Stellen ist auch eine einfache Navigation innerhalb der Aufrufhierarchie m&#246;glich.<\/p>\n<p><img loading=\"lazy\" border=\"0\" width=\"400\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/usages.jpg\" alt=\"usages\" height=\"207\" \/><\/p>\n<p>Besonders nett ist dieses Feature, wenn man innerhalb von Klassenhierarchien an abgeleitete Stellen navigieren m&#246;chte.<\/p>\n<h5>Toter Code<\/h5>\n<p>Da alle Funktions-Aufrufe der Projektmappe analysiert werden, ist ReSharper auch in der Lage &#8220;toten Code&#8221; zu erkennen, also Code der nirgends aufgerufen wird. Dieser Code wird grau markiert und kann getreu dem <a href=\"http:\/\/de.wikipedia.org\/wiki\/YAGNI\">YAGNI-Prinzip<\/a> (<em>You Ain\u2019t Gonna Need It) <\/em>per ALT+ENTER gel&#246;scht werden.<\/p>\n<p><img loading=\"lazy\" border=\"0\" width=\"382\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/gray-code1.png\" alt=\"Toter Code\" height=\"74\" \/><\/p>\n<p><img loading=\"lazy\" border=\"0\" width=\"400\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/gray-code2.png\" alt=\"Tote Referenzen\" height=\"109\" \/>\u00a0<\/p>\n<p>Das\u00a0Feature funktioniert so gut, dass ich mittlerweile bei grauem Code automatisch ALT+ENTER dr&#252;cke und den Code l&#246;sche. Falls der sehr seltene Fall eintritt, dass man die Funktion irgendwann doch nochmal braucht, dann schreibt man sie eben neu &#8211; oder schaut in seine Versionsverwaltung.<\/p>\n<h5>Codeformatierung<\/h5>\n<p>Nachdem man ReSharper installiert hat, zeigt sich Visual Studio in einem etwas anderen Gesicht. Das Erste das auff&#228;llt, ist das verfeinerte Syntax-Highlighting. Aber auch beim Tippen von Code darf man sich an einige neue\u00a0Features gew&#246;hnen &#8211; u.a. werden ge&#246;ffnete Klammern immer gleich wieder geschlossen und der Cursor zwischen die Klammern geschoben. Das gr&#246;&#223;te Feature in diesem Bereich ist jedoch die automatische Codeformatierung mit STRG+ALT+F. Je nach eingestellter Stufe werden hier toter Code entfernt, die Klassen-Member alphabetisch geordnet, Usings optimiert und die Blockeinr&#252;ckung nach voreingestellter Konvention korrigiert.<\/p>\n<p>Leider hat das Feature in der getesteten Version 3.0.2 noch ein paar kleine Macken, so dass ReSharper beim Neuformatieren einiger l&#228;ngerer Dateien einen &#8220;Out of Memory Error&#8221; meldet. Laut <a href=\"http:\/\/www.jetbrains.net\/jira\/browse\/RSRP\">JetBrains Bugdatenbank<\/a> wurde das Problem bereits gel&#246;st &#8211; der Patch ist aber noch nicht downloadbar.<\/p>\n<h5>Die Farbanzeige<\/h5>\n<p>Neben dem Quellcodefenster zeigt ReSharper eine Farbanzeige mit einem &#220;berblick &#252;ber den Status des aktuellen Dokuments an. Die Balken stellen dabei Links zu den entsprechenden Stellen im Dokument dar und die Position innerhalb des Dokuments wird auf die Gr&#246;&#223;e der Scrollleiste skaliert.<\/p>\n<table border=\"1\" width=\"398\" cellPadding=\"2\" cellSpacing=\"2\">\n<tr>\n<td width=\"118\" vAlign=\"top\">\n<p style=\"text-align: center\"><img loading=\"lazy\" border=\"0\" width=\"37\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/bar0.png\" alt=\"Roter Rand - Compile-Error\" height=\"281\" \/><\/p>\n<\/td>\n<td width=\"146\" vAlign=\"top\">\n<p style=\"text-align: center\"><img loading=\"lazy\" border=\"0\" width=\"51\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/bar1.png\" alt=\"Gelber Rand - Warnungen \/ Toter Code \/ Refactoringanweisungen\" height=\"281\" \/><\/p>\n<\/td>\n<td width=\"124\" vAlign=\"top\">\n<p style=\"text-align: center\"><img loading=\"lazy\" border=\"0\" width=\"46\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/bar2.png\" alt=\"Gr&#252;ner Rand - Alles Ok \/ Empfehlungen\" height=\"281\" \/><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"116\" vAlign=\"top\">Roter Rand:Compile-Error<\/td>\n<td width=\"151\" vAlign=\"top\">Gelber Rand:Warnungen \/ Toter Code \/ Refactoringanweisungen<\/td>\n<td width=\"127\" vAlign=\"top\">Gr&#252;ner Rand:Alles Ok \/ Empfehlungen zum Refactoring<\/td>\n<\/tr>\n<\/table>\n<p>Leider gibt es keine solche Anzeige f&#252;r alle Dateien innerhalb eines Projektes, so dass man alle Dateien manuell &#246;ffnen und ansehen muss.<\/p>\n<h5>UnitTesting<\/h5>\n<p>ReSharper bietet wie viele andere Tools eine erweiterte Unterst&#252;tzung f&#252;r UnitTests. Dabei werden aktuell <a href=\"http:\/\/www.nunit.org\/\">NUnit<\/a>, <a href=\"http:\/\/www.csunit.org\/\">csUnit<\/a> und &#252;ber ein zus&#228;tzliches <a href=\"http:\/\/der-albert.com\/Tags\/MbUnit\/default.aspx\">Plugin<\/a> auch <a href=\"http:\/\/www.mbunit.com\/\">mbUnit<\/a> angeboten. Leider gibt es scheinbar keine M&#246;glichkeit das UnitTest-Framework von Visual Studio Team System zu benutzen, so dass ich hier nicht weiter getestet habe.<\/p>\n<h5>Refactoring<\/h5>\n<p>Das Herz von ReSharper ist nat&#252;rlich das Refactoring. Es werden hier so viele Funktionen angeboten, so dass ich hier nur auf die Wichtigsten eingehen m&#246;chte. Eine <a href=\"http:\/\/www.jetbrains.com\/resharper\/features\/code_refactoring.html\" title=\"ReSharper - Refactoringfeatures\">komplette &#220;bersicht<\/a> aller Refactoring-Features gibt es auf der ReSharper-Homepage.<\/p>\n<p>Als wichtigsten ReSharper-Shortcut sollte man sich STRG+SHIFT+R f&#252;r &#8220;Refactor This&#8221; merken. Diese Funktionalit&#228;t bietet abh&#228;ngig vom Kontext eine Auswahl der gerade m&#246;glichen Refactoring-M&#246;glichkeiten.<\/p>\n<p><img loading=\"lazy\" border=\"0\" width=\"400\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/refactor-this.png\" alt=\"refactor_this\" height=\"167\" \/><\/p>\n<p>Neben den bereits aus Visual Studio bekannten Features wie &#8220;Feld einkapseln&#8221; und &#8220;Umbenennen&#8221; gibt es zum Beispiel M&#246;glichkeiten um Eigenschaften in Methoden zu konvertieren und umgekehrt, Methoden entlang von Vererbungshierarchien zu verschieben und Interfaces in Abstrakte Klassen zu konvertieren. Ein besonders nettes Feature ist, dass man ganze Quelltextbl&#246;cke als eigenst&#228;ndige Methoden auslagern kann. ReSharper erkennt dabei sogar automatisch welche Parameter der Methode &#252;bergeben werden m&#252;ssen:<\/p>\n<p><img loading=\"lazy\" border=\"0\" width=\"400\" src=\"http:\/\/www.navision-blog.de\/blog\/wp-content\/uploads\/2007\/10\/extract-method.png\" alt=\"Extract Method\" height=\"240\" \/><\/p>\n<h5>Fazit<\/h5>\n<p>ReSharper ist ein ausgezeichnetes Tool um die Produktivit&#228;t in Visual Studio zu steigern. Es werden viele Refactoring-Features angeboten und durch die Farbanzeige am Bildschirmrand hat man immer einen &#220;berblick &#252;ber den aktuellen Stats der Datei (leider nicht &#252;ber das gesamte Projekt). Ein kleiner Wermutstropfen ist die fehlende UnitTest-Unterst&#252;tzung f&#252;r Visual Studio Team System und der mit 249 $ (C#-Edition f&#252;r Firmen) doch meiner Meinung nach recht saftige Preis.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ReSharper ist ein Plugin der Firma JetBrains f&#252;r Visual Studio, das sich speziell die Produktivit&#228;tssteigerung beim Entwickeln als Ziel gesetzt hat. Besonderes Augenmerk wird dabei auf die Refactoring-Unterst&#252;zung gelegt, also auf das nachtr&#228;gliche Umgestalten von Quellcode. JetBrains wirbt damit das &#8220;intelligenteste AddIn f&#252;r Visual Studio&#8221; entwickelt zu haben &#8211; doch was kann ReSharper wirklich?\u00a0<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,11,12,38,29,3],"tags":[634,81,170,95,633],"_links":{"self":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/345"}],"collection":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=345"}],"version-history":[{"count":0,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/345\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=345"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}