Oh, ich liebe schnelle und einfache Texteditoren. Als Linux-Benutzer lebte ich jahrelang in der Firma von Kate und KWrite. Mit einigen Verbesserungen und Plugins konnte ich sie wirklich schlau machen. In diesen Editoren habe ich ganze Projekte in Perl, Bash und sogar in PHP und Java geschrieben. Ich kann die Begeisterung schätzen, die Sublime Text oder TextMate durchläuft, aber ich könnte heute nicht ohne eine voll entwickelte IDE leben.
Ich habe beobachtet, dass es zwei Arten von Programmierern gibt. Die erste Art tendiert dazu, Anwendungen zu verwenden, die eine größere und größere Produktivität bei der Code-Manipulation bieten, jedoch auf Kosten der abrupten Lernkurve und der Schwierigkeiten bei der Verwendung. Diese Programmierer bevorzugen Vi (m) oder Emacs.
Die zweite Kategorie von Programmierern tendiert dazu, von einfachen Editoren zu IDEs zu wechseln. Dies ist für eine Evolution ebenso selbstverständlich wie die erste Kategorie. Dies führt jedoch zu einer anderen Denkweise und einer anderen Sicht auf das Projekt und den Code. Ich bin ein Programmierer aus dieser Kategorie. In diesem Artikel werden wir über die IDE sprechen, die ich momentan verwende: PhpStorm.
Tools und Benutzereinstellungen für Anwendungen sind so unbeständig, dass ich selten über ein bestimmtes Framework oder eine bestimmte Anwendung schreibe. Wenn Sie jedoch täglich 10 bis 14 Stunden eine Anwendung verwenden, wird sie zu einem Teil von Ihnen, zu Ihrem Code und Ihren Projekten. Sie wird zur Autobahn für Ihren täglichen Arbeitsablauf. Es verdient also erwähnt und präsentiert zu werden.
Ich habe einen schnellen Texteditor aufgerufen, wenn ich nur ein kurzes Skript oder ein Programm schreiben musste. Aber ich nicht mehr. Heutige Computer und IDEs sind so schnell, dass es kaum einen Unterschied gibt zwischen dem Starten von PhpStorm und dem Schreiben des Codes oder dem Starten von KWrite und dem Schreiben des Codes. Die Anwendung selbst ist fast so schnell wie ein Editor, und das Erstellen eines Projekts ist selbst für eine oder zwei tatsächliche Dateien nicht langsamer als die Erstellung derselben Datei in Ihrem Editor.
OK, OK… Das sind alles Ähnlichkeiten. Aber worum geht es bei dieser IDE? IDE stammt aus der integrierten Entwicklungsumgebung. Dieser Ausdruck besteht aus zwei Hauptteilen: integriert und Entwicklungsumgebung. Der Teil der Entwicklungsumgebung kann als Editor und als spezifische Funktionen für die Bearbeitung von Quellcode betrachtet werden: Code-Schreibfunktionen, Hervorheben, automatische Vervollständigung, komplexe Bearbeitungsfunktionen wie Multi-Select- und Multi-Edit-Funktionen, Refactoring-Tools usw. Der Integrationsteil kann als Integration zwischen der oben beschriebenen Entwicklungsumgebung und verschiedenen externen Tools, Testframeworks, Dokumentversionssystem, Debugger und UI-Builder-Tools betrachtet werden.
Das Hauptmerkmal einer IDE ist das Verständnis des Codes, den Sie schreiben. Eine IDE hat nicht nur eine Liste von Befehlen, die Sie in Ihrer bevorzugten Sprache wie PHP verwenden können. Es verfügt über komplexe Algorithmen, um Ihren Code zu verstehen. PhpStorm schlägt Ihnen keinen Befehl oder Ausdruck vor, der syntaktisch nicht korrekt ist. Es weiß zum Beispiel, dass Sie nicht schreiben können "drucken ("Hallo Welt");
"direkt in einer Klasse, ohne sie in eine Funktion einzufügen. So schlägt sie nicht die"drucken()
"Befehl, wenn es nicht verwendet werden kann. Aber dies ist nur die Spitze des Eisbergs. Sehen wir uns einige konkrete Beispiele an.
Ja. Wenn Sie die ersten beiden Teile der Refactoring-Legacy-Code-Reihe The Golden Master und Magic Strings & Constants gelesen haben, haben Sie möglicherweise festgestellt, dass im Tutorial Screenshots mit einer IDE angezeigt werden. So sieht mein PhpStorm aus. Und im Folgenden hilft mir PhpStorm beim Programmieren.
Das ist wichtig. Die meisten einfachen Editoren können auch grundlegende Code-Hervorhebungen ausführen, aber eine IDE ist eine andere Geschichte. Hier können Sie unterschiedliche Hervorhebungs-Setups für verschiedene Sprachen wie PHP, HTML, CSS usw. einrichten. Jeder mit seinen eigenen Regeln. Zum Beispiel möchte ich Strings grün in CSS und orange in PHP und HTML haben.
Auf der linken Seite sehen Sie alle unterstützten Dateitypen und -sprachen (einige können durch Plugins hinzugefügt werden). In der Mitte sehen Sie die verschiedenen PHP-Sprachelemente, die separat konfiguriert werden können. In der oberen rechten Ecke finden Sie die Optionen für jedes Element haben kann, und am unteren Rand gibt es eine Vorschau.
Als wir in unserer Refactoringsitzung nach magischen Saiten suchten, konnten wir diese Saiten leicht erkennen, indem wir einfach oranges Zeug auf dem Bildschirm finden. Gleiches gilt für magische Konstanten und Zahlen. Als diese gesucht wurden, war die blaue Farbe unser Freund.
Struktur und Layout sind von grundlegender Bedeutung, wenn wir den Quellcode verstehen müssen. In diesem Zusammenhang ist auch die richtige Farbgebung und Hervorhebung von Bedeutung.
Ich habe während meiner gesamten Karriere viele IDEs und Redakteure verwendet. Die, die ich wirklich mochte und schätzte, waren NetBeans. Aber nach etwa fünf Jahren exklusiver Nutzung von NetBeans musste ich es aufgeben. Es gibt etwas, was PhpStorm bieten kann, was kein anderer Editor oder IDE für PHP kann. Dies ist eine Reihe von Refactoring-Tools, die in unserer täglichen Arbeit benötigt werden.
Hervorheben, Einrücken, Projektmanagement, Vorlagen und Makros sind alles Funktionen, die in den meisten Editoren zu finden sind. Integrationen in Testumgebungen und Debugger sind definitionsgemäß Bestandteil jeder IDE. Intelligente und komplexe Refactoring-Tools sind jedoch eine völlig andere Geschichte.
Als Programmierer verbringen wir die Hälfte unserer Zeit damit, Code zu lesen, etwa 40%, vorhandenen Code zu modifizieren und umzugestalten. Wenn wir Glück haben, können wir wirklich neuen Code schreiben. Mit guten, schnellen und zuverlässigen Refactoring-Funktionen können wir uns daher mehr auf das Refactor konzentrieren und weniger darauf, wie es gemacht wird. Wir werden auch Zeit sparen, aber ich halte den Gewinn an weniger Aufwand für viel wichtiger. Wenn Sie den Gedanken über den Prozess in Ihre IDE verwerfen können und nur über Logik, Algorithmus, Abhängigkeiten und SOLID-Prinzipien nachdenken, ist dies ein Produktivitätszuwachs, der berücksichtigt werden muss.
Aus diesem Grund habe ich die kostenlosen und Open-Source-NetBeans für den bezahlten PhpStorm hinterlassen. In PhpStorm gibt es eine Reihe von Refactoring-Tools, die es besonders machen und es sich lohnt, dafür zu bezahlen.
Eine der einfachsten Umgestaltungen, mit denen wir bereits in Magic Strings & Constants gearbeitet haben, war "Local Variable einführen", auch "Variable extrahieren" genannt. Hier eine Erinnerung mit den Schritten, die wir zur Verwendung dieses Refactorings ergreifen müssen:
Diese Schritte sind leicht zu befolgen, wenn wir einen einzelnen Wert haben, der in eine Variable umgewandelt werden soll, aber wie sieht es mit Schritt zwei aus? Wie finden Sie zuverlässig alle Vorkommen dieses Wertes? Sie müssen Ihren Code analysieren und bewusst entscheiden, was ersetzt werden soll und was nicht. Hier ist ein Beispiel.
class SomeClass function printAPairOfPlayers () echo "Spieler sind:"; echo "Spielername:". $ this-> getRandomPlayerName (); echo "Spielername:". $ this-> getRandomPlayerName (); function printOnePlayer () echo "Spielername:". $ this-> getRandomPlayerName (); function getRandomPlayerName () // Logik zum Finden von Spielernamen // zurückgeben $ playerName;
Im printAPairOfPlayers ()
Wir können beobachten, dass die Zeichenfolge "Spielername:
"wiederholt sich zweimal. Wenn diese Zeichenfolge in eine lokale Variable, eine Variable innerhalb der Funktion, extrahiert werden soll, müssen wir beide Vorkommen in ersetzen printAPairOfPlayers ()
aber nicht der in printOnePlayer ()
. Ob printOnePlayer ()
wäre 100 Zeilen darunter, können wir nicht einmal erkennen, dass es eine andere Verdoppelung der Zeichenfolge in einer anderen Methode gibt.
Wir wollen also eine lokale Variable. Wir erstellen zuerst die Variable, führen die Tests durch, suchen dann nach der Zeichenfolge und finden sie in der zweiten Echo
Aussagen. Wir ersetzen es, führen die Tests durch, wir schauen noch einmal, wir finden es im letzten Echo
Aussage, wir ersetzen es, wir führen die Tests durch. Wir schauen noch einmal, wir sind am Ende der Methode angelangt. Wir beschließen, dass wir mit der Extraktion der lokalen Variablen für das Refactoring fertig sind. Dies ist ein recht anspruchsvoller kognitiver Prozess, insbesondere bei hässlichem und nicht gut verstandenem Code.
Wäre es nicht sinnvoll, eine einzelne Verknüpfung zu drücken oder eine Option in einem Kontextmenü auszuwählen und dies alles von der IDE erledigen zu lassen? Es wäre großartig und PhpStorm ist in der Lage, es für Sie zu tun.
Im obigen Code positionieren Sie einfach den Cursor innerhalb der "Spielername: "String überall und Rechtsklick.
Nach der Auswahl "Variable extrahieren… ", PhpStorm analysiert Ihren Code und sucht nach verschiedenen Codeteilen, die Sie extrahieren möchten. Es werden zwei Möglichkeiten für unseren Fall vorgeschlagen.
Dies ist nicht nur eine coole Funktion, sondern auch sehr nützlich. Es gibt so viele Fälle, in denen Duplikate außerhalb Ihres Sichtfeldes auftreten können. Wenn eine Extraktion vorgeschlagen wird, wird die Analyse von PhpStorm im gesamten Code vorgenommen, nicht nur in den wenigen Zeilen, die Sie auf dem Bildschirm sehen können. In diesem Fall liegen die Optionen auf der Hand. Für unsere Übung wählen wir nur den String-Teil ohne Verkettung aus.Nun, da der Code, den wir extrahieren möchten, identifiziert wurde, besteht der nächste Schritt darin, ihn zu benennen. "playerHeadersString
"scheint ein sinnvoller Variablenname. Sie müssen nicht"$
"vor dem Namen im Eingabefeld. PhpStorm fügt es automatisch in den Code ein. Ein weiterer wichtiger Aspekt ist, dass es ein Kontrollkästchen gibt. PhpStorm hat alle Vorkommen für unsere Variable gefunden. Wir haben uns entschieden, eine lokale Variable zu extrahieren PhpStorm konnte nur in der aktuellen Methode suchen und fand nur zwei Vorkommen: Dieselbe Zeichenfolge in der Methode printOnePlayer (),
wurde weder gezählt noch vorgeschlagen, und es wird nicht ersetzt. Dies würde zu falschem Code führen, und PhpStorm ist intelligent genug, um keinen ungültigen Code für Sie zu schreiben.
Ein weiterer Vorteil von PhpStorm ist, dass Sie Ihre Tests nicht oft durchführen müssen. Wenn wir ein manuelles Refactoring durchgeführt haben, führen wir unsere Tests nach jedem Schritt durch. Wenn wir einen Tippfehler machen oder etwas ersetzen, von dem wir dachten, dass es dasselbe ist, was aber in Wirklichkeit nicht der Fall war, brauchten wir ein Sicherheitsnetz, um uns dies schnell mitzuteilen. PhpStorm ersetzt jedoch nicht etwas, das im Kontext nicht logisch korrekt ist. Sie werden vielleicht überrascht sein, dass ein Teil des Codes, von dem Sie erwartet haben, dass er auch extrahiert wird, nicht sein wird, aber Sie können zumindest sicher sein, dass der resultierende Code korrekt ist. Außerdem haben wir weniger Schritte. Manuell machen wir nur einen einzigen Schritt. Nach diesem Schritt müssen wir unsere Tests einmalig durchführen.
Es spielt keine Rolle, wie Sie es betrachten, es ist einfacher, schneller und weniger fehleranfällig als jede andere Möglichkeit, das Refactoring durchzuführen.
Um unseren String in eine Klassenvariable zu extrahieren - auch als Klassenfeld bekannt - können wir das "Feld extrahieren"Refactoring-Option aus dem gleichen Menü wie oben. Wir werden aufgefordert, den zu extrahierenden Code zu identifizieren, und wir werden ein etwas anderes Formular erhalten.
Neben dem Namen haben wir jetzt drei Vorkommen gefunden. PhpStorm wusste, dass wir eine Klassenvariable wollten, und es war in der Lage, dieselbe Zeichenfolge zu identifizieren, wo sie benötigt wurde. Wir haben auch Optionen, um die Variable an verschiedenen Stellen zu initialisieren und deren Sichtbarkeit festzulegen. Wenn Sie die Optionen wie im Bild auswählen, wird der resultierende Code wie folgt angezeigt.
Wenn Sie möchten, dass es öffentlich ist oder im Konstruktor initialisiert wird, müssen Sie nur die entsprechenden Optionen auswählen und PhpStorm die Arbeit für Sie erledigen lassen.
Wenn Sie eine Variable extrahieren, möchten Sie sie so initialisieren, dass sie der ersten Verwendung möglichst nahe kommt. In den meisten Fällen ist dies einfach, insbesondere wenn die Variable einmalig verwendet wird. Aber was ist mit komplexeren Fällen? Lassen Sie uns eine der variablen Extraktionen von Magic Strings & Constants erneut betrachten.
In dem rollen()
Methode, in Zeile 73 - die ausgewählte - es gibt eine Zahl "11
". Es ist eine magische Zahl, die wir gerade identifiziert haben und wir wollen sie extrahieren.
Wenn wir unsere Extraktionsmethode von Hand ausführen, müssen wir folgende Schritte ausführen:
Nun, das ist für einen Menschen kompliziert. Und es ist fehleranfällig. Wir haben vermutet, dass Sie Tests haben, die Ihnen helfen können, aber was ist, wenn Sie an einem unbekannten Code arbeiten, der nicht getestet werden kann? PhpStorm wird den Kontext Ihres Codes verstehen. Die Variable wird für alle Vorkommen korrekt extrahiert und genau dort platziert, wo sie sein sollte.
Was wir oben über Refactoring-Werkzeuge vorgestellt haben, ist nur die Spitze des Eisbergs. Das Extrahieren von Variablen ist wahrscheinlich das einfachste und einfachste Refactoring, das Sie durchführen können. In unseren Refactoring-Lektionen haben wir noch keine Methode zum Extrahieren oder Extrahieren von Unterklassen oder gar komplexere Umbenennungen verwendet, aber wir werden es tun. Wir lernen, wie man sie von Hand ausführt, aber ich empfehle Ihnen, eine intelligente IDE zu verwenden, um die Arbeit für Sie zu erledigen.
PhpStorm kann Variablen oder Methoden selbst in Hunderten von Klassen sehr gut umbenennen. Stellen Sie sich vor, wie schwierig es wäre, den Namen einer öffentlichen Methode zu ändern, die in 100 verschiedenen Klassen in Ihrem Projekt verwendet wird. PhpStorm kann dies zu einem fünfminütigen Job machen, anstatt zu einem zweistündigen Job. Es kann den Namen aller Methoden finden und ändern, und Sie müssen nur nach Miss-Matches suchen, bevor Sie dies tun.
Ja, ja… Sie müssen einige gefundene Vorkommen überprüfen, da PHP eine dynamisch typisierte Sprache ist und in einigen Fällen PhpStorm oder ein anderer IDE-Algorithmus oder ein entsprechendes Programm der IDE nicht wissen kann, um welche Art von Objekt es sich handelt für diesen spezifischen Methodenaufruf verwendet. Stellen Sie sich vor, Sie haben zwei völlig unterschiedliche Klassen. Auf jedem von ihnen haben Sie eine öffentliche Methode namens "finde alle()
". Dies ist sehr verbreitet und korrekt.
Jetzt gibt es 50 Kurse für Ihre erste Klasse und 50 für die zweite. Wenn Sie geeignete Schnittstellen und Typhinweise verwendet haben, schlägt PhpStorm vor, dass die richtigen Klassen geändert werden. Wenn Sie jedoch nicht den von Ihnen verwendeten Typ angegeben haben oder keine von Ihrer Klasse implementierte Schnittstelle mit der finde alle()
Methode, gibt es keine Möglichkeit, automatisch zu sagen, welche der beiden Klassen eine hat finde alle()
Methode wird verwendet. Das ist die Essenz der dynamischen Typisierung von PHP. Dies ist zwar in manchen Fällen von Vorteil, aber es ist von Nachteil, wenn wir so umgestalten müssen. Wenn dies geschieht, kann der Mensch nur die Notwendigkeit der Veränderung beurteilen.
Obwohl alle anderen Refactorings in PhpStorm vorhanden sind, ist sie bereits die beste IDE, nur bei Refactorings. Das Umbenennen, Extrahieren und Inlinieren von Variablen, das Extrahieren und Inlinieren von Methoden sind die am häufigsten verwendeten Refactorings, die wir jeden Tag durchführen. Wenn diese großartig funktionieren, haben wir eine erfolgreiche IDE.
Aber PhpStorm hört hier nicht auf. Es gibt viele andere Refactoring-Tools, mit denen Sie sich in schwierigen Situationen wohl fühlen. Es hat wirklich das "Kirsche oben"Gefühl.
Sie machen TDD, richtig? Wenn nicht, solltest du. Testen ist für das Programmieren ebenso wichtig wie das Schreiben des Produktionscodes. Ich könnte mir mein Leben ohne TDD nicht vorstellen. Ich habe mich in den letzten Jahren so daran gewöhnt, dass es sogar unnatürlich und schwierig ist, über Code nachzudenken, ohne an die Tests zu denken.
Beim Testen müssen Ihre Prozesse und Werkzeuge genauso gut sein wie der Produktionscode selbst. PhpStorm ist hervorragend in PHPUnit integriert. Es ist die einzige PHP-IDE, von der ich weiß, dass sie direkt mit dem PHPUnit-Framework verknüpft ist, es erweitert und verwendet, um alle Informationen zu sammeln, die präsentiert werden müssen. Dadurch ist eine engere Verbindung zu PHPUnit, eine bessere Ausgabe für den Benutzer und eine viel höhere Testlaufgeschwindigkeit gegeben.
Andere IDEs verwenden in der Regel nur die ausführbare Datei PHPUnit, schreiben die Ausgabe in eine XML-Datei und interpretieren die Ergebnisse, um sie Ihnen anzuzeigen. So funktioniert NetBeans. Dieser Ansatz bietet Ihnen als Anwender eine höhere Flexibilität, wenn Sie das System hacken und davon überzeugen möchten, dass Sie Ihre Tests auf ungewöhnliche Weise ausführen (z. B. über Telnet oder SSH). Dies hat aber auch einen großen Nachteil. Die Dinge werden langsam. Zuallererst muss ein Shell-Prozess gegabelt werden. "exec ()
"ist immer ein wichtiger Zeitverbraucher. Dann muss das Ergebnis in eine Datei geschrieben werden, möglicherweise auf eine entfernte Maschine.
Wir alle wissen, dass das Dateisystem langsam und sehr langsam ist. SSDs machen es ein bisschen besser, aber sie sind immer noch Lichtjahre von der RAM-Geschwindigkeit entfernt. Wenn wir dann unsere Tests remote ausführen, müssen wir diese Datei auf unseren Computer kopieren. Wir müssen also nicht nur einmal das Dateisystem treffen, sondern auch die Kosten für die Netzwerkkommunikation erhöhen und in eine lokale Datei schreiben. Dann muss die Datei zurückgelesen werden, damit sie dem Benutzer schließlich angezeigt werden kann.
Dies ist zwar eine sehr anpassbare und flexible Lösung, sie benötigt jedoch nur Zeit. Zu viel Zeit, wenn wir über Unit-Tests und Millisekunden-Tests nachdenken. Und Unit-Tests, deren Ausführung länger als fünf Millisekunden dauert, sind keine Unit-Tests mehr.
PhpStorm löst oder reduziert den Overhead, indem PHPUnit intern verwendet wird und das Ergebnis so ausgegeben wird, wie es von PhpStorm bevorzugt wird. Dies verringert die Flexibilität. Sie können es nicht hacken, um außerhalb seiner Grenzen zu testen. Aber es erhöht die Geschwindigkeit erheblich. Nicht mehr exec
, keine Dateien mehr in langsamen Dateisystemen geschrieben. Die Remote-Ausführung kann den Preis für die Netzwerkkommunikation erhöhen, aber wir können das sowieso nicht beseitigen. Ein weiterer großer Vorteil ist, dass durch die direkte Verwendung von PHPUnit detailliertere Informationen zu fehlgeschlagenen Tests organisierter dargestellt werden können. So gewinnen wir Geschwindigkeit, Details und Übersichtlichkeit auf Kosten der Flexibilität.
Da ich an NetBeans gewöhnt war, fiel es mir zunächst schwer, diese Inflexibilität zu akzeptieren, aber am Ende des Tages, auch wenn ich manchmal ein externes Skript ausführen muss, um meinen Code auf Remote-Computern zu testen, gewinnt die bessere Integration von PHPUnit sind vorherrschend.
Wie die meisten IDEs ist auch Phpstorm projektorientiert. In einem Projekt können Sie normalerweise Quelldateien und Tests haben. Da PhpStorm funktioniert, müssen Sie einen einzigen Ordner als Testordner angeben. Ich finde es ziemlich nützlich, zwischen Quellcode und Testcode dieselbe Verzeichnisstruktur zu haben. Dies hilft PhpStorm auch dabei, Ihre Tests leichter zu finden, und Sie können mit einer einzigen Verknüpfung zwischen Produktionscode und Tests wechseln.
Das ist aber noch nicht alles. Wenn es um das Finden und Öffnen von Dateien geht, gibt es in PhpStorm eine einzigartige Funktion: Gehe zu Alles (oder Alles suchen) - Ich liebe dieses absolut. Zunächst einmal die Standardtastenkombination von Umschalttaste + Umschalttaste (Doppelschicht) ist so natürlich zu verwenden, zweitens ist es die nützlichste Navigationsfunktion. Es wurde erst kürzlich eingeführt, und davor hatten wir separate Navigationsfelder und Abkürzungen für Datei nach Namen öffnen, Datei nach Klassenname öffnen, Datei öffnen enthält das Symbol (Variablen- oder Methodenname) und so weiter. Jetzt kann ich einfach die Schicht verdoppeln und mit dem Tippen beginnen. Es ist erstaunlich und schnell.
Es gibt so viele coole Features in den heutigen IDEs, dass wir diese Geschichte für drei weitere Tutorials fortsetzen könnten und trotzdem nicht alles erzählen können. Aber wir müssen irgendwann aufhören. Als großartiger Finisher für unseren Mini-Marathon mit PHPUnit-Funktionen in PhpStorm hier ein paar letzte, die meine Kollegen und ich von Syneto zu schätzen wissen:
hg
"befehl wahrscheinlich zweimal oder so gerade funktioniert.OK, genug geredet. Ich lasse Sie jetzt los, laden Sie PhpStorm herunter und probieren Sie es selbst aus. Habe Spaß.