Vergessene Probleme,
Laufen gestoppt
Von Robotern injiziert
Glücklicher Mann!
Aus dem Film "Kindheitsterminator" "Abenteuerelektronik"
Hallo, heute werden wir wieder über Leistung sprechen. Über die Produktivität von Entwicklern.
Ich werde darüber sprechen, wie diese Fähigkeit durch die Ideen gepumpt werden kann. Ich hoffe, meine Tipps sind hilfreich, Kommentare und Verbesserungen sind willkommen. Lass uns gehen!
Ein gewöhnlicher Entwickler verbringt einen erheblichen Teil seines Arbeitstages mit Routinetätigkeiten. Bis vor kurzem habe ich auch gespielt. Und dann kamen mir ein paar einfache und offensichtliche Gedanken in den Sinn:
- selten schreiben wir wirklich etwas neues und ungewöhnliches
- Ein wesentlicher Teil der Arbeitszeit schreibt der Entwickler Vorlagencode
- Viele der einfachen Konstruktionen, die wir verwenden, sind leicht zu formalisieren, und in unseren Köpfen drücken wir sie mit wenigen Worten aus
Der Löwenanteil der Zeit, in der ich mit Spring Booth / Hibernate arbeite, betrifft sie, sodass die meisten Codegenerierungen und Vorlagen sie betreffen, obwohl der Ansatz universell ist und Sie leicht ähnliche Verbesserungen für Ihre Projekte vornehmen können.
Das Theater beginnt mit einem Kleiderbügel und die Spring Booth-App beginnt mit den Einstellungen. Normalerweise sind sie in der Datei application.yml
/ application.properties
signiert, aber es kommt auch vor, dass einige Beans / Konfigurationen mit Code beschrieben werden müssen:
@Configuration @EnableSwagger2 class SwaggerConfig { @Bean Docket documentationApi() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } }
Diese Einstellung enthält Swagger (ein nützliches Element auf der Farm). Überlegen Sie, was automatisiert werden kann? Entwickler wissen, dass @Configuration
über der Einstellungsklasse steht. Das heißt, Sie können eine Art Rohling erstellen - eine Vorlage der Konfigurationsklasse und diese mit einem Handgriff erstellen. "Idea" bietet dem Benutzer die Möglichkeit, vorhandene Vorlagen für sich selbst anzupassen:

Was wir verwenden werden:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end import org.springframework.context.annotation.Configuration; @Configuration class ${NAME} { }
Für erfahrene Entwickler ist hier alles klar, für Anfänger erkläre ich:
Zeile 1: Eine solche Zeile wird dem Code der neu erstellten Klasse hinzugefügt
package com.example.-;
Zeile 2: Verbinden Sie die gewünschte Anmerkung
Zeile 3: Körperklasse.
Beachten Sie, dass die Variable ${NAME}
in ein Popup-Fenster umgewandelt wird, in das Sie den Klassennamen eingeben müssen.
Gesamt:

Diese Vorlage erspart uns das Schreiben von @Configuration
in eine Klasse mit @Configuration
Händen und das @Configuration
des Imports. Nicht viel, aber es ist wichtig, dass wir anfangen und etwas Erfahrung sammeln.
Eine leere Einstellungsklasse allein ist wenig wert. Lassen Sie uns lernen, wie man Bohnen ohne zusätzlichen Aufwand erstellt. Gehen Sie dazu unter Editor> Datei- und Codevorlagen zu Editor> Live-Vorlagen . Hier können Sie durch Tippen erkannte Muster beschreiben. In meiner Entwicklungsumgebung habe ich eine separate Unterart für die Verwendung mit Spring definiert. Darin erstellen wir eine Vorlage:
@Bean public $CLASS_NAME$ $mthdName$() { return new $CLASS_NAME$($END$); }
Die Variable CLASS_NAME
wird vom Benutzer in einem Popup-Fenster festgelegt und zusätzlich zur direkten Zuweisung zum Erstellen eines Methodennamens verwendet:

Die Variable mthdName
verwendet die integrierte Methode camelCase()
, der der Wert CLASS_NAME
. Die Einstellung erfolgt unter Variablen bearbeiten :

Die Variable $END$
bedeutet die Position des Zeigers nach dem Rendern. Unsere Bean hat wahrscheinlich Abhängigkeiten (implementiert über den Konstruktor), daher müssen Sie sie als Argumente für die Methode angeben, die unsere Bean zurückgibt:

Lassen Sie uns nun die Anwendung von oben nach unten durchgehen und sehen, welche anderen alltäglichen Aufgaben auf so einfache Weise beschleunigt werden können.
Service
Der gesunde Menschenverstand legt nahe, dass diese Methode in Fällen am nützlichsten ist, in denen wir eine große Menge an Code haben, der von Ort zu Ort wandert. Beispielsweise hängt ein regulärer Spring-Service wahrscheinlich von den Repositorys ab (was bedeutet, dass eine Transaktion erforderlich ist), führt eine Protokollierung durch und die Abhängigkeiten werden über den Konstruktor implementiert. Um nicht jedes Mal alle Anmerkungen über die neu erstellte Klasse aufzulisten, beschreiben wir die Vorlage:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java") import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Log4j2 @Service @Transactional @RequiredArgsConstructor public class ${NAME} { }
In Aktion:

Als nächstes kommt die hasserfüllte Liste der Abhängigkeiten. Oben haben wir die integrierte Methode camelCase()
verwendet, um den Namen der Methode zu beschreiben, die die Bean zurückgibt. Sie können auch Feldnamen erstellen:

private final $CLASS_NAME$ $fieldName$; $END$
Um nicht jedes Mal Strg + Alt + L (Ausrichtung) zu drücken, aktivieren Sie das Kontrollkästchen Nach Stil neu formatieren, und die Umgebung erledigt alles für Sie:

Repositories und Entitäten
Selbst in den einfachsten Entitäten haben wir viele Importanmerkungen. Sie können eine sehr effektive Vorlage für sie erstellen:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java") import lombok.Getter; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Getter @Table @Entity public class ${NAME} { @Id private Long id; }

Wenn Sie im Ruhezustand 2019 verwenden, verwenden Sie sicherlich auch das Frühlingsdatum. Wenn ja, müssen Sie Repositorys erstellen. Lassen Sie uns ihre Erstellung beschleunigen:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java") import org.springframework.data.jpa.repository.JpaRepository; public interface ${Entity_name}Repository extends JpaRepository<${Entity_name}, ${Key}>{ }

Es wäre großartig, wenn beim Setzen des Cursors auf die Entität (die mit @Entity
und @Table
gekennzeichnete Klasse) und Drücken von Alt + Eingabetaste die „Idee“ vorschlagen würde, sofort ein Repository zu erstellen, aber es ist nicht so klug :). Derzeit können Benutzer keine Absichten ändern / hinzufügen ( Editor> Absichten ), aber Sie können Ihr eigenes Plugin schreiben:

Testen
Im Allgemeinen ist der Automatisierungsgewinn umso größer, je mehr Vorlagenkonstrukte in Ihrem Code enthalten sind. Eine der am häufigsten wiederholten Arbeiten sind Tests. Diejenigen, die den Bericht von Cyril Tolkachev „Der Fluch des Frühlingstests“ gesehen haben, wissen, dass es eine einfache Möglichkeit gibt, den Kontext für alle Tests nur einmal zu erhöhen: eine abstrakte Klasse zu erstellen und alle Tests davon zu erben.
So etwas beschreiben
package com.example; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import org.springframework.test.context.junit.jupiter.SpringExtension; @Transactional @SpringBootTest @ExtendWith(SpringExtension.class) public abstract class BaseTest { }
Wir können alle neu erstellten Tests problemlos dazu bringen, BaseTest
erben. Dazu müssen Sie die Vorlage ändern, mit der der Standardtest erstellt wird:

Im Code:
import com.example.BaseTest; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; #parse("File Header.java") class ${NAME} extends BaseTest { ${BODY} }
Als nächstes beschreiben wir die Abhängigkeiten. Ich möchte nicht jedes Mal wählen
@Autowired private MyService service;
Schreiben Sie daher im Abschnitt Editor> Live-Vorlagen
@Autowired private $CLASS_NAME$ $fieldName$; $END$
Die Variable $fieldName$
genauso beschrieben wie im Beispiel zum Erstellen einer Bean, mit einer Ausnahme: Wenn der Cursor unmittelbar nach dem Erstellen eines Felds nicht darauf wechselt, müssen Sie das Kontrollkästchen Überspringen aktivieren, falls definiert :

Grundsätzlich wird @Autowired
nur für Klassenfelder benötigt. @Autowired
daher sicher, dass die Deklaration in der Dropdown- @Autowired
Anwendbar in festgelegt ist:

Wir schauen:

Übrigens, da wir einen Test für eine bestimmte Klasse erstellen, hindert uns nichts daran, die erforderliche Abhängigkeit sofort beim toCamelCase()
funktioniert hier nicht, daher wird Velocity verwendet):
import com.example.demo.BaseTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; #parse("File Header.java") class ${NAME} extends BaseTest { #set($bodyLength = $NAME.length() - 4) #set($field = $NAME.substring(0, 1).toLowerCase() + $NAME.substring(1, $bodyLength)) @Autowired private ${CLASS_NAME} ${field}; ${BODY} }

Meine Erfahrung zeigt, dass nach Möglichkeit alle Tests übergreifend sein sollten. Selbst wenn ein Dienst überprüft wird, der die Entität herausnimmt und einen Teil eines seiner Felder abschneidet, ist es immer noch besser, die Entität ehrlich zu erhalten, d. H. aus der Datenbank. Daher nehme ich für die meisten Tests ehrliche Daten aus einer der Umgebungen und lade sie, bevor ich den Test mit @Sql
.
Die Datenerfassung muss für jede Aufgabe von Hand durchgeführt werden, die Verknüpfung mit dem gewünschten Test kann jedoch problemlos automatisiert werden. Gehen Sie erneut zu Editor> Live-Vorlagen im Abschnitt JUnit und schreiben Sie:
@Sql("/sql/$CLASS_NAME$.sql") $END$

sql
jetzt sql
, erhalten wir eine Dropdown-Liste mit 1 Datensatz, in der wir auswählen, welchen wir erhalten:
@Sql("/sql/MyEntityRepositoryTest.sql") class MyEntityRepositoryTest extends BaseTest { }
Bitte beachten Sie, dass die Datei, auf die wir uns beziehen, noch nicht vorhanden ist. Wenn Sie den Test also in Rohform ausführen, stürzt er mit Sicherheit ab. Ab Version 193.1617 hebt die Idee jedoch eine nicht vorhandene Datei hervor und schlägt vor allem vor, sie zu erstellen!

Postfixes
Eines der leistungsstärksten Tools ist das Erstellen / Hinzufügen von Code mithilfe von Postfix-Ausdrücken (Terminierungen). Das einfachste Beispiel:

Es gibt viele Vervollständigungen, die Sie alle im Abschnitt Editor> Allgemein> Postfix-Vervollständigung sehen können :

Es gibt auch Raum für verschiedene Arten von Experimenten. Für mich selbst habe ich eine Vervollständigung vorgenommen, um eine Variable in einen AssertJ- basierten Testausdruck zu ersetzen :

Im Leben sieht es so aus:

Nützliche Links
Wenn Sie Ihre Fähigkeiten mit der Idee verbessern möchten, lesen Sie unbedingt zwei großartige Berichte:
Anton Arkhipov - effektive Arbeit mit IntelliJ IDEA
Tagir Valeev - Atomic Refactoring in IntelliJ IDEA: Wir biegen die IDE für uns
Das ist alles, lassen Sie sich selten ablenken und denken Sie daran, dass Zeit unsere einzige wirklich nicht erneuerbare Ressource ist.