.

Welche Refactoring-Techniken und -Tools sollten Sie verwenden?

Refactoring ist ein Prozess von Änderungen, der es Ihnen letztendlich ermöglicht, einen Code zu erreichen, der lesbar, leicht zu entwickeln und zu warten ist. Während dieser Verbesserungen sollte sich das Verhalten nicht ändern. Daher sollten Sie das Thema mit viel Vorsicht und Überlegung angehen.

Refactoring-Techniken

Es gibt viele spezifische Methoden, um einzelne Elemente einer Anwendung zu refaktorisieren. Die Auswahl geeigneter Techniken für das betrachtete Problem ist entscheidend für die optimale Durchführung des Prozesses. Eine der grundlegenden Regeln ist, dass der Code nach dem Refactoring sauberer sein muss und alle Tests bestehen müssen. Neue Funktionalitäten sollten während des Prozesses absolut nicht eingeführt werden.

Refactoring-Techniken sind zahlreich, oder sogar sehr zahlreich. In diesem Artikel listen wir einige davon auf. Nicht jede Methode ist auf alle Programmiersprachen anwendbar. Refactoring-Techniken werden je nach dem gelösten Problem in Gruppen unterteilt.

Extraktion, Zusammensetzung und Vereinfachung von Methoden und Aufrufen

Wenn Ihr Code lange, komplizierte und schwer zu wartende Methoden und viele Verantwortlichkeiten enthält, wird Ihnen diese Gruppe von Refactoring-Techniken helfen, ihn zu bereinigen.

Extraktion der Methode

Wenn die Methode lang und schwer verständlich ist, sollte der spezifisch gruppierbare Teil getrennt und in eine separate Methode übertragen werden.

Vor dem Refactoring:

public function printVariables() {
  $this->printFoo();

  print "bar: " . $this->bar;
  print "foobar: " . $this->foobar;
}

Nach dem Refactoring:

public function printAll() {
  $this->printFooRelated();
  $this->printBarRelated();
}

public function printBarRelated() {
  print “bar: “ . $this->bar;
  print “foobar: “ . $this->foobar;
}

Extraktion der Variable

Während des Refactoring-Prozesses können wir auf komplexe Ausdrücke stoßen, die auf den ersten Blick schwer verständlich sind. In diesem Fall versuchen wir, einzelne Teile des Ausdrucks zu trennen und in Variablen zu überführen.

Vor dem Refactoring:

if ($item->isPriceSet() && $item->getPrice() <= 100 && $user->isUserLoggedIn() && $this->isUserAllowedToBuy()) {
  $this->redirectToBuyForm();
}

Nach dem Refactoring:

$isUserAllowed = $user->isUserLoggedIn() && $this->isUserAllowedToBuy();
$isPriceAcceptable = $item->isPriceSet() && $item->getPrice() <= 100;

if ($isUserAllowed && $isPriceAcceptable) {
  $this->redirectToBuyForm();
}

Inline-Methode

Wenn eine Methode nur einmal verwendet wird, klein ist und ihr Inhalt mehr aussagt als die Methode selbst, können wir in Betracht ziehen, den Inhalt der Methode an die Stelle zu übertragen, an der sie aufgerufen wird.

Vor dem Refactoring:

public function getFoo() {
  return $this->bar() ? self::FOO : self::FOOBAR;
}

public function bar() {
  return $this->foo === ‘bar’;
}

Nach dem Refactoring:

public function getFoo() {
  return $this->foo === ‘bar’ ? self::FOO : self::FOOBAR;
}

Verschieben von Features zwischen Objekten

Wenn es in der refaktorisierten Funktionalität eine Methode gibt, die häufiger in einer anderen Funktionalität verwendet wird, sollten Sie die Methode in die Klasse übertragen, die sie am meisten nutzt. Wenn es eine Methode ist, die an vielen Stellen verwendet wird - und die Klasse, die sie implementiert, auch andere Verantwortlichkeiten enthält - sollten Sie die Methode in eine eigene Klasse auslagern. Wenn die Aufgabe einer gegebenen Methode nur darin besteht, eine andere Methode aufzurufen, nennen wir sie Middle Man, ihr Wert ist null und wir sollten sie löschen.

Datenorganisation

Diese Kategorie umfasst alle Refactoring-Methoden, die sich auf die Organisation des Codes konzentrieren. Die Verwendung der in diesem Abschnitt enthaltenen Methoden macht den Code lesbarer und besser organisiert.

Felder kapseln

Alle öffentlichen Felder einer Klasse sollten in private umgewandelt werden, es sei denn, es gibt einen guten Grund, dies nicht zu tun. Der Zugriff auf das Schreiben und Lesen ihrer Werte sollte über Getter und Setter erfolgen.

Vor dem Refactoring:

class Foo {
  public $bar;
}

Nach dem Refactoring:

class Foo {
  private $bar;

  public function getFoo() {
    return $this->bar;
  }

  public function setFoo($value) {
    $this->bar = $value;
  }
}

Ersetzen von magischen Zahlen durch Konstanten

Für Entwickler, die die Funktionalität schreiben, mag ein Teil davon offensichtlich sein, doch nach ein paar Monaten wird dies nicht mehr der Fall sein. Dies ist wichtig zu beachten, wenn man den Code schreibt. Viele Menschen vergessen es und hinterlassen Strings und Zahlen im Code in primitiver Form, was verhindert, dass neue Personen den Code vollständig verstehen. Während des Refactoring-Prozesses sollten alle "magischen Zahlen" durch Konstanten mit prägnanten, aber aussagekräftigen Namen ersetzt werden.

Vor dem Refactoring:

class Foo {
  public function isUnderLimit() {
    return $this->bar <= 20; 
  }
}

Nach dem Refactoring:

class Foo {
  const BAR_LIMIT = 20;

  public function isUnderLimit() {
    return $this->bar <= self::BAR_LIMIT; 
  }
}

Refactoring-Tools

Es gibt eine Reihe von Tools, die Ihnen beim Refactoring-Prozess helfen. Machen Sie sich mit den Funktionen in Ihrem Code-Editor vertraut. Viele der neuen IDEs haben solche Tools integriert oder als kostenlose Plugins verfügbar. Weitere hilfreiche Funktionen, die Ihnen ermöglichen, besseren Code zu schreiben, sind:

  • Code Sniffer - überprüfen die Einhaltung von Standards im Code,
  • statische Code-Analyse - analysieren das Verhalten des Codes statisch und ermöglichen es Ihnen, Fehler zu erkennen, bevor der Code ausgeführt wird.

In der Programmiersprache PHP sind die am häufigsten verwendeten php_codesniffer und phpstan.

Refactoring-Techniken - Zusammenfassung

Der Code-Refactoring-Prozess muss ordnungsgemäß geplant und von einer Reihe von Aktionen zur Optimierung begleitet werden. Diese Tools und Techniken, kombiniert mit einem Verständnis dafür, welche Teile der Anwendung problematisch sind, stellen sicher, dass das Refactoring ganzheitlich und korrekt durchgeführt wird. Die hier vorgestellten Tools und Techniken sind nur ein Überblick über Lösungen, die von der gesamten Softwareentwicklungs-Community entwickelt wurden. Wenn Sie Hilfe bei der Auswahl dieser Arten von Lösungen und der Durchführung des Refactoring-Prozesses benötigen, können wir dies im Rahmen der PHP-Entwicklung übernehmen.

As part of Drupal support, we maintain existing websites and expand them with new functionalities