Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Methode extrahieren

Grnde fr das Extrahieren einer Methode aus bestehendem Code gibt es mehrere: Eine Methode kann entweder zu lang und unbersichtlich geworden sein oder mehrere Methoden knnen eine Folge gleicher oder hnlicher Anweisungen enthalten, die in eine neue Methode extrahiert werden knnen.

Beispieldatenbank

Die Beispiele fr den Code vor und nach dem Refactoring finden Sie in den Klassenmodulen der Formulare frmVerteiler und frmVerteiler_NoRefactoring der Datenbank AccessSQLDotNet.mdb.

 

Vorgehensweise

Um eine Methode zu extrahieren, gehen Sie folgendermaen vor:

1. Legen Sie eine neue Methode mit dem gewnschten Prozedurnamen an.

2. Kopieren Sie die Anweisungen aus der bestehenden in die neue Methode.

3. Ersetzen Sie die Anweisungen in der bestehenden Methode durch den Aufruf der neuen Methode.

4. Testen Sie, ob alles noch so funktioniert wie vor dem Refactoring.

Das ist natrlich nicht immer so einfach, denn die neue Methode kann beispielsweise die bergabe von Variablen erfordern oder Variable bearbeiten, die anschlieend von der aufrufenden Methode weiterverwendet werden mssen.

Das nachfolgende Beispiel beschreibt das Extrahieren einer Methode mit der bergabe einer Variablen.

Beispiel: Extrahieren von Anweisungen, die von mehreren Methoden genutzt werden

Das Beispiel bezieht sich auf das in der Beitragsreihe m:n-Beziehungen per Listenfeld managen (Teil 1, Teil 2) beschriebene Formular.

Die beiden folgenden Prozeduren enthalten eine Menge gemeinsamen Code:

Private Sub cmdAlleAusVerteilerEntfernen_Click()

    On Error Resume Next

    Dim db As DAO.Database

    Set db = CurrentDb

    db.Execute "DELETE FROM tblVerteiler " _

        & "WHERE PublikationID = " & Me!PublikationID

    Me!lstImVerteiler.Requery

    Me!lstNichtImVerteiler.Requery

    Set db = Nothing

End Sub

Private Sub cmdAlleZuVerteilerHinzufuegen_Click()

    Dim db As DAO.Database

    Set db = CurrentDb

    db.Execute "INSERT INTO tblVerteiler(PublikationID, KontaktID)" _

        & " SELECT " & Me.PublikationID & " AS PublikationID, " _

        & "KontaktID FROM tblKontakte"

    Me!lstImVerteiler.Requery

    Me!lstNichtImVerteiler.Requery

    Set db = Nothing

End Sub

Von diesen Methoden enthlt das Formular noch vier weitere, der einzige Unterschied sind die unterschiedlichen SQL-Anweisungen. Diese spiegeln sich in der neuen Methode in der Variablen strSQL wieder:

Private Sub VerteilerAendern(strSQL As String)

    On Error Resume Next

    Dim db As DAO.Database

    Set db = CurrentDb

    db.Execute strSQL

    Me!lstImVerteiler.Requery

    Me!lstNichtImVerteiler.Requery

    Set db = Nothing

End Sub

Die beiden oben vorgestellten Methoden erleichtern Sie um die entsprechenden Zeilen und fgen stattdessen einen Aufruf der neuen Methode mit der jeweiligen SQL-Anweisung hinzu. Die Prozeduren sehen nun wie folgt aus:

Private Sub cmdAlleAusVerteilerEntfernen_Click()

    VerteilerAendern "DELETE FROM tblVerteiler " _

        & "WHERE PublikationID = " & Me!PublikationID

End Sub

Private Sub cmdAlleZuVerteilerHinzufuegen_Click()

    VerteilerAendern "INSERT INTO tblVerteiler(PublikationID, KontaktID) " _

        & "SELECT " & Me.PublikationID & " AS PublikationID, " _

        & "KontaktID FROM tblKontakte"

End Sub

Die Prozeduren enthalten nur noch je eine Anweisung, die zum Aufruf der Methode VerteilerAendern und der bergabe der entsprechenden SQL-Anweisung dient.

Gewinn

Mit diesem Refactoring haben Sie rein oberflchlich betrachtet den Code von 48 auf 26 Zeilen reduziert - immerhin auf fast 50%. Bezogen auf die reinen Anweisungen ergibt sich sogar eine Reduzierung von 36 auf 13 Zeilen.

Nebenher haben knnen Sie nderungen, die alle sechs ursprnglichen Prozeduren betroffen htten, an einer Stelle durchfhren. Dadurch reduziert sich natrlich auch der Aufwand fr die Suche nach eventuellen Fehlern.

© 2003-2015 André Minhorst Alle Rechte vorbehalten.