Simple Science

Hochmoderne Wissenschaft einfach erklärt

# Computerwissenschaften# Software-Entwicklung

Refactoring lange Methoden für besseren Code

Lern, Code zu vereinfachen, indem du lange Methoden in handhabbare Aufgaben aufteilst.

― 7 min Lesedauer


Verbessere jetzt deinenVerbessere jetzt deinenCodeCode.Lange Methoden umschreiben für klareren
Inhaltsverzeichnis

In der Softwareentwicklung gibt's oft das Problem mit langen Methoden oder Funktionen, die einfach zu viele Dinge auf einmal machen. Das kann die Programme schwer lesbar und wartbar machen. Eine gute Praxis beim Programmieren ist, das Prinzip der Einzelverantwortung (SRP) zu befolgen, was besagt, dass jeder Codeabschnitt nur einen Grund haben sollte, sich zu ändern. Wenn eine Methode zu viele Verantwortlichkeiten hat, kann das Probleme verursachen, wenn Änderungen notwendig sind.

Die Herausforderung besteht darin, diese langen Methoden in kleinere aufzuteilen, die jeweils nur eine Aufgabe übernehmen. Dieser Prozess wird als "Extract Method Refactoring" bezeichnet. In diesem Artikel stellen wir eine neue Methode vor, um dieses Refactoring mit etwas namens output-based Slicing zu machen. Diese Methode konzentriert sich auf die Ausgaben, die von jedem Teil des Codes erzeugt werden, was es einfacher macht, herauszufinden, welche Aufgaben in ihre eigenen Methoden getrennt werden können.

Verantwortlichkeiten im Code verstehen

Im Herzen der Programmierung steht die Idee von Verantwortlichkeiten. Jede Methode oder Funktion hat eine Verantwortung, die sie erfüllen muss. Zum Beispiel könnte sie einen Wert berechnen, Daten aus einer Datei lesen oder Informationen an den Benutzer anzeigen. Wenn eine Methode zu viele Verantwortlichkeiten übernimmt, kann sie unübersichtlich und verwirrend werden.

Das Prinzip der Einzelverantwortung besagt, dass eine Methode nur eine Sache gut machen sollte. Wenn Entwickler sich an dieses Prinzip halten, können sie ihren Code einfacher verstehen und warten. Wenn eine Methode geändert werden muss, ist klar, wo die Änderung passieren sollte. Ausserdem erleichtert es das Testen des Codes, da jede Methode unabhängig getestet werden kann.

Das Problem mit langen Methoden

Lange Methoden kombinieren oft mehrere Aktionen und können schwer nachzuvollziehen sein. Sie beinhalten möglicherweise mehrere Ausgabepunkte, wie zum Beispiel einen Rückgabewert, das Ausgeben auf der Konsole oder das Speichern von Daten in einer Datei. Wenn eine Methode zu viel macht, wird es schwierig festzustellen, wo Änderungen vorgenommen werden sollten, wenn sich die Anforderungen ändern.

Nehmen wir als Beispiel eine Methode, die Statistiken berechnet und sie dann auf der Konsole ausgibt und gleichzeitig in einer Datei speichert. Wenn das Ausgabeformat sich ändern muss, kann das auch beeinflussen, wie die Daten gespeichert werden. Diese Verflechtung macht den Code schwieriger zu handhaben.

Methoden zur Klarheit extrahieren

Extract Method Refactoring ist eine Technik, die verwendet wird, um lange Methoden zu vereinfachen. Das Ziel ist es, verschiedene Aufgaben innerhalb der Methode zu identifizieren und separate Methoden für jede Aufgabe zu erstellen. Dadurch wird der Code sauberer und die Verantwortlichkeiten werden klarer getrennt.

Zum Beispiel könnte eine Methode, die den Durchschnitt berechnet und ausgibt, in zwei Methoden aufgeteilt werden: eine für die Berechnung des Durchschnitts und eine andere für die Ausgabe. Mit diesem Ansatz würde eine Änderung im Ausgabeverfahren nicht die Berechnung des Durchschnitts beeinflussen.

Einführung in das output-based Slicing

Um den Prozess des Extract Method Refactoring zu verbessern, schlagen wir vor, output-based Slicing zu verwenden. Dieser Ansatz betrachtet die Ausgaben, die von einer Methode erzeugt werden, und identifiziert Teile des Codes, die unabhängig extrahiert werden können. Durch die Fokussierung auf das, was eine Methode produziert, können wir leichter bestimmen, wo im Code Schnitte vorgenommen werden sollten.

Was sind Ausgaben?

Ausgaben sind die Ergebnisse, die von einer Methode produziert werden. Dazu gehören:

  • Rückgabewerte: Was die Methode zurücksendet, wenn sie aufgerufen wird.
  • Konsolenausgaben: Informationen, die dem Benutzer angezeigt werden.
  • Änderungen an globalen Variablen: Werte, die von anderen Teilen des Codes aus zugänglich sind.
  • Daten, die in Dateien oder Datenbanken gespeichert werden: Informationen, die später abgerufen werden können.

Indem wir definieren, welche Ausgaben eine Methode erzeugt, können wir unterschiedliche Verantwortlichkeiten bestimmen. Jede Ausgabe kann einer spezifischen Aufgabe entsprechen, die die Methode erfüllt.

Wie funktioniert output-based Slicing?

Output-based Slicing umfasst mehrere Schritte:

  1. Ausgaben identifizieren: Zunächst alle Ausgaben finden, die von der Methode erzeugt werden.
  2. Slicing-Kriterien festlegen: Für jede Ausgabe Kriterien definieren, die festlegen, welche Teile des Codes zur Erzeugung dieser Ausgabe beitragen.
  3. Rückwärtsschnitte berechnen: Den Code rückwärts von jeder Ausgabe analysieren, um alle Anweisungen zu finden, die sie beeinflussen. Dieser Prozess hebt die Teile des Codes hervor, die für die Ausgaben verantwortlich sind.
  4. Kandidaten für Methoden extrahieren: Neue Methoden basierend auf diesen Rückwärtsschnitten erstellen. Jede neue Methode wird eine einzelne Verantwortung im Zusammenhang mit ihrer Ausgabe übernehmen.

Dieser Ansatz hilft, Abschnitte des Codes zu identifizieren, die zu unabhängigen Methoden gemacht werden können, und stellt sicher, dass jede Methode dem Prinzip der Einzelverantwortung folgt.

Evaluierung des Extract Method Refactoring

Um die Effektivität unseres output-based Slicing-Ansatzes zu bewerten, haben wir ihn mit bestehenden Tools verglichen, die das Extract Method Refactoring automatisieren. Wir haben Tests an verschiedenen Open-Source-Softwareprojekten durchgeführt und bewertet, wie gut jedes Tool bei der Identifizierung potenzieller Methodenauslagerungen abschneidet.

Erfolg messen

Der Erfolg des Extract Method Refactoring kann anhand von Metriken wie folgt quantifiziert werden:

  • Präzision: Der Anteil der vorgeschlagenen Auslagerungen, die gültig sind.
  • Recall: Der Anteil der tatsächlichen Refactoring-Möglichkeiten, die korrekt identifiziert wurden.
  • Zusammenhaltsverbesserungen: Veränderungen in der Verwandtschaft der Anweisungen in Methoden nach dem Refactoring.

Indem wir diese Faktoren messen, können wir bestimmen, ob output-based Slicing bessere Ergebnisse als frühere Methoden liefert.

Ergebnisse der Evaluation

Nach Durchführung unserer Experimente haben wir mehrere wichtige Ergebnisse festgestellt:

  1. Höhere Präzision und Recall: Die Methode des output-based Slicing zeigte im Durchschnitt eine Verbesserung sowohl in der Präzision als auch im Recall im Vergleich zu traditionellen Methoden.
  2. Verbesserte Kohärenzmetriken: Nach der Anwendung unseres Refactoring-Tools verbesserte sich die Kohärenz des Codes deutlich, was darauf hinweist, dass die Methoden fokussierter wurden.
  3. Benutzerfeedback: Entwickler, die unser Tool verwendet haben, berichteten, dass die gelieferten Vorschläge passend und nützlich waren. Viele äusserten eine Vorliebe, unser Tool in zukünftigen Projekten zu verwenden.

Diese Ergebnisse deuten darauf hin, dass output-based Slicing den Prozess des Refactorings von langen Methoden erheblich verbessern kann, wodurch Entwickler klareren und wartungsfreundlicheren Code produzieren können.

Auswirkungen auf die Softwareentwicklung

Die Ergebnisse unserer Studie haben wichtige Auswirkungen auf Softwareentwickler und -teams:

  • Verbesserte Lesbarkeit: Durch das Zerlegen von Methoden in kleinere, sinnvollere Teile steigt die Lesbarkeit des Codes insgesamt. Entwickler können schnell erfassen, was jede Methode macht.
  • Easier Maintenance: Wenn der Code mit klaren Verantwortlichkeiten organisiert ist, wird die Wartung einfacher. Anpassungen können in einer Methode vorgenommen werden, ohne dass Risiken für Nebenwirkungen in einer anderen bestehen.
  • Bessere Tests: Kleinere Methoden sind einfacher unabhängig zu testen. Das führt zu verbesserter Softwarequalität und weniger Bugs.

Fazit

Zusammenfassend lässt sich sagen, dass die Einhaltung des Prinzips der Einzelverantwortung in der Softwareentwicklung entscheidend für die Erstellung von handhabarem und verständlichem Code ist. Unser Ansatz des output-based Slicing bietet eine neue Möglichkeit, Methoden zu extrahieren, indem er sich auf die Ausgaben konzentriert, die von jedem Codeabschnitt erzeugt werden. Dadurch können wir den Prozess des Refactorn von langen Methoden klarer und effektiver gestalten.

Dieses Tool verbessert nicht nur die Qualität des Codes, sondern hilft Entwicklern auch, indem es den Refactoring-Prozess vereinfacht. Da Softwareprojekte in ihrer Komplexität zunehmen, werden Methoden wie output-based Slicing immer wertvoller, um den Code sauber und handhabbar zu halten.

Originalquelle

Titel: Supporting single responsibility through automated extract method refactoring

Zusammenfassung: The responsibility of a method/function is to perform some desired computations and disseminate the results to its caller through various deliverables, including object fields and variables in output instructions. Based on this definition of responsibility, this paper offers a new algorithm to refactor long methods to those with a single responsibility. We propose a backward slicing algorithm to decompose a long method into slightly overlapping slices. The slices are computed for each output instruction, representing the outcome of a responsibility delegated to the method. The slices will be non-overlapping if the slicing criteria address the same output variable. The slices are further extracted as independent methods, invoked by the original method if certain behavioral preservations are made. The proposed method has been evaluated on the GEMS extract method refactoring benchmark and three real-world projects. On average, our experiments demonstrate at least a 29.6% improvement in precision and a 12.1% improvement in the recall of uncovering refactoring opportunities compared to the state-of-the-art approaches. Furthermore, our tool improves method-level cohesion metrics by an average of 20% after refactoring. Experimental results confirm the applicability of the proposed approach in extracting methods with a single responsibility.

Autoren: Alireza Ardalani, Saeed Parsa, Morteza Zakeri-Nasrabadi, Alexander Chatzigeorgiou

Letzte Aktualisierung: 2023-11-26 00:00:00

Sprache: English

Quell-URL: https://arxiv.org/abs/2305.03428

Quell-PDF: https://arxiv.org/pdf/2305.03428

Lizenz: https://creativecommons.org/licenses/by/4.0/

Änderungen: Diese Zusammenfassung wurde mit Unterstützung von AI erstellt und kann Ungenauigkeiten enthalten. Genaue Informationen entnehmen Sie bitte den hier verlinkten Originaldokumenten.

Vielen Dank an arxiv für die Nutzung seiner Open-Access-Interoperabilität.

Mehr von den Autoren

Ähnliche Artikel