Die ganze Kraft von IntelliJ IDEA am Beispiel einer Sprache (in Bildern)

Das klassische Entwicklungsmodell für jede Anwendung setzt eine gute Dokumentation der Benutzeroberfläche und der API sowie gegebenenfalls eine gute Abdeckung des Quellcodes mit Kommentaren voraus. In diesem Fall beginnt die Fertigstellung des Systems mit einem Studium der Dokumentation, dann wird der Code direkt geändert und schließlich werden alle erforderlichen Informationen aktualisiert.

Eines der Probleme bei diesem Ansatz besteht jedoch darin, dass er die Kosten erheblich erhöht und den Entwicklungsprozess verlangsamt. Was ist, wenn das alles nicht ist? Dann kommt die IDE zur Rettung, dank derer Sie die aktuelle Logik mit bloßem Code studieren können.

Als wir die lsFusion- Plattform mit einer eingebetteten Sprache entwickelten, hatten wir mehrere Möglichkeiten. Erfinden Sie entweder das Rad neu und schreiben Sie Ihre eigene IDE wie bei 1C von Grund auf neu, oder implementieren Sie ein Plug-In für ein vorhandenes. Wir sind den zweiten Weg gegangen, und in diesem Artikel werde ich zeigen, was passiert ist.

Da die Plattform selbst in Java entwickelt wurde, hatten wir zwei Hauptoptionen: Eclipse oder IDEA. Wir haben uns für die letzte Option entschieden und sind nicht gescheitert. Als wir die Entscheidung getroffen haben, war IDEA noch nicht populär genug, aber seitdem haben sie sich als Marktführer herausgestellt, und Eclipse ist ruhig dahinter.

Die Entwicklung des Plugins selbst dauerte nicht lange, da der direkt während der Ausführung der Plattform verwendete Code verwendet werden konnte. So haben wir mit minimalem Aufwand eine sehr leistungsfähige IDE erhalten, die in vielen Aspekten der IDE vieler anderer ERP-Plattformen (sowohl native als auch auf Eclipse basierende) deutlich überlegen ist.

Die Rolle der IDE in der Entwicklung ist schwer zu überschätzen. Trotz der Tatsache, dass viele Entwickler immer noch vim verwenden und glauben, dass es sein sollte. Diese Position hat das Recht auf Leben, wenn eine Person diesen Kodex entwickelt und weiter unterstützt. Bei größeren Projekten, an denen eine große Anzahl von Personen beteiligt ist, ist ihre Austauschbarkeit jedoch sehr wichtig. Mitarbeiter werden krank, machen Urlaub, gehen am Ende. Darüber hinaus ist die Belastung für verschiedene Projekte ungleichmäßig, und manchmal müssen mehr Personen mit einem von ihnen verbunden werden, um die Fristen einzuhalten. In solchen Momenten müssen Sie neue Leute mit den Verbesserungen verbinden, die schnell herausfinden müssen, wie das Programm derzeit funktioniert, und die notwendigen Änderungen vornehmen müssen. Und hier kommt die IDE.

Zunächst brauchten wir Folgendes von der IDE:

  • Syntaxunterstützung . Hervorheben von Schlüsselwörtern, automatische Ersetzung, Hervorheben von Fehlern.
  • Navigation Gehen Sie zur Anzeige, suchen Sie nach Verwendungszwecken, suchen Sie nach Textzeichenfolge, Datei oder Name usw.
  • Analyse . Die Hierarchie der Klassen und Aufrufe sowie die Eigenschaften und Aktionen der Klasse.
  • Refactoring Umbenennen von Klassen, Eigenschaften und Aktionen.
  • Visualisierung von Formularen . Dem Entwickler das aktuelle Design eines bestimmten Formulars anzeigen.
  • Metaprogrammierung . Die Möglichkeit, Metacode- basierten Code im laufenden Betrieb zu generieren.
  • Debugger Die Fähigkeit, Haltepunkte (einschließlich Bedingungen) zu setzen, zwingende Logik zu debuggen und Uhren zu beobachten.
  • Sprachinjektion . Navigation, Refactoring, automatische Substitution und Hervorhebung der lsFusion-Syntax bei Verwendung in anderen Sprachen - Java und JasperReports XML.

Da wir das in IDEA eingebettete Standardschema für das Plug-In verwendet haben, stellte sich heraus, dass die Ausgabe der Arbeit mit Logik in lsFusion fast identisch mit der Entwicklung in Java war. Dieselben Menüelemente, Hotkeys, transparentes Debugging, das von lsFusion-Code zu Java und umgekehrt wechseln kann, und so weiter.

Hier sind einige einfache Beispiele, um zu zeigen, wie dies in der Praxis funktioniert.

Syntaxunterstützung


Das Plugin kann gültige Schlüsselwörter ersetzen, mögliche Eigenschaften, verschiedene Fehler automatisch erkennen:

Bild

Navigation


Nehmen Sie die Logik aus dem Beispiel Materialverwaltung . Angenommen, wir müssen sehen, wo die Price-Eigenschaft deklariert ist. Dazu müssen Sie den Mauszeiger über die Überschrift der Spalte platzieren, die wir als Benutzer mit Administratorrechten benötigen:

Bild

Im angezeigten Fenster können Sie sofort sehen, in welchem ​​Modul diese Eigenschaft erstellt wird (Sendung), welche Zeilennummer darin enthalten ist (37), in welcher Tabelle sie gespeichert ist (_auto_Shipment_ShipmentDetail) und eine Reihe weiterer Informationen.

Um direkt zur Eigenschaftsdeklaration zu gelangen, müssen Sie die Dateisuche starten und im angezeigten Dialogfeld Versand eingeben:

Bild

Bild

Gehen Sie dann mit Navigieren - Zeile / Spalte zur 37. Zeile, in der die Eigenschaftsdeklaration angezeigt wird:

Bild

Durch Drücken von STRG + ALT + F7, während sich der Cursor auf der gewünschten Eigenschaft befindet, können Sie schnell alle Verwendungszwecke für alle Projekte finden:

Bild

In diesem Fall wird der Preis zunächst zur Berechnung des Betrags pro Zeile verwendet. Die letzten beiden ergänzen die entsprechenden Formulare.

Bei Bedarf können Sie die Suche nur nach Datensatz in dieser Eigenschaft aktivieren, wenn Sie die entsprechende Option entfernen:

Bild

Dann bleibt nur der Eintrag in dieser Eigenschaft in der Liste. Um herauszufinden, welcher bestimmte Wert darauf geschrieben ist, müssen Sie den Cursor auf salePrice setzen und auf Zur Erklärung oder Verwendung gehen klicken. Gehen Sie als Nächstes durch Navigation - Zurück zurück und gehen Sie zur Deklaration der Eigenschaft item:

Bild

Zusammenfassend haben wir festgestellt, wo diese von uns benötigte Eigenschaft deklariert wurde, in welchen Fällen sie verwendet wird und wann die Aufnahme dorthin geht. Auf dem Video habe ich alle Aktionen mit der Maus ausgeführt, obwohl in der Praxis natürlich nur die Tastatur verwendet wird. Mit dieser Technik können Sie die aktuell implementierte Systemlogik schnell ermitteln und Änderungen daran vornehmen, um zu verstehen, wozu dies führen wird.

Refactoring


Oft gibt es Situationen, in denen Sie den Namen einer Eigenschaft, Klasse, eines Formulars oder eines anderen Elements im System ändern müssen. Um eine solche Aktion auszuführen, müssen Sie auf diesem Element stehen und auf Refactor - Rename klicken:

Bild

Durch das Umbenennen eines Elements wird der Quellcode an allen Verwendungsorten automatisch geändert. Wenn die Datei migration.script erstellt wird, werden dort die entsprechenden Einträge hinzugefügt. Der Server muss die Namensänderungen kennen, um beispielsweise Daten automatisch von einer Spalte in eine andere zu migrieren. Andernfalls kann das Umbenennen nicht vom Erstellen einer neuen Eigenschaft mit einem anderen Namen unterschieden werden.

Analyse


Vor dem Refactoring ist es oft notwendig herauszufinden, "was passiert" und "wer all diese Leute sind".

Zu diesem Zweck können Sie mit IDEA fast sofort die Struktur der ausgewählten Klasse anzeigen (Eigenschaften und Aktionen für diese Klasse verfügbar):



Wenn Sie sich ein allgemeines Bild von den Vorgängen machen möchten, können Sie mit IDEA verschiedene Hierarchien erstellen:

  • Vererbung der ausgewählten Klasse
  • Verwendung des ausgewählten Elements (z. B. Eigenschaften oder Formulare)



Alle Top-Funktionen werden von IDEA automatisch (mit minimalen Gesten) nach der Implementierung der Suchmaschinenanzeigen bereitgestellt. Die folgenden Funktionen haben das Plugin ein bisschen mehr basteln lassen, aber immer noch wurde ein erheblicher Teil der Infrastruktur von IDEA bereitgestellt (natürlich nicht ohne Probleme, aber dazu später mehr).

Formularvisualisierung


In lsFusion werden Struktur und Design von Formularen mithilfe spezieller Konstruktionen im selben Code wie die Domänenlogik festgelegt. Darüber hinaus können verschiedene Teile des Formulars in verschiedenen Modulen deklariert werden. Wenn der Server gestartet wird, werden sie abhängig von den verbundenen Modulen zusammengeführt.

Um das resultierende Design anzuzeigen, können Sie den Server natürlich neu starten und das Ergebnis im Client anzeigen. Der Neustart des Servers dauert jedoch einige Zeit. Ein Plugin kann:

  • Zeigen Sie das aktuelle Design und die hierarchische Struktur des Formulars in einem speziellen Fenster an
  • Finden Sie Elemente in der Formstruktur
  • Markieren Sie das ausgewählte Formelement im Design

So sieht es in der IDE aus:

Bild

Beim Erstellen eines Formulars werden nur das aktuell aktive Modul und alles, wovon es abhängt, berücksichtigt.

Es ist noch nicht möglich, das aktuelle Design visuell zu ändern, da das Formular aus mehreren Codeblöcken besteht. Während der Änderung ist es schwierig, klar zu bestimmen, an welcher Stelle Sie die entsprechenden Änderungen vornehmen müssen. Darüber hinaus kann dasselbe Element in mehreren Codeblöcken geändert werden, und die Plattform stellt sicher, dass die Änderungen zuletzt angewendet werden, wenn ein Modul von einem anderen abhängt. In Zukunft planen wir jedoch, bestimmte Funktionen für visuelle Designänderungen hinzuzufügen.

Metaprogrammierung


Manchmal muss für verschiedene Aufgaben derselbe Codetyp erstellt werden. LsFusion verfügt über einen Metacode-Mechanismus, mit dem Sie Code basierend auf einer Vorlage generieren können. In diesem Fall wird der Code bei einer Änderung des Metacodes automatisch aktualisiert. Tatsächlich handelt es sich um ein automatisches Kopieren / Einfügen mit der Möglichkeit, bestimmte Bezeichner durch angegebene Werte zu ersetzen.

Um diesen Mechanismus zu aktivieren, müssen Sie ihn zuerst im Menü aktivieren. Danach ändert die IDE automatisch den entsprechenden Code.

Bild

Beim Start des Servers wird nur der generierte Code verwendet. META-Vorlagen selbst werden beim Starten des Servers nicht berücksichtigt.

Die Implementierung der Möglichkeit der Metaprogrammierung hat uns übrigens dazu gebracht, einen weiteren Beitrag zu Open Source zu leisten (in diesem Fall Intellij IDEA). Tatsache ist, dass in ERP Metacodes sehr aktiv verwendet werden und dementsprechend häufig Code generiert / der generierte Code gelöscht werden muss. Dies führt zu einer großen Anzahl von asynchronen Dateiänderungen, die wiederum zu einem sehr merkwürdigen Fehler führten . Das Problem ist, dass sie nicht in JetBrains selbst gespielt werden konnten. Es kam also darauf an, dass wir selbst einen nicht funktionierenden Unit-Test schreiben mussten. Dies dauerte natürlich mehrere Tage, half uns aber indirekt bei der Umsetzung der folgenden beiden Möglichkeiten.

Debugger


Wenn der Code völlig unklar ist, was passiert, müssen Sie sich an den Debugger wenden. In jeder Zeile der imperativen Logik (Aktionen, Ereignisse, Einschränkungen) können Sie einen Haltepunkt setzen. Sobald die Serverausführung diesen Punkt erreicht, wird sie gestoppt und die Steuerung geht an den Debugger. In diesem Moment können Sie Uhren beobachten und die Ausführung Zeile für Zeile fortsetzen. Auf der linken Seite wird eine Stapelverfolgung angezeigt, entlang der Sie wie beim Debuggen einer regulären Java-Anwendung navigieren können.

Bild

Wenn Sie aktuelle Werte anzeigen, können Sie sowohl auf aktuelle Objekte (z. B. Sendungen) als auch auf andere Objekte aus der Datenbank (z. B. Artikel i) zugreifen. Der Entwickler selbst ist jedoch dafür verantwortlich, den Uhren Daten hinzuzufügen, deren Lesen viel Zeit oder Speicherplatz in Anspruch nimmt und zu einem Leistungsabfall führt.

Sie können auch Haltepunkte für eine bestimmte Eigenschaft festlegen. Die Ausführung wird überall angehalten, wenn eine Aufzeichnung erstellt wird:

Bild

Dies ist nützlich, wenn Sie bestimmen müssen, welches Ereignis oder welche Aktion den Wert einer Eigenschaft ändert.

Um den Debugger tatsächlich zu implementieren, haben wir den vorhandenen IDEA Java Debugger verwendet. Das heißt, die Plattform wird als reguläre Java-Anwendung debuggt, aber für lsFusion-Aktionen erstellen wir Proxy-Java-Methoden und ersetzen deren Anzeige durch unseren Code (wie ich es in IDEA verstehe, wird dies durchgeführt, um Scala und andere Wrapper über Java zu unterstützen). Und hier war ein lustiger Moment. Irgendwann machten die IDEA-Entwickler den Konstruktor ihres Java-Debuggers privat. Und wenn die Situation beim Aufrufen privater Methoden durch Reflection immer noch umgangen werden kann, ist nicht klar, wie von einer Klasse mit einem privaten Konstruktor geerbt werden soll. Aber gerade zu dieser Zeit gab es einen Showdown mit einem Fehler im oberen Bereich, und wir beschlossen, "die Leute von JetBrains zu bitten, diesen Konstruktor wieder zu schützen", worauf sie sehr schnell reagierten (wofür natürlich vielen Dank).

Sprachinjektion


Eine der ungewöhnlichsten Funktionen von IDEA ist die Möglichkeit, Ihre Sprache in den Zeichenfolgenkonstanten anderer Sprachen zu unterstützen. Dazu reicht es aus, IDEA genau mitzuteilen, welche Zeichenfolgenkonstanten für Ihre Sprache gelten, und dann IDEA selbst automatisch:

  • generiert eine virtuelle Datei (oder mehrere Dateien) mit den angegebenen Präfixen für jede Zeichenfolgenkonstante
  • Erstellt im Editor der Quelldatei für alle Konstanten eine Art „Fenster“ in diese virtuelle Datei
  • bietet in dieser virtuellen Datei Unterstützung für alle Funktionen der „eingebetteten“ Sprache, z. B. Hervorheben von Fehlern, Wechseln zu einer Anzeige, automatische Vervollständigung, Suche nach Verwendungszwecken und vor allem Refactoring. Das heißt, wenn ein Element in einer Sprache umbenannt wird, wird es automatisch in allen Zeichenfolgenkonstanten umbenannt, die in anderen Sprachen auf dieses Element verweisen. So sind Sie automatisch vor defekten Links geschützt.



Hier in IDEA gab (und gibt) es einen kleinen Fehler . Wenn die virtuelle Datei groß ist und die IDEA an den Anfang des „Implementierungsfensters“ gehen soll, wenn sie weiter verwendet wird, geht sie tatsächlich an das Ende des vorherigen „Implementierungsfensters“ (dh zum vorherigen Gebrauch der Eigenschaft in der Java-Datei). Es gibt natürlich eine einfache Problemumgehung für diesen Fehler, eine separate virtuelle Datei für jedes Zeichenfolgenliteral zu erstellen. Dieser Ansatz verlangsamt sich jedoch, wenn mehr als 30 Verwendungen vorhanden sind. In diesem Fall müssen Sie also immer noch eine große virtuelle Datei verwenden (andererseits ist es bei vielen Verwendungen nicht so schwierig, die richtige zu finden, d. H. Die folgende). Wir haben darum gebeten, diesen Fehler im Rahmen des "Service Exchange" erneut zu beheben, und die JetBrains-Entwickler haben ihn irgendwie behoben, aber wie sich später herausstellte, war dies irgendwie nicht der Fall (er war beim Commit immer noch sichtbar, aber wir dachten, dass dies einfach nicht der Fall ist verstand ihn am Ende). Wir alle sind jedoch schon lange an diesen Fehler gewöhnt, da die Verwendung von mehr als 30 Elementen in einer Datei ziemlich selten ist.

Fazit


Der Artikel beschreibt nur die Hauptanwendungsfälle. Es bietet auch die Möglichkeit, nach Implementierungen abstrakter Eigenschaften und Klassen zu suchen, Abhängigkeiten zwischen Modulen und Eigenschaften zu visualisieren, automatisch Formulare basierend auf xml / json zu generieren und vieles mehr. Und natürlich gibt es eine integrierte Integration in die wichtigsten Versionskontrollsysteme von Git und Subversion sowie Unterstützung für Maven und Ant.

Auf dem Weg zur Entwicklung des IDEA-Plug-Ins haben wir mit geringem Aufwand eine sehr leistungsfähige, kostenlose, integrierte Entwicklungsumgebung erhalten, die die IDE der Wettbewerber in vielerlei Hinsicht übertrifft.

Source: https://habr.com/ru/post/de465573/


All Articles