{"id":55000241,"date":"2004-12-01T00:00:00","date_gmt":"2020-05-06T15:17:52","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=241"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Refactoring","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Refactoring\/","title":{"rendered":"Refactoring"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/4306b148f3824c4f836a527a79302104\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Andr&eacute; Minhorst, Duisburg<\/b><\/p>\n<p><b>Refactoring ist eines der Schlagw&ouml;rter des Extreme Programming und untrennbar mit dem Unit-Testing und der testgetriebenen Entwicklung verbunden. Durch Refactoring verbessern Sie die Struktur und Lesbarkeit des Codes einer Anwendung unter Beibehaltung der Funktionalit&auml;t und erleichtern damit &auml;nderungen und Erweiterungen der Funktion der Anwendung.<\/b><\/p>\n<p>Refactoring ist eine T&auml;tigkeit, die Chefs und Managern vermutlich nicht gefallen wird, weil sie erstmal keinen Gewinn bringt und ein Projekt nicht sichtbar vorantreibt &#8211; immerhin bezeichnet man Refactoring ausdr&uuml;cklich als Vorgehensweise, die sich nicht auf die Funktion einer Anwendung auswirkt. Genau genommen kann man es als Aufr&auml;umen bezeichnen &#8211; man sortiert hier ein wenig aus, stellt dort ein wenig um und wirft vielleicht sogar ein paar Dinge weg. Die Analogie zum wirklichen Leben hinkt nur insofern, als dass Sie nicht Platz f&uuml;r etwas Neues, sondern die Voraussetzungen f&uuml;r dessen einfache Integration schaffen.<\/p>\n<p>Refactoring optimiert noch nicht einmal die Performance &#8211; im Gegenteil: Viele Refactoring-Ma&szlig;nahmen f&uuml;hren zu einer Verlangsamung der betroffenen Teile um wenige Prozentpunkte. <\/p>\n<p>Aber &#8211; und das ist das Wichtigste &#8211; Sie bereiten den Quellcode durch Refactoring auf die Anwendung von Performance-Optimierungen vor, weil Sie diesen wesentlich besser lesbar machen und damit das Erkennen und Beseitigen von Performance-Bremsen erleichtern.<\/p>\n<p>Die wichtigsten Ziele des Refactoring sind folgende:<\/p>\n<li>Der Code soll f&uuml;r Menschen besser lesbar gemacht werden.<\/li>\n<li>Die Struktur (Architektur) des Codes soll verbessert werden.<\/li>\n<li>Der Code soll keine redundanten Abschnitte enthalten. <\/li>\n<li>Der Code soll von Fehlern befreit und das Auffinden von Fehlern erleichtert werden.<\/li>\n<li>Die Anwendung soll robuster werden.<\/li>\n<p>Refactoring besteht aus einem oder mehreren Refactoring-Ma&szlig;nahmen &#8211; je nachdem, wie gute Vorarbeit man geleistet hat und wie viel Verbesserungspozential der Code noch bietet. Mit diesen Ma&szlig;nahmen k&ouml;nnen Sie den Code St&uuml;ck f&uuml;r St&uuml;ck besser strukturieren und lesbarer machen.<\/p>\n<p>Refactoring ist in Zusammenhang mit objektorientierten Programmiersprachen entstanden.  Da VBA nicht alle Aspekte der Objektorientiertheit beinhaltet, lassen sich l&auml;ngst nicht alle in Literatur und Internet beschriebenen Refactoring-Ma&szlig;nahmen auf VBA-Code anwenden.<\/p>\n<p>In den nachfolgenden Kapiteln lernen Sie ausschlie&szlig;lich solche Refactorings kennen, die f&uuml;r mit VBA entwickelte Anwendungen geeignet sind. Zu jedem Refactoring finden Sie ein Beispiel und &#8211; soweit sinnvoll &#8211; eine Abbildung zur Veranschaulichung der Vorgehensweise.<\/p>\n<p>In manchen F&auml;llen stellen wir auch Refactorings vor, die in der Literatur nicht beschrieben sind &#8211; beispielsweise die Umwandlung einer Funktion mit mehreren R&uuml;ckgabeparametern in eine Klasse mit entsprechenden Eigenschaften.<\/p>\n<p>Unbewusst werden Sie vielleicht schon das eine oder andere Refactoring an Ihrem Code vorgenommen haben, weil es Ihnen einfach sinnvoll erschien. Ein gutes Beispiel daf&uuml;r ist das Extrahieren einer Methode, bei dem man eine oder mehrere Zeilen Code, die an mehreren Stellen in einer oder mehreren Prozeduren vorkommen, in eine neue Prozedur ausgliedert.<\/p>\n<h3>Hinweis<\/h3>\n<p>Im Internet gibt es eine Menge Informationen zum Thema Refactoring, meist in Verbindung mit objektorientierten Sprachen wie Java oder VB.NET. Wenn Sie im Internet nach zus&auml;tzlichem Informationsmaterial suchen, sollten Sie als Suchbegriff zus&auml;tzlich noch den Namen Martin Fowler eingeben. Die in diesem Beitrag und den geplanten Fortsetzungen vorgestellten Refactoring-Ma&szlig;nahmen lehnen sich an die auf der folgenden Internetseite aufgef&uuml;hrten Informationen an und sind den speziellen Gegebenheiten unter Microsoft Access beziehungsweise VBA angepasst: http:\/\/www.refactoring.com\/catalog\/index.html <\/p>\n<p>Refactoring sollte unter zwei Voraussetzungen erfolgen:<\/p>\n<li>Der zu refaktorierende Code ist &#8211; soweit wie unter VBA m&ouml;glich &#8211; objektorientiert.<\/li>\n<li>Es gibt automatisierte Tests f&uuml;r den zu &auml;ndernden Code, mit dem man den Code vor und nach einer Refactoring-Ma&szlig;nahme testen kann.<\/li>\n<h2>Objektorientierung<\/h2>\n<p>Die erste Voraussetzung ist nirgends festgelegt, weil Refactoring ohnehin aus der objektorientierten Programmierung stammt und dort zusammenh&auml;ngende Methoden und Eigenschaften in Klassenmodulen untergebracht sind. Standardmodule wie in VBA werden dort nicht verwendet. Viele Refactoring-Ma&szlig;nahmen beziehen sich ausdr&uuml;cklich auf Klassen. Es gibt zwar einige, die auf Eigenschafts- oder Methodenebene anwendbar und damit auch f&uuml;r VBA-Prozeduren in Standardmodulen geeignet sind, aber die Kapselung von Funktionalit&auml;t in Klassen kommt dem Refactoring-Prozess in den meisten F&auml;llen entgegen.<\/p>\n<h2>Tests<\/h2>\n<p>Die zweite Voraussetzung ist die Absicherung der vom Refactoring betroffenen Funktionalit&auml;t. Und hier kommen die weiter oben erw&auml;hnten Unit-Tests und die testgetriebene Entwicklung ins Spiel: Wenn Sie die Anforderungen an die Eigenschaften und Methoden durch das vorherige Schreiben von Tests festlegen und auch &uuml;berpr&uuml;fen, k&ouml;nnen Sie auch ohne Sorge &auml;nderungen in Form von Refactoring-Ma&szlig;nahmen durchf&uuml;hren. Dazu stellen Sie einfach sicher, dass die Anwendung vor dem Refactoring funktioniert, f&uuml;hren die &auml;nderungen durch und testen anschlie&szlig;end, ob weiterhin alles reibungslos l&auml;uft. Dazu k&ouml;nnen Sie die Tests verwenden, mit denen Sie auch die entsprechenden Methoden entwickelt haben &#8211; der einzige Unterschied ist, dass die Tests in diesem Zusammenhang &#8222;Regressionstests&#8220; genannt werden.<\/p>\n<p>Testen Sie so oft wie m&ouml;glich &#8211; je kleiner die &auml;nderungen zwischen zwei Tests sind, umso schneller finden Sie eventuell auftretende Fehler.<\/p>\n<h3>Hinweis<\/h3>\n<p>Weitere Informationen &uuml;ber die testgetriebene Entwicklung finden Sie im Beitrag Testgetriebene Entwicklung mit Access in Ausgabe 4\/2004 von Access im Unternehmen. <\/p>\n<p>In den folgenden Abschnitten geht es los: Sie lernen die ersten Refactoring-Ma&szlig;nahmen kennen. In diesem Beitrag stellen wir Ihnen g&auml;ngige Ma&szlig;nahmen f&uuml;r das Refactoring von Variablen und Methoden vor.<\/p>\n<p>Variablen bieten gute Ansatzpunkte f&uuml;r Refactoring. Nachfolgend finden Sie einige Refactoring-Ma&szlig;nahmen, die je nach Situation Variablen hinzuf&uuml;gen, entfernen oder einfach &auml;ndern.<\/p>\n<pre>Public Sub EinsBisZehn()\r\n    Dim i As Integer\r\n    For i = 1 To 10\r\n        Debug.Print i\r\n    Next i\r\nEnd Sub<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<pre>Private Sub KombinationsfeldFuellen(intErstesJahr As Integer, intLetztesJahr As Integer)\r\n    Dim i As Integer\r\n    Dim strJahre As String\r\n    For i = intErstesJahr To intLetztesJahr\r\n        strJahre = strJahre & i & \";\"\r\n    Next i\r\n    strJahre = Mid(strJahre, 1, Len(strJahre) - 1)\r\n    Me.cboJahreszahlen.RowSource = strJahre\r\nEnd Sub<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<pre>Public Sub Rechteck(a As Integer, b As Integer)\r\n    Dim temp As Integer\r\n    temp = a * b\r\n    Debug.Print \"Fl&auml;che: \" & temp\r\n    temp = 2 * (a + b)\r\n    Debug.Print \"Umfang: \" & temp\r\nEnd Sub<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<h3>Hinweis<\/h3>\n<p>In den Schritt-f&uuml;r-Schritt-Anweisungen der einzelnen Refactoring-Ma&szlig;nahmen finden Sie oft den Hinweis, die Anwendung zu kompilieren. Damit sollen meist bei der &auml;nderung von Variablen vergessene Vorkommen der jeweiligen Variablen gefunden werden. Damit der Debugger sich meldet, wenn eine nicht deklarierte Variable im Quellcode enthalten ist, m&uuml;ssen Sie zu Beginn des Moduls die Zeile Option Explicit einf&uuml;gen. Es d&uuml;rfen dann keine Variablen mehr ohne Deklaration verwendet werden. <\/p>\n<h2>Tempor&auml;re Variable zerlegen<\/h2>\n<p>Es gibt mehrere M&ouml;glichkeiten, tempor&auml;re Variablen mehrfach zu verwenden. Die erste M&ouml;glichkeit ist die Verwendung in einer Schleife, was vollkommen legitim und au&szlig;erdem unausweichlich ist, wie das Beispiel aus Quellcode 1 zeigt.<\/p>\n<p>Die zweite M&ouml;glichkeit ist gegeben, wenn der Inhalt der Variablen sukzessiv erweitert wird, etwa um den Inhalt eines Kombinationsfeldes zu erzeugen (im Fall des Beispiels aus Quellcode 2 handelt es sich um Jahreszahlen).<\/p>\n<p>Die dritte M&ouml;glichkeit besteht in der Verwendung einer Variablen f&uuml;r verschiedene Zwecke, wie in dem Beispiel aus Quellcode 3.<\/p>\n<p>Die Methode speichert nacheinander zwei v&ouml;llig unterschiedliche Informationen in einer Variablen.<\/p>\n<p>Im vorliegenden Fall ist das noch &uuml;berschaubar, aber wenn Sie sich noch 30 Zeilen Code zwischen den beiden Verwendungen der Variablen temp vorstellen, nimmt die &uuml;bersichtlichkeit rasch ab. <\/p>\n<h3>Beschreibung der Vorgehensweise<\/h3>\n<p>Verwenden Sie jede Variable nur einmal und vergeben Sie au&szlig;erdem sprechende Namen f&uuml;r jede Variable. Damit erh&ouml;hen Sie die &uuml;bersichtlichkeit und k&ouml;nnen au&szlig;erdem sp&auml;ter auf alle tempor&auml;ren Variablen zugreifen, ohne deren Werte erneut ermitteln zu m&uuml;ssen. Gehen Sie folgenderma&szlig;en vor:<\/p>\n<li>Benennen Sie die tempor&auml;re Variable in der Deklaration nach dem Zweck des ersten Vorkommens.<\/li>\n<li>&auml;ndern Sie den Variablennamen an allen Stellen im Code, die sich auf die erste tempor&auml;re Variable beziehen.<\/li>\n<pre>Public Function AnzahlPersonen()\r\n    AnzahlPersonen = DCount(\"[Kunden-Code]\", \"Kunden\") _        + DCount(\"[Personal-Nr]\", \"Personal\")\r\nEnd Function<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<pre>Public Function AnzahlPersonen()\r\n    Dim intAnzahlKunden As Integer\r\n    Dim intAnzahlMitarbeiter As Integer\r\n    intAnzahlKunden = DCount(\"[Kunden-Code]\", \"Kunden\")\r\n    intAnzahlMitarbeiter = DCount(\"[Personal-Nr]\", \"Personal\")\r\n    AnzahlPersonen = intAnzahlKunden + intAnzahlMitarbeiter\r\nEnd Function<\/pre>\n<p><b>Quellcode 5<\/b><\/p>\n<li>Deklarieren Sie eine neue Variable mit einem Namen, der sich nach dem Zweck des zweiten Auftretens dieser Variablen richtet.<\/li>\n<li>Passen Sie den Namen der Variablen im Code an.<\/li>\n<li>Verfahren Sie genauso f&uuml;r alle weiteren Vorkommen.<\/li>\n<li>Kompilieren Sie um sicherzugehen, dass Sie die urspr&uuml;ngliche Variable an allen Stellen im Code ersetzt haben. (<\/li>\n<p>Die Beispielprozedur aus Quellcode 3 sieht nach dieser Behandlung wie folgt aus (&auml;nderungen fett gedruckt):<\/p>\n<pre>Public Sub Rechteck(a As Integer, b As Integer)\r\n    Dim intFlaeche As Integer\r\n    Dim intUmfang As Integer\r\n    intFlaeche = a * b\r\n    Debug.Print \"Fl&auml;che: \" & intFlaeche\r\n    intUmfang = 2 * (a + b)\r\n    Debug.Print \"Umfang: \" & intUmfang\r\nEnd Sub <\/pre>\n<h2>Erkl&auml;rende Variable einf&uuml;hren<\/h2>\n<p>Man verwendet oft komplizierte und aus mehreren Teilen bestehende Ausdr&uuml;cke in Methoden, deren Ergebnis nicht unbedingt offensichtlich ist.<\/p>\n<p><!--30percent--><\/p>\n<p>Auf eine Dom&auml;nenfunktion m&uuml;ssen Sie schon einen genaueren Blick werfen, um genau zu erkennen, welche Information sie ermittelt, um welche Dom&auml;nenfunktion es sich handelt (DLookup, DMax, DCount, &#8230;), auf welche Datenherkunft sie sich bezieht, welches Feld die Funktion betrifft und wie ein eventuell vorhandenes Kriterium die Datenherkunft einschr&auml;nkt. Folgende Funktion soll beispielsweise die Gesamtanzahl der Mitarbeiter und Kunden einer Firma ermitteln &#8211; zum Beispiel, um die richtige Menge Weihnachtskarten zu beschaffen (s. Quellcode 4).<\/p>\n<p>Zugegeben: Die Funktion l&auml;sst sich noch relativ schnell erfassen. Folgende Variante ist aber wesentlich freundlicher. Sie sehen, dass dort mit irgendeiner Funktion die Anzahl der Kunden und mit einer weiteren Funktion die Anzahl der Mitarbeiter ermittelt wird und dass diese beiden Werte addiert werden (s. Quellcode 5).<\/p>\n<h3>Beschreibung der Vorgehensweise<\/h3>\n<p>Diese Refactoring-Ma&szlig;nahme enth&auml;lt folgende Schritte:<\/p>\n<li>Deklarieren Sie eine tempor&auml;re Variable mit einem aussagekr&auml;ftigen Namen f&uuml;r jede Teilfunktion, f&uuml;r die es lohnenswert erscheint.<\/li>\n<li>Weisen Sie den tempor&auml;ren Variablen den entsprechenden Teilausdruck zu.<\/li>\n<pre>Public Function AnzahlPersonen()\r\n    Dim intAnzahlKunden As Integer\r\n    Dim intAnzahlMitarbeiter As Integer\r\n    intAnzahlKunden = AnzahlKunden\r\n    intAnzahlMitarbeiter = DCount(\"[Personal-Nr]\", \"Personal\")\r\n    AnzahlPersonen = intAnzahlKunden + intAnzahlMitarbeiter\r\nEnd Function\r\nPrivate Function AnzahlKunden() As Integer\r\n    AnzahlKunden = DCount(\"[Kunden-Code]\", \"Kunden\")\r\nEnd Function<\/pre>\n<p><b>Quellcode 6<\/b><\/p>\n<pre>Public Function AnzahlPersonen()\r\n    Dim intAnzahlMitarbeiter As Integer\r\n    intAnzahlMitarbeiter = DCount(\"[Personal-Nr]\", \"Personal\")\r\n    AnzahlPersonen = AnzahlKunden + intAnzahlMitarbeiter\r\nEnd Function<\/pre>\n<p><b>Quellcode 7<\/b><\/p>\n<pre>Private Function AnzahlMitarbeiter() As Integer\r\n    AnzahlMitarbeiter = DCount(\"[Personal-Nr]\", \"Personal\")\r\nEnd Function<\/pre>\n<p><b>Quellcode 8<\/b><\/p>\n<pre>Public Function AnzahlPersonen()\r\n    AnzahlPersonen = AnzahlKunden + AnzahlMitarbeiter\r\nEnd Function<\/pre>\n<p><b>Quellcode 9<\/b><\/p>\n<li>Setzen Sie den urspr&uuml;nglichen Ausdruck aus den Teilausdr&uuml;cken zusammen. (<\/li>\n<h2>Tempor&auml;re Variable durch Funktion ersetzen<\/h2>\n<p>Diese Refactoring-Ma&szlig;nahme hei&szlig;t eigentlich Tempor&auml;re Variable durch Abfrage ersetzen. Mit Abfrage ist hier allerdings keine SQL-Abfrage, sondern das Pendant anderer Programmiersprachen zu einer VBA-Funktion gemeint.<\/p>\n<p>Als Beispiel greifen wir die Funktion auf, die durch die Refactoring-Ma&szlig;nahme Erkl&auml;rende Variable einf&uuml;hren entstanden ist (s. Quellcode 5). Voraussetzung ist weiterhin, dass die Methode der tempor&auml;ren Variablen nur einmal einen Wert zuweist. Ist das gegeben, gehen Sie beispielsweise folgenderma&szlig;en vor:<\/p>\n<p>Erstellen Sie eine private Funktion f&uuml;r die Ermittlung der Anzahl der Kunden und ersetzen Sie die DCount-Anweisung in der urspr&uuml;nglichen Funktion durch die neue Funktion (s. Quellcode 6).<\/p>\n<p>Setzen Sie die Funktion AnzahlKunden &uuml;berall ein, wo dieser Wert ben&ouml;tigt wird &#8211; au&szlig;er bei der tempor&auml;ren Variablen intAnzahlKunden. Diese entfernen Sie ebenso wie die entsprechende Zuweisung (s. Quellcode 7).<\/p>\n<p>Erstellen Sie eine entsprechende private Funktion f&uuml;r die Variable intAnzahlMitarbeiter wie in Quellcode 8 und verwenden Sie den Aufruf dieser Funktion statt der Variablen wie in Quellcode 9.<\/p>\n<p>Damit hat die urspr&uuml;ngliche Funktion deutlich an Gewicht verloren und ist wesentlich &uuml;berschaubarer geworden. Zus&auml;tzlich haben Sie zwei Funktionen zur Ermitlung der Anzahl der Mitarbeiter und Kunden gewonnen, die Sie auch an anderer Stelle in dieser Klasse einsetzen k&ouml;nnen.<\/p>\n<pre>Public Sub SpielereiMitNamen(strName As String)\r\n    Dim strVorname As String\r\n    Dim strNachname As String\r\n    Call NameAufteilen(strName, strVorname, strNachname)\r\n    Debug.Print \"Vorname: \" & strVorname\r\n    Debug.Print \"Nachname: \" & strNachname\r\nEnd Sub\r\nPublic Sub NameAufteilen(strName As String, _    strVorname As String, strNachname As String)\r\n    Dim intPos As Integer\r\n    intPos = InStr(1, strName, \" \")\r\n    strVorname = Mid(strName, 1, intPos)\r\n    strNachname = Mid(strName, intPos + 1)\r\nEnd Sub<\/pre>\n<p><b>Quellcode 10<\/b><\/p>\n<pre>Public Sub SpielereiMitNamen_OO(strName As String)\r\n    Dim objPerson As clsPerson\r\n    Set objPerson = New clsPerson\r\n    objPerson.NameAufteilen strName\r\n    Debug.Print \"Vorname: \" & objPerson.Vorname\r\n    Debug.Print \"Nachname: \" & objPerson.Nachname\r\n    Set objPerson = Nothing\r\nEnd Sub<\/pre>\n<p><b>Quellcode 11<\/b><\/p>\n<h3>Beschreibung der Vorgehensweise<\/h3>\n<p>Mit den nachfolgenden Schritten ersetzen Sie eine Variable durch eine Funktion:<\/p>\n<li>Erzeugen Sie eine private Funktion, die den der Variablen zugewiesenen Inhalt ermittelt.<\/li>\n<li>Ersetzen Sie die Variable &uuml;berall dort, wo ihr Wert verwendet wird, durch den Funktionsaufruf.<\/li>\n<li>Entfernen Sie die Deklaration der Variablen und die urspr&uuml;ngliche Zuweisung. (<\/li>\n<h2>Zuweisung an Parameter entfernen<\/h2>\n<p>Parameter von Methoden dienen entweder dazu, einen Wert von der aufrufenden an die aufgerufene Methode zu &uuml;bergeben oder umgekehrt oder beides. Genau von dem jeweiligen Fall sollte man auch abh&auml;ngig machen, wie man einen solchen Parameter behandelt.<\/p>\n<p>Den letzteren Fall k&ouml;nnen Sie, wenn Sie objektorientiert und dementsprechend mit Klassen arbeiten m&ouml;chten, ausschlie&szlig;en. Damit h&auml;tten Sie hier ein Refactoring, das in den &uuml;blichen Katalogen nicht beschrieben sein d&uuml;rfte.<\/p>\n<p>Die Vorgehensweise, Ergebnisse einer Methode &uuml;ber die Parameter an die aufrufende Methode zu &uuml;bergeben, ist immer dann angezeigt, wenn mehr als ein Parameter zur&uuml;ckgegeben werden und kein Array oder ein Type daf&uuml;r verwendet werden soll. Die folgende Prozedur SpielereiMitNamen (s. Quellcode 10) ruft die Prozedur NameAufteilen auf, die den &uuml;bergebenen Namen aufteilt und die resultierenden Teile in die Parameter strVorname und strNachname schreibt. Die aufrufende Prozedur kann diese anschlie&szlig;end auswerten. <\/p>\n<p>Mit einer Klasse sind keine Parameter mehr erforderlich, wenn eine Methode mehrere R&uuml;ckgabewerte enth&auml;lt. Diese Aufgabe &uuml;bernehmen dann &ouml;ffentliche Eigenschaften mit Lesezugriff. Das folgende Beispiel zeigt, wie es funktioniert. Die aufrufende Routine sieht so wie in Quellcode 11 aus.<\/p>\n<p>Die Routine deklariert und instanziiert ein Objekt, das auf der Klasse clsPerson basiert. Sie ruft deren Methode NameAufteilen mit dem kompletten Namen als Parameter auf und ermittelt aus den entsprechenden &ouml;ffentlichen Eigenschaften die Werte f&uuml;r den Vor- und den Nachnamen.<\/p>\n<pre>Dim mVorname As String\r\nDim mNachname As String\r\nPublic Property Get Vorname() As String\r\n    Vorname = mVorname\r\nEnd Property\r\nPublic Property Get Nachname() As String\r\n    Nachname = mNachname\r\nEnd Property\r\nPublic Sub NameAufteilen(strName As String)\r\n    Dim intPos As Integer\r\n    intPos = InStr(1, strName, \" \")\r\n    mVorname = Mid(strName, 1, intPos)\r\n    mNachname = Mid(strName, intPos + 1)\r\nEnd Sub<\/pre>\n<p><b>Quellcode 12<\/b><\/p>\n<pre>Public Sub NameGrossSchreiben(strName As String)\r\n    Dim objPerson As clsPerson\r\n    Set objPerson = New clsPerson\r\n    Debug.Print objPerson.NameGrossSchreiben(strName)\r\n    Debug.Print strName\r\n    Set objPerson = Nothing\r\nEnd Sub<\/pre>\n<p><b>Quellcode 13<\/b><\/p>\n<pre>Public Function NameGrossSchreiben(strName As String)\r\n    strName = StrConv(strName, vbProperCase)\r\n    NameGrossSchreiben = strName\r\nEnd Function<\/pre>\n<p><b>Quellcode 14<\/b><\/p>\n<p>Das instanziierte Objekt basiert auf einer Klasse, die ein Klassenmodul namens clsPerson mit folgendem Inhalt besitzt (s. Quellcode 12).<\/p>\n<p>Die beiden vorherigen Parameter zur &uuml;bergabe von Vor- und Nachname sind nun als &ouml;ffentliche Eigenschaften der Klasse ausgef&uuml;hrt. Sie sollen nur gelesen werden, daher gibt es je eine Property Get-Prozedur f&uuml;r jede Eigenschaft. Der aufzuteilende Name wird der Methode NameAufteilen per Parameter mitgeteilt.<\/p>\n<h3>Hinweis<\/h3>\n<p>Die in diesem Beispiel beschriebene Umwandlung einer Prozedur mit R&uuml;ckgabeparametern in eine Klasse mit speziell f&uuml;r die R&uuml;ckgabe von Ergebnissen angelegten Eigenschaften kann aus Platzgr&uuml;nden hier leider nicht im Detail beschrieben werden. Weitere Informationen zur Verwendung von Klassen in Access finden Sie im Beitrag Objektorientiert programmieren mit Klassen in der Ausgabe 4\/2004 von Access im Unternehmen. <\/p>\n<p>Das eigentliche Motiv der Refactoring-Ma&szlig;nahme Zuweisung an Parameter entfernen ist aber noch anders gelagert:<\/p>\n<p>Ausgangspunkt ist eine Methode, die den Wert eines Eingangsparameters ver&auml;ndert.<\/p>\n<p>Das kann gerade unter VBA gef&auml;hrlich werden, da solche Werte im Normalfall als Referenz (ByRef) und nicht als Wert (ByVal) &uuml;bergeben werden. Somit wirken sich &#8211; wie in obigem und auch in folgendem Beispiel &#8211; &auml;nderungen an den Parametern bis auf die aufrufende Routine aus.<\/p>\n<p>Den Aufruf der Methode k&ouml;nnen Sie Quellcode 13 entnehmen.<\/p>\n<p>Und nachfolgend finden Sie die entsprechende Methode in der bereits oben vorgestellten Klasse clsPerson (s. Quellcode 14).<\/p>\n<p>In dieser Konstellation wird der Parameter strName ver&auml;ndert, was sich auch auf die entsprechende Variable der aufrufenden Routine auswirkt. Um das zu verhindern, verwenden Sie einfach eine Hilfsvariable wie im Beispiel aus Quellcode 15. In dieser speichern Sie zun&auml;chst den Eingangswert zwischen, und beziehen sich im Anschluss auf die Variable, die den Wert nun enth&auml;lt.<\/p>\n<pre>Public Function NameGrossSchreiben(strName As String)\r\n    Dim strTemp As String\r\n    strTemp = StrConv(strName, vbProperCase)\r\n    NameGrossSchreiben = strTemp\r\nEnd Function<\/pre>\n<p><b>Quellcode 15<\/b><\/p>\n<h3>Beschreibung der Vorgehensweise<\/h3>\n<p>Die nachfolgende Beschreibung bezieht sich auf den im letzten Beispiel dargestellten Fall.<\/p>\n<li>Deklarieren Sie eine tempor&auml;re Variable in der Methode.<\/li>\n<li>Ersetzen Sie den Parameter jedes Mal, wenn ihm ein Wert zugewiesen wird, durch die tempor&auml;re Variable. (<\/li>\n<h2>Tempor&auml;re Variable entfernen<\/h2>\n<p>Tempor&auml;re Variablen sind manchmal nicht wirklich notwendig. Das ist meist der Fall, wenn der Inhalt des zugewiesenen Ausdrucks durch den Ausdruck ausreichend beschrieben wird &#8211; also beispielsweise, wenn Sie einer Variablen den Inhalt eines Feldes einer Datensatzgruppe zuweisen (s. Quellcode 16).<\/p>\n<p>Manchmal wird eine tempor&auml;re Variable auch erst mit der Zeit &uuml;berfl&uuml;ssig &#8211; etwa wenn Sie den in der Variablen gespeicherten Wert zu Beginn oft ben&ouml;tigt haben, dessen Eins&auml;tze aber nach und nach bis auf einen zusammengestrichen haben.<\/p>\n<p>Eine Variable wie strFirma etwa macht nur dann Sinn, wenn der Inhalt nach der Zuweisung mehr als einmal verwendet wird. Ansonsten sollten Sie diese &#8211; ausgehend von Quellcode 16 &#8211; streichen und die Zuweisung direkt vornehmen wie in Quellcode 17.<\/p>\n<h3>Beschreibung derVorgehensweise<\/h3>\n<p>Wenn eine Variable entfernt werden soll, gehen Sie folgenderma&szlig;en vor:<\/p>\n<li>Ersetzen Sie die Variable an allen Stellen des Auftretens durch den dieser Variablen zugewiesenen Ausdruck.<\/li>\n<li>Kommentieren Sie die Deklaration der Variablen und die Zuweisung des Ausdrucks an die Variable aus.<\/li>\n<li>Kompilieren Sie, um sicherzustellen, dass Sie kein Auftreten der Variablen &uuml;bersehen haben. (<\/li>\n<pre>''...\r\nDim strFirma As String\r\n''...\r\nDo While Not rst.EOF\r\n    strFirma = rst!Firma\r\n    Debug.Print strFirma\r\n    rst.MoveNext\r\nLoop \r\n''...<\/pre>\n<p><b>Quellcode 16<\/b><\/p>\n<pre>''...\r\nDo While Not rst.EOF\r\n    Debug.Print rst!Firma\r\n    rst.MoveNext\r\nLoop \r\n''...<\/pre>\n<p><b>Quellcode 17<\/b><\/p>\n<p>Nachdem Sie sich mit verschiedenen Refactoring-Ma&szlig;nahmen in Zusammenhang mit Variablen befasst haben, folgen nun gr&ouml;&szlig;ere Bestandteile von Methoden: n&auml;mlich solche, die sich komplett aus- oder auch eingliedern lassen. Nat&uuml;rlich spielen Variablen auch hier wieder eine Rolle, sie k&ouml;nnen das Ausgliedern von Code erheblich erschweren.<\/p>\n<pre>Public Sub MethodeExtrahieren_I()\r\n    If SysCmd(acSysCmdGetObjectState, acForm, \"frmBeispiel\") Then\r\n        ''...\r\n    End If\r\n    ''...\r\n    If SysCmd(acSysCmdGetObjectState, acForm, \"frmBeispiel\") Then\r\n        ''...\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 18<\/b><\/p>\n<h2>Extrahieren von Methoden<\/h2>\n<p>Der Name dieser Refactoring-Ma&szlig;nahme ist m&ouml;glicherweise etwas irref&uuml;hrend, da diese eigentlich das Erstellen neuer Methoden aus einer oder mehreren Anweisungen einer bestehenden Methode beinhaltet.<\/p>\n<p>F&uuml;r diese Vorgehensweise kann es mehrere Gr&uuml;nde geben:<\/p>\n<li>Eine Anweisung oder mehrere zusammenh&auml;ngende Anweisungen wiederholen sich.<\/li>\n<li>Eine Methode ist zu lang und enth&auml;lt Anweisungen, die man gruppieren und in einer eigenen Methode unterbringen kann.<\/li>\n<h3>Wiederholung von Anweisungen oder Gruppen von Anweisungen<\/h3>\n<p>Erstere Variante ist sicher jedem schon mal untergekommen, im einfachsten Fall in Form eines Einzeilers. <\/p>\n<p>Folgendes Beispiel &uuml;berpr&uuml;ft beispielsweise zweimal, ob ein bestimmtes Formular ge&ouml;ffnet ist, und verwendet dazu eine eingebaute Funktion mit wenig aussagekr&auml;ftigem Namen, deren Zweck sich erst aus dem Studium der Parameter ergibt (s. Quellcode 18).<\/p>\n<li>Hier gibt es mindestens drei Argumente f&uuml;r ein Extrahieren dieser Anweisung in eine eigene Methode:<\/li>\n<li>Die Funktion hat einen aussagekr&auml;ftigeren Namen verdient.<\/li>\n<li>Die Funktion tritt mehrmals auf, der Pflegeaufwand k&ouml;nnte reduziert werden.<\/li>\n<li>Die Funktion k&ouml;nnte man noch erweitern, um etwa die aktuelle Ansicht des Formulars zu ermitteln &#8211; das erfordert wesentlich weniger Aufwand, wenn es nur an einer Stelle erfolgen muss.<\/li>\n<p>Der exakt gleiche Aufruf der SysCmd-Funktion in diesem Beispiel k&ouml;nnte auf den ersten Blick auch dazu verleiten, eine tempor&auml;re Variable f&uuml;r das Ergebnis zu verwenden und die Funktion nur einmal aufzurufen &#8211; das w&auml;re aber sehr gef&auml;hrlich, da sich der Zustand des Formulars durchaus &auml;ndern k&ouml;nnte, w&auml;hrend die Routine abl&auml;uft.<\/p>\n<h3>Beschreibung der Vorgehensweise<\/h3>\n<p>Um die betreffenden Anweisungen in eine neue Methode zu extrahieren, gehen Sie folgenderma&szlig;en vor:<\/p>\n<li>Erstellen Sie eine neue Methode mit dem gew&uuml;nschten Namen. Verwenden Sie dabei eine Function- oder eine Sub-Prozedur &#8211; je nachdem, ob die Anweisung(en) einen R&uuml;ckgabewert liefern.<\/li>\n<li>Kontrollieren Sie, ob tempor&auml;re Variablen der alten Methode sowohl von den verbleibenden als auch von den zu extrahierenden Anweisungen verwendet werden. F&uuml;gen Sie diese der Methode als Parameter hinzu.<\/li>\n<li>Kontrollieren Sie, ob tempor&auml;re Variablen der alten Methode nur in den zu extrahierenden Anweisungen verwendet werden, und extrahieren Sie diese gegebenenfalls mit.<\/li>\n<pre>Public Function IstfrmBeispielGeoeffnet()\r\n    IstfrmBeispielGeoeffnet = SysCmd(acSysCmdGetObjectState, acForm, \"frmBeispiel\")\r\nEnd Function<\/pre>\n<p><b>Quellcode 19<\/b><\/p>\n<pre>Public Function IstFormularGeoeffnet(strFormular As String)\r\n    IstFormularGeoeffnet = SysCmd(acSysCmdGetObjectState, acForm, strFormular)\r\nEnd Function<\/pre>\n<p><b>Quellcode 20<\/b><\/p>\n<li>F&uuml;gen Sie die zu extrahierenden Anweisungen in die neue Methode ein.<\/li>\n<li>L&ouml;schen Sie die Anweisungen in der alten Methode.<\/li>\n<li>F&uuml;gen Sie den Aufruf der neuen Methode an Stelle der extrahierten Anweisungen ein. Vergessen Sie nicht, die Parameter anzugeben. (<\/li>\n<p>F&uuml;r unser Beispiel sieht das Ergebnis folgenderma&szlig;en aus &#8211; zuerst die alte Methode:<\/p>\n<pre>Public Sub MethodeExtrahieren_II()\r\n    If IstfrmBeispielGeoeffnet Then\r\n        ''...\r\n    End If\r\n    ''...\r\n    If IstfrmBeispielGeoeffnet Then\r\n        ''...\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die neue Methode sieht nun wie in Quellcode 19 aus. F&uuml;r diesen Zweck w&auml;re diese Konfiguration durchaus ausreichend, aber es macht nat&uuml;rlich keinen Sinn, eine Methode zu verwenden, die den Zustand genau eines festgelegten Formulars ermittelt.<\/p>\n<p>Damit die Funktion auch mit anderen Formularen arbeitet, ersetzen Sie den Namen des zu untersuchenden Formulars durch einen Parameter (s. Quellcode 20).<\/p>\n<p>Der Aufruf in der alten Methode sieht nun so aus:<\/p>\n<pre>If IstFormularGeoeffnet(\"frmBeispiel\") _    Then\r\n    ''...\r\nEnd If<\/pre>\n<h3>Lange und un&uuml;bersichtliche Methoden aufteilen<\/h3>\n<p>Das Extrahieren von Methoden dient nicht zwangsl&auml;ufig nur zum &#8222;Ausklammern&#8220; von Codeteilen. Es kann auch oft hilfreich sein, wenn eine Methode zu lang ist, um schnell verstanden zu werden. Ob und wann das so ist, k&ouml;nnen Sie schnell herausfinden, indem Sie pr&uuml;fen, ob der enthaltene Code dem Namen der Methode entspricht oder ob dort vielleicht viel mehr passiert, als der Name der Prozedur erahnen l&auml;sst. Wenn das der Fall ist, sollten Sie alle entsprechenden Teile des Codes in Methoden mit aussagekr&auml;ftigen Namen extrahieren.<\/p>\n<h2>Integrieren von Methoden<\/h2>\n<p>Der Inhalt mancher Methode ist so einfach und selbsterkl&auml;rend, dass eigentlich keine Methode mit einem eigenen Namen daf&uuml;r n&ouml;tig ist.<\/p>\n<p>In manchen F&auml;llen ist es daher sinnvoll, eine Methode aufzul&ouml;sen und die darin enthaltenen Anweisungen in die aufrufende Methode zu integrieren.<\/p>\n<p>Ob man eine Methode in eine andere integriert, h&auml;ngt auch davon ab, an wie vielen Stellen auf diese verwiesen wird. Passiert das oft, verlieren Sie durch die Integration die M&ouml;glichkeit, &auml;nderungen komfortabel an einer Stelle durchzuf&uuml;hren.<\/p>\n<pre>Public Function BeispielMethodeIntegrieren()\r\n    Dim intSumme As Integer\r\n    Dim intA As Integer\r\n    Dim intB As Integer\r\n    intA = 10\r\n    intB = 5\r\n    ''...\r\n    intSumme = Summe(intA, intB)\r\n    Debug.Print intSumme\r\nEnd Function\r\nPrivate Function Summe(intA As Integer, intB As Integer)\r\n    Summe = intA + intB\r\nEnd Function<\/pre>\n<p><b>Quellcode 21<\/b><\/p>\n<pre>Public Function BeispielMethodeIntegrieren()\r\n    Dim intSumme As Integer\r\n    Dim intA As Integer\r\n    Dim intB As Integer\r\n    intA = 10\r\n    intB = 5\r\n    ''...\r\n    intSumme = intA + intB\r\n    Debug.Print intSumme\r\nEnd Function<\/pre>\n<p><b>Quellcode 22<\/b><\/p>\n<p>Ist die Funktion der Methode hingegen so speziell, dass sie nur in einer Methode und dort auch nur wenige Male aufgerufen wird, kann man sie dort guten Gewissens integrieren. Das Beispiel aus Quellcode 21 enth&auml;lt den Aufruf einer mehr als trivialen Funktion, die dringend in die aufrufende Methode integriert werden sollte. Hier ersetzen Sie einfach den rechten Teil des Aufrufs durch den rechten Teil der einzigen Anweisung der Funktion (s. Quellcode 22). Die Funktion Summe k&ouml;nnen Sie anschlie&szlig;end entfernen.<\/p>\n<h3>Beschreibung der Vorgehensweise<\/h3>\n<p>Die Anwendung dieser Refactoring-Ma&szlig;nahme umfasst folgende Schritte:<\/p>\n<li>Ersetzen Sie alle Aufrufe durch den Inhalt der zu integrierenden Methode.<\/li>\n<li>Kommentieren Sie die zu integrierende Methode aus.<\/li>\n<li>Kompilieren Sie, um zu pr&uuml;fen, ob alle Aufrufe der Methode durch deren Inhalt ersetzt wurden.<\/li>\n<li>Entfernen Sie die auskommentierte Methode entg&uuml;ltig. (<\/li>\n<p>Achten Sie darauf, dass korrespondierende Parameter im Aufruf und in der ersten Zeile der Methode theoretisch unterschiedliche Namen haben k&ouml;nnen.<\/p>\n<p>Im diesem Beitrag haben wir Ihnen einige Ma&szlig;nahmen zur Verbesserung des Quellcodes vorgestellt, von denen Sie die eine oder andere &#8211; bewusst oder unbewusst &#8211; schon verwendet haben. Wenn Sie die Refactoring-Ma&szlig;nahmen konsequent anwenden, erhalten Sie gut lesbaren Code, den auch andere Entwickler leicht warten und weiterentwickeln k&ouml;nnen.<\/p>\n<p>Hin und wieder sollten Sie die vorgenommen &auml;nderungen hinsichtlich eventueller Performance-Einbu&szlig;en kontrollieren. In der Regel liegen diese aber in vernachl&auml;ssigbaren Bereichen und k&ouml;nnen in Kauf genommen werden.<\/p>\n<p>In den folgenden Ausgaben von Access im Unternehmen stellen wir Ihnen in loser Folge weitere Refactoring-Ma&szlig;nahmen vor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Refactoring ist eines der Schlagw&ouml;rter des Extreme Programming und untrennbar mit dem Unit-Testing und der testgetriebenen Entwicklung verbunden. Durch Refactoring verbessern Sie die Struktur und Lesbarkeit des Codes einer Anwendung unter Beibehaltung der Funktionalit&auml;t und erleichtern damit &Auml;nderungen und Erweiterungen der Funktion der Anwendung.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662004,66062004,44000025],"tags":[],"class_list":["post-55000241","post","type-post","status-publish","format-standard","hentry","category-662004","category-66062004","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Refactoring - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Refactoring\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Refactoring\" \/>\n<meta property=\"og:description\" content=\"Refactoring ist eines der Schlagw&ouml;rter des Extreme Programming und untrennbar mit dem Unit-Testing und der testgetriebenen Entwicklung verbunden. Durch Refactoring verbessern Sie die Struktur und Lesbarkeit des Codes einer Anwendung unter Beibehaltung der Funktionalit&auml;t und erleichtern damit &Auml;nderungen und Erweiterungen der Funktion der Anwendung.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Refactoring\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-06T15:17:52+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/4306b148f3824c4f836a527a79302104\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Refactoring\",\"datePublished\":\"2020-05-06T15:17:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/\"},\"wordCount\":3663,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/4306b148f3824c4f836a527a79302104\",\"articleSection\":[\"2004\",\"6\\\/2004\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/\",\"name\":\"Refactoring - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/4306b148f3824c4f836a527a79302104\",\"datePublished\":\"2020-05-06T15:17:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/4306b148f3824c4f836a527a79302104\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/4306b148f3824c4f836a527a79302104\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Refactoring\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Refactoring\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Refactoring - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Refactoring\/","og_locale":"de_DE","og_type":"article","og_title":"Refactoring","og_description":"Refactoring ist eines der Schlagw&ouml;rter des Extreme Programming und untrennbar mit dem Unit-Testing und der testgetriebenen Entwicklung verbunden. Durch Refactoring verbessern Sie die Struktur und Lesbarkeit des Codes einer Anwendung unter Beibehaltung der Funktionalit&auml;t und erleichtern damit &Auml;nderungen und Erweiterungen der Funktion der Anwendung.","og_url":"https:\/\/access-im-unternehmen.de\/Refactoring\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-06T15:17:52+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/4306b148f3824c4f836a527a79302104","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Refactoring","datePublished":"2020-05-06T15:17:52+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/"},"wordCount":3663,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/4306b148f3824c4f836a527a79302104","articleSection":["2004","6\/2004","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Refactoring\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/","url":"https:\/\/access-im-unternehmen.de\/Refactoring\/","name":"Refactoring - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/4306b148f3824c4f836a527a79302104","datePublished":"2020-05-06T15:17:52+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Refactoring\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/4306b148f3824c4f836a527a79302104","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/4306b148f3824c4f836a527a79302104"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Refactoring\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Refactoring"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000241"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000241\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}