Xcode-Profi-Features – Teil 2

Refactoring

Projekte entwickeln sich mit der Zeit. Und sie wachsen. Gerade in der Entwicklung von Apps scheint das ein Naturgesetz zu sein. Ich selbst spreche da aus langjähriger Erfahrung. Insbesondere eines meiner Projekte hat es in sich, an dem ich bereits seit Frühjahr 2015 (!) mit einem Kunden arbeite. Dabei setzen wir auf Meilensteine und haben im Laufe dieser bald vier Jahre nach und nach neue Funktionen ergänzt und bestehende erweitert und optimiert.

Als wir 2015 mit diesem Projekt starteten, war noch nicht abzusehen, wohin die Reise am Ende gehen und was für Features wir mit der Zeit integrieren würden. Es ist ein typisch agiles Projekt, das nach und nach wuchs und sich dabei auch an dem aktuellen Stand der Technik orientierte.

Doch warum erzähle ich euch das eigentlich? Weil eine ganz bestimmte Form der Arbeit enorm wichtig ist, insbesondere bei umfangreichen Projekten, die sich über Jahre hinweg erstrecken (aber auch kleine Projekte profitieren davon). Die Rede ist vom sogenannten Refactoring.

Code-Überarbeitung und -Optimierung

Einfach gesprochen beschreibt Refactoring das Überarbeiten bestehenden Codes und bestehender Projektstrukturen um diese zu optimieren und dem Status Quo anzugleichen. Dabei spielt Refactoring nicht nur bei Einführung neuer Technologien oder Betriebssystemupdates eine Rolle. Selbst in kurzen Entwicklungszyklen stellt man oft fest, dass man die umgesetzte Lösung – im Nachhinein betrachtet – auf andere Art und Weise besser und/oder eleganter hätte lösen können. Bereits hier bietet es sich an, den bestehenden Code zu „refactoren“ und ihn so bereits zeitnah zu optimieren, bevor man auf diesem Code weitere Funktionen aufbaut.

Bei diesem Refactoring-Prozess stellt uns Apples Entwicklungsumgebung Xcode erfreulicherweise einige hilfreiche Funktionen bereit, die das Optimieren bestehenden Codes erleichtern. In diesem Artikel möchte ich euch zeigen, wie ihr diese Funktionen aufrufen könnt und euch einen kleinen Überblick über die zur Verfügung stehenden technischen Möglichkeiten geben.

Refactoring-Funktionen in Xcode

Die Refactoring-Funktionen von Xcode lassen sich auf zwei Wegen erreichen. Der eine führt über das Xcode-Menü. Unter Editor -> Refactor findet sich eine Liste der verfügbaren Optionen, aus denen man wählen kann. Alternativ öffnet man innerhalb einer Source Code-Datei das Kontextmenü und wählt darin ebenfalls den Punkt Refactor aus.

Die Refactoring-Funktionen in Xcode erreicht man entweder über das Hauptmenü ...
Die Refactoring-Funktionen in Xcode erreicht man entweder über das Hauptmenü …
... oder über das Kontextmenü innerhalb einer Source Code-Datei
… oder über das Kontextmenü innerhalb einer Source Code-Datei

Die einzelnen Funktionen, die in den genannten Menüs aufgeführt sind, beziehen sich immer auf das in Xcode ausgewählte Element. Auf dem zweiten Screenshot beispielsweise ist der Name einer Klasse innerhalb ihrer Deklaration ausgewählt. Die einzige Refactoring-Option, die uns Xcode in diesem Fall bietet, ist das Umbenennen der Klasse (Rename …). Markiert man hingegen Code innerhalb einer Methode, bietet Xcode an, diesen in eine eigene Methode auszulagern (Extract Method).

Im Folgenden stelle ich euch eine kleine Auswahl dieser zur Verfügung stehenden Refactoring-Funktionen und deren jeweilige Aufgabe vor:

  • Rename …: Mit Rename … benennt man Elemente innerhalb einer Source Code-Datei um. Hierbei kommt Xcode mit jeder Art von Bezeichner zurecht; ob Klassenname, Methodenname, Parameter, Variable, Konstante, Property; man wählt schlicht das gewünschte Element aus und ruft die genannte Funktion auf, um das Element an allen Stellen innerhalb eines Projekts umzubenennen.
  • Extract Method: Während des Programmierens kommt es vor, dass sich eine Methode im Laufe der Zeit mehr und mehr aufbläht. In diesen Fällen ist es sinnvoll, die Befehle der Methode einmal zu überprüfen und möglicherweise in weitere einzelne Methoden zu untergliedern. Hierbei hilft die Refactoring-Funktion Extract Method. Hat man Befehle innerhalb einer Methode markiert, steht diese Funktion zur Verfügung und packt bei Ausführung alle markierten Befehle in eine neue eigene Methode. Der gibt man einen passenden Namen und Xcode sorgt automatisch dafür, dass sie aus der ursprünglichen Methode heraus aufgerufen wird.
  • Add Missing Protocol Requirements: Definiert man einen Typ, der konform zu einem bestimmten Protokoll ist, lassen sich mit diesem Befehl alle Eigenschaften und Funktionen implementieren, die im Protokoll definiert und nicht optional sind. Das erspart einem das Suchen nach entsprechenden Eigenschaften und Funktionen innerhalb der Dokumentation des jeweiligen Protokolls.
  • Wrap in NSLocalizedString: Markiert man einen String und wählte diese Funktion aus, wird er in einen NSLocalizedString gepackt; ideal, um im Nachhinein Übersetzungen an Strings durchzuführen.

Es gibt noch weitere Funktionen, wobei den meisten gemein ist, dass sich nach ihrem Aufruf ein neues Fenster öffnet. Darin listet Xcode auf, an welchen Stellen eines Projekt sich die gewünschte Änderung auswirkt. Beim Umbenennen von Elementen trägt man in diesem Fenster auch den gewünschten neuen Bezeichner ein.

Die Refactoring-Funktion zum Umbenennen eines Elements führt alle Stellen auf, an denen sich die Änderung des Bezeichners auswirkt.
Die Refactoring-Funktion zum Umbenennen eines Elements führt alle Stellen auf, an denen sich die Änderung des Bezeichners auswirkt.

Lediglich Refactoring-Funktionen wie beispielsweise Add Missing Protocol Requirements verzichten auf diesen Zwischenschritt und werden direkt ausgeführt.

Fazit

An Refactoring führt in der App-Entwicklung kaum ein Weg vorbei. Projekte werden entweder im Laufe der Zeit immer größer und komplexer oder man stellt einfach fest, dass ein ursprünglicher Lösungsansatz auf andere Art und Weise eleganter und verständlicher gelöst werden kann. In jedem Fall helfen einem dann die verschiedenen Refactoring-Werkzeuge von Xcode weiter. Gerade rudimentäre Funktionen, die gleichzeitig große Auswirkungen auf ein Projekt haben (beispielsweise das Umbenennen von Klassen oder Properties oder das Extrahieren von Befehlen in eine eigene separate Methode) erleichtern den Entwickleralltag enorm.

Euer Thomas


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert