[JAVA] Codierungsmethode und Refactoring-Prinzip

Chanyi sprach über die Methoden, die für die ** Codierung ** verwendet werden können, und den aktuellen Stand der ** Codierung **, basierend auf den Problemen des Refactoring-Prinzips.

Methode 1: Schreiben Sie den Code von Hand

Die meisten Anfänger JAVA Programmierer geben den folgenden Code für Entwicklungstools mit nur Muskelgedächtnis ein Du darfst.

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

Ja, dies ist die klassische "Hallo Welt" -Anweisung, an die sich jeder erinnert, wenn er den Code zum ersten Mal eingibt.

Natürlich ist auch die manuelle Eingabe des Codes möglich. In der Praxis ist die manuelle Eingabe des Codes eine gute Möglichkeit, Ihre Fähigkeiten als Programmierer zu testen. Tatsächlich verwenden viele Unternehmen die manuelle Codierung als Teil ihrer Computerprogrammierprüfungen während des Interviewprozesses. Für solche Prüfungen wählt der Interviewer ein Programmierwerkzeug (wie Eclipse) basierend auf den Prüfungsanforderungen aus und ist spezifisch. Sie müssen Ihren Code von Hand schreiben, debuggen und ausführen. Während des gesamten Codierungsprozesses können Interviewer im Internet nicht nach Antworten suchen oder Online-Hilfedokumente anzeigen. Im Allgemeinen ist es erforderlich, dass der Interviewer den Code vollständig selbst schreiben kann. Solche Prüfungen testen die Codierungsfähigkeiten des Interviewers, einschließlich Syntax, Funktionen, Logik, Denken, Algorithmen und praktischen Fähigkeiten.

Manuelle Codierung ist eine grundlegende Fähigkeit, die jeder gute Programmierer haben sollte und wirklich haben muss. Manuelle Codierung entspricht den grundlegenden Schreibfähigkeiten, die Sie zum Schreiben eines Artikels benötigen. Syntax ist eine Möglichkeit, Sätze in Ihrem Code zu erstellen. Eine Funktion ist ein Wort oder ein Satz in einem Artikel. Eine Klassenbibliothek ist eine zu zitierende Anekdote, und eine Architektur ist ein Genre des Ausdrucks. Funktionen sind der Hauptzweck für das Schreiben von Artikeln. Algorithmen sind die Logik zum Organisieren von Sprachen. Beherrschen Sie daher die Syntax der Programmiersprache, lernen Sie eine Reihe grundlegender Funktionen der Klassenbibliothek, zitieren Sie einige der erforderlichen Klassenbibliotheken von Drittanbietern, wählen Sie eine ausgereifte und stabile Architektur und klären Sie die Funktionen Ihrer Produktanforderungen. Und Sie müssen einen Algorithmus auswählen, der die Logik implementiert. Die manuelle Codierung ist so einfach wie das Schreiben eines Artikels.

Methode 2: Kopieren Sie den Code und fügen Sie ihn ein

Dasselbe gilt für die Codierung, wie das chinesische Sprichwort sagt: "Wenn Sie 300 Tang-Gedichte gut studieren, können Sie singen, auch wenn Sie sie nicht schreiben können." Der erste Schritt bei der Codierung ist die Nachahmung. Kopieren Sie den Code und fügen Sie ihn ein. Das Kopieren und Einfügen von Code ist eine Kunst. Wenn Sie diese Methode richtig anwenden, können Sie Ihre Codierung mit halbem Aufwand abschließen. Wenn Sie den benötigten Code haben, überprüfen Sie ihn sorgfältig, bevor Sie ihn kopieren und einfügen. Code, der für ein Szenario geeignet ist, ist nicht immer für ein anderes geeignet. Qualifizierte Programmierer nehmen und verwenden Code nicht einfach, ohne ihn zu überprüfen.

1. Warum den Code kopieren und einfügen?

  1. Sie können die Entwicklungszeit verkürzen, indem Sie den vorhandenen Code kopieren und einfügen.
  2. Durch Kopieren und Einfügen von stabilem Code können Sie das Risiko eines Systemausfalls verringern.
  3. Durch Kopieren und Einfügen des Netzwerkcodes können Sie die Leistungen anderer in Ihre eigenen Leistungen umwandeln.

2. Probleme beim Kopieren und Einfügen von Code

  1. Wie gut verstehen Sie den kopierten Code? Ist die Implementierungslogik gültig? Funktioniert der Code stetig? Wie viele mögliche Fehler gibt es?
  2. Wie oft haben Sie den Code in Ihr Projekt kopiert und eingefügt? Wenn ich dasselbe ein drittes Mal mache, muss ich denselben Code basierend auf dem Refactoring-Prinzip umgestalten?
  3. Je öfter Sie den Code kopieren und einfügen, desto mehr Probleme bei der Codewartung treten auf. An jedem Speicherort müssen dieselben Änderungen vorgenommen werden, damit der Code nach dem Aktualisieren des Codes in mehreren Versionen synchron bleibt. Dadurch steigen die Wartungskosten und -risiken.

Kurz gesagt, das Kopieren und Einfügen von Code ist wie jede andere Codierungsmethode, und niemand ist besser. Es ist nur eine Methode, die richtig oder unangemessen angewendet werden kann. Wenn Sie den Code kopieren und einfügen, müssen Sie für das Ergebnis verantwortlich sein.

Methode 3: Codegenerierung durch Textersetzung

1. Beispiel für generierten Code

Unten finden Sie einen Code, der zum Implementieren einer Benutzerabfrage geschrieben wurde.

/** Query user service function */
public PageData<UserVO> queryUser(QueryUserParameterVO parameter) {
    Long totalCount = userDAO.countByParameter(parameter);
    List<UserVO> userList = null;
    if (Objects.nonNull(totalCount) && totalCount.compareTo(0L) > 0) {
        userList = userDAO.queryByParameter(parameter);
    }
    return new PageData<>(totalCount, userList);
}

/** Query user controller function */
@RequestMapping(path = "/queryUser", method = RequestMethod.POST)
public Result<PageData<UserVO>> queryUser(@Valid @RequestBody QueryUserParameterVO parameter) {
    PageData<UserVO> pageData = userService.queryUser(parameter);
    return Result.success(pageData);
}

Beim Schreiben von Code, der eine Unternehmensabfrage implementiert, ähnelt das Codeformat dem einer Benutzerabfrage. Die Substitutionsbeziehung kann wie folgt organisiert werden.

  1. Ersetzen Sie "Benutzer" durch "Firma".
  2. Ersetzen Sie "Benutzer" durch "Firma". Notepad und EditPlus Sie können einen Texteditor wie .0.31d5474dAMXb9I) verwenden, um allgemeinen Text in Groß- und Kleinschreibung zu ersetzen. Das Endergebnis sieht folgendermaßen aus:
/** Query company service function */
public PageData<CompanyVO> queryCompany(QueryCompanyParameterVO parameter) {
    Long totalCount = companyDAO.countByParameter(parameter);
    List<CompanyVO> companyList = null;
    if (Objects.nonNull(totalCount) && totalCount.compareTo(0L) > 0) {
        companyList = companyDAO.queryByParameter(parameter);
    }
    return new PageData<>(totalCount, companyList);
}

/** Query company controller function */
@RequestMapping(path = "/queryCompany", method = RequestMethod.POST)
public Result<PageData<CompanyVO>> queryCompany(@Valid @RequestBody QueryCompanyParameterVO parameter) {
    PageData<CompanyVO> pageData = companyService.queryCompany(parameter);
    return Result.success(pageData);
}

Stellen Sie beim Generieren von Code mit Textersetzung sicher, dass die Codegenerierungszeit 1 Minute nicht überschreitet.

2. Vor- und Nachteile

verdienen: In 1 ist die Geschwindigkeit der Codegenerierung schnell. ** Fehler: **

  1. Sie müssen den Beispielcode kompilieren.
  2. Diese Methode gilt nur für Textersetzungsszenarien.

Methode 4: Generieren Sie Code mit Excel-Formeln

Excel-Formeln sind sehr leistungsfähig und können zum Kompilieren von formalisiertem Code verwendet werden.

1. Generieren Sie eine Modellklasse mit Excel-Formeln

Kopieren Sie die Definition des Schnittstellenmodells aus dem Wiki nach Excel. Die Beispieldaten sind wie folgt.

image.png

Schreiben Sie die Excel-Formel wie folgt.

= "/** "&D6&IF(ISBLANK(F6), "", "("&F6&")")&" */ "&IF(E6 = "Nein", IF(C6 = "String", "@NotBlank", "@NotNull"), "")&" private "&C6&" "&B6&";"

Generieren Sie Code mit folgenden Formeln:

/** User ID */ @NotNull private Long id;
/** Username */ @NotBlank private String name;
/** User gender (0:unknown;1:male;2:female) */ @NotNull private Integer sex;
/** User description */  private String description;

Erstellen Sie eine Modellklasse und organisieren Sie Ihren Code wie folgt:

/** User DO Class */
public class UserDO {
    /** User ID */
    @NotNull
    private Long id;
    /** User Name */
    @NotBlank
    private String name;
    /** User gender (0:unknown;1:male;2:female) */
    @NotNull
    private Integer sex;
    /** User description */
    private String description;
    ......
}

2. Generieren Sie eine Aufzählungsklasse mithilfe einer Excel-Formel

Kopieren Sie die Aufzählungsdefinition aus dem Wiki nach Excel. Die Beispieldaten sind wie folgt.

image.png

Schreiben Sie die Excel-Formel wie folgt.

="/** "&D2&"("&B2&") */"&C2&"("&B2&", """&D2&"""),"

Generieren Sie Code mit folgenden Formeln:

/** empty(0) */NONE(0, "Unknown"),
/** male(1) */MAN(1, "Male"),
/** female(2) */WOMAN(2, "Female"),

Erstellen Sie eine Aufzählungsklasse und organisieren Sie Ihren Code wie folgt:

/** User gender enumeration class */
public enum UserSex {
    /** enumeration definition */
    /** empty(0) */
    NONE(0, "unknown"),
    /** male(1) */
    MAN(1, "male"),
    /** female(2) */
    WOMAN(2, "female");
    ......
}

3. Generieren Sie Datenbankanweisungen mit Excel-Formeln

Die Firmenliste ist in Excel wie folgt sortiert. Basierend auf dieser Liste müssen Sie eine SQL-Anweisung schreiben, um den Datensatz direkt in die Datenbank einzufügen.

image.png

Schreiben Sie die Excel-Formel wie folgt.

= "('"&B2&"', '"&C2&"', '"&D2&"', '"&E2&"'),"

Verwenden Sie den Ausdruck, um eine SQL-Anweisung zu generieren, die der folgenden ähnelt:

('AutoNavi', 'First Tower', '(010)11111111', '[email protected]'),
('Alibaba Cloud', 'Green village', '(010)22222222', '[email protected]'),
('Cainiao', 'Alibaba offices', '(010)33333333', '[email protected]'),

Fügen Sie einen in-Anweisungsheader hinzu und sortieren Sie die SQL-Anweisungen wie folgt:

insert into t_company(name, address, phone, email) values
('AutoNavi', 'First Tower', '(010)11111111', '[email protected]'),
('Alibaba Cloud', 'Green village', '(010)22222222', '[email protected]'),
('Cainiao', 'Alibaba offices', '(010)33333333', '[email protected]');

4. Vor- und Nachteile

verdienen:

  1. Diese Methode kann auf die Codegenerierung von tabellenbasierten Daten angewendet werden.
  2. Nach dem Schreiben der Formel können Sie den Code durch Ziehen und Ablegen generieren. Daher ist die Geschwindigkeit der Codegenerierung schnell. ** Fehler: **
  3. Diese Methode kann nicht auf die Codegenerierung mit komplexen Funktionen angewendet werden.

Methode 5: Generieren Sie Code mit Tools

Verwenden Sie also Ihre vorhandenen Tools, um den Code zu generieren. Viele Entwicklungstools bieten Tools zum Generieren von Code. Zum Beispiel das Generieren von Konstruktoren, das Neuladen von Basisklassen und Schnittstellenfunktionen, das Generieren von Getter / Setter-Funktionen, das Generieren von toString-Funktionen usw. Mit diesen Tools können Sie sich die Mühe ersparen, manuell zu codieren. Sie können auch mehrere Plug-Ins zur Codegenerierung verwenden, um Code zu generieren, der Ihrem spezifischen Anwendungsszenario entspricht.

Im Folgenden wird beschrieben, wie Sie das Tool zur Codegenerierung am Beispiel des MyBatis-Generator-Plug-Ins verwenden.

1. Installieren Sie das Plug-In und führen Sie es aus

Weitere Informationen finden Sie im Internet nach verwandten Materialien.

2. Beispiel für generierten Code

** 2.1. Modellklassencode generieren ** Der Inhalt der Datei User.java lautet wie folgt.

......
public class User {
    private Long id;
    private String user;
    private String password;
    private Integer age;
    ......
}

** 2.2 Generierung von Mapper-Schnittstellencode ** Der Inhalt der Datei UserMapper.java lautet wie folgt.

......
public interface UserMapper {
    User selectByPrimaryKey(Long id);
    ......
}

** 2.3. Mapper XML Code Generation ** Der Inhalt der Datei UserMapper.xml lautet wie folgt.

......
<mapper namespace="com.test.dao.UserMapper" >
  <resultMap id="BaseResultMap" type="com.test.pojo.User" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="user" property="user" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="age" property="age" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, user, password, age
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="Base_Column_List" />
    from test_user
    where id = #{id,jdbcType=BIGINT}
  </select>
  ......
</mapper>

3. Vor- und Nachteile

verdienen:

  1. Generieren Sie Code mit dem Codegenerierungs-Plug-In. Daher ist die Geschwindigkeit der Codegenerierung schnell.
  2. Verwenden Sie die Konfigurationsdatei des Plug-Ins, um die Generierung des gewünschten Funktionscodes zu steuern. ** Fehler: **
  3. Es braucht Zeit, um zu lernen, wie man das Codegenerierungs-Plug-In verwendet und sich daran gewöhnt.
  4. Der generierte Code entspricht nicht immer den Codespezifikationen. Bei jeder Generierung ist eine Code-Konformitätsprüfung erforderlich.
  5. Nach dem erneuten Generieren des Codes wird der benutzerdefinierte Code wahrscheinlich überschrieben. Verwalten Sie daher eine andere Codebibliothek, verwenden Sie das DIFF-Tool, um die Codeunterschiede zu identifizieren, Werte zuzuweisen und dann andere. Es wird empfohlen, den Code einzufügen.

Methode 6: Code mit Code generieren

Mit anderen Worten, schreiben Sie es selbst und generieren Sie Ihren eigenen Code. Im Folgenden wird diese Methode am Beispiel des MyBatis-basierten Datenbankzugriffscodes beschrieben.

1. Anfrage zu Tabelleninformationen

Rufen Sie zunächst die für die Codegenerierung erforderlichen Tabellen- und Spalteninformationen aus der Datenbank ab.

** 1.1. Tabelleninformationen abfragen ** Die Anweisung zum Abfragen von Tabelleninformationen lautet:

select t.table_name as 'table name'
, t.table_comment as 'table remarks'
from information_schema.tables t
where t.table_schema = ?
and t.table_type = 'BASE TABLE'
and t.table_name = ?;

Das erste Fragezeichen zeigt den dem Datenbanknamen zugewiesenen Wert und das zweite Fragezeichen den dem Tabellennamen zugewiesenen Wert.

Das Abfrageergebnis der Tabelleninformationen lautet wie folgt.

SN. Table name Table remarks
1 org_company Organization company table

** 1.2. Informationen zu Abfragespalten ** Die Anweisung zum Abfragen von Spalteninformationen lautet:

select c.column_name as 'column name'
, c.column_comment as 'column remarks'
, c.data_type as 'data type'
, c.character_maximum_length as 'character length'
, c.numeric_precision as 'numeric precision'
, c.numeric_scale as 'numeric scale'
, c.column_default as ''
, c.is_nullable as 'optional?'
, c.column_key as 'column key name'
from information_schema.columns c
where c.table_schema = ?
and c.table_name = ?
order by c.ordinal_position;

Das erste Fragezeichen zeigt den dem Datenbanknamen zugewiesenen Wert und das zweite Fragezeichen den dem Tabellennamen zugewiesenen Wert.

** Das Abfrageergebnis der Spalteninformationen lautet wie folgt. ** ** **

image.png

2 Kompilierung und Generierung von Code

** 2.1 Modellklassencode kompilieren und generieren **

/** Generate model class file function */
private void generateModelClassFile(File dir, Table table, List<Column> columnList) throws Exception {
    try (PrintWriter writer = new PrintWriter(new File(dir, className + "DO.java"))) {
        String className = getClassName(table.getTableName());
        String classComments = getClassComment(table.getTableComment());
        writer.println("package " + groupName + "." + systemName + ".database;");
        ......
        writer.println("/** " + classComments + "DO class */");
        writer.println("@Getter");
        writer.println("@Setter");
        writer.println("@ToString");
        writer.println("public class " + className + "DO {");
        for (Column column : columnList) {
            String fieldType = getFieldType(column);
            String fieldName = getFieldName(column.getColumnName());
            String fieldComment = getFieldComment(column);
            writer.println("\t/** " + fieldComment + " */");
            writer.println("\tprivate " + fieldType + " " + fieldName + ";");
        }
        writer.println("}");
    }
}

** 2.2 Kompilieren und Generieren von DAO-Schnittstellencode **

/** Generate DAO interface file function */
private void generateDaoInterfaceFile(File dir, Table table, List<Column> columnList, List<Column> pkColumnList) throws Exception {
    try (PrintWriter writer = new PrintWriter(new File(dir, className + "DAO.java"))) {
        String className = getClassName(table.getTableName());
        String classComments = getClassComment(table.getTableComment());
        writer.println("package " + groupName + "." + systemName + ".database;");
        ......
        writer.println("/** " + classComments + "DAO interface */");
        writer.println("public interface " + className + "DAO {");
        writer.println("\t/** get" + classComments + "function */");
        writer.print("\tpublic " + className + "DO get(");
        boolean isFirst = true;
        for (Column pkColumn : pkColumnList) {
            if (!isFirst) {
                writer.print(", ");
            } else {
                isFirst = false;
            }
            String fieldType = getFieldType(pkColumn);
            String fieldName = getFieldName(pkColumn.getColumnName());
            writer.print("@Param(\"" + fieldName + "\") " + fieldType + " " + fieldName);
        }
        writer.println(");");
        ......
        writer.println("}");
    }
}

** 2.3 DAO-Mapper-Code kompilieren und generieren **

/** Generate DAO mapping file function */
private void generateDaoMapperFile(File dir, Table table, List<Column> columnList, List<Column> pkColumnList) throws Exception {
    try (PrintWriter writer = new PrintWriter(new File(dir, className + "DAO.xml"))) {
        String className = getClassName(table.getTableName());
        String classComments = getClassComment(table.getTableComment());
        writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        ......
        writer.println("<!-- " + classComments + "Mapping -->");
        writer.println("<mapper namespace=\"" + groupName + "." + systemName + ".database." + className + "DAO\">");
        writer.println("\t<!—All field statements -->");
        writer.println("\t<sql id=\"fields\">");
        if (CollectionUtils.isNotEmpty(columnList)) {
            boolean isFirst = true;
            String columnName = getColumnName(pkColumn.getColumnName());
            for (Column column : columnList) {
                if (isFirst) {
                    isFirst = false;
                    writer.println("\t\t" + columnName);
                } else {
                    writer.println("\t\t, " + columnName);
                }
            }
        }
        writer.println("\t</sql>");
        writer.println("\t<!-- get" + classComments + "function statement -->");
        writer.println("\t<select id=\"get\" resultType=\"" + groupName + "." + systemName + ".database." + className + "DO\">");
        writer.println("\t\tselect");
        writer.println("\t\t<include refid=\"fields\"/>");
        writer.println("\t\tfrom " + table.getTableName());
        boolean isFirst = true;
        for (Column pkColumn : pkColumnList) {
            String columnName = getColumnName(pkColumn.getColumnName());
            String fieldName = getFieldName(pkColumn.getColumnName());
            writer.print("\t\t");
            if (isFirst) {
                writer.print("where");
                isFirst = false;
            } else {
                writer.print("and");
            }
            writer.println(" " + columnName + " = #{" + fieldName + "}");
        }
        writer.println("\t</select>");
        writer.println("</mapper>");
    }
}

3 Generieren Sie verwandten Code

** 3.1 Generierter Modellklassencode **

/** Organize company DO class */
@Getter
@Setter
@ToString
public class OrgCompanyDO {
    /** company logo */
    private Long id;
    /** company name */
    private String name;
    /** contact address */
    private String address;
    /** company description */
    private String description;
}

** 3.2 Generierter DAO-Schnittstellencode **

/** Organize company DAO interface */
public interface OrgCompanyDAO {
    /** Get organization company function */
    public OrgCompanyDO get(@Param("id") Long id);
}

** 3.3 Generierter DAO-Mapper-Code **

<!—Organize company mapping -->
<mapper namespace="xxx.database.OrgCompanyDAO">
    <!—All field statement -->
    <sql id="fields">
        id
        , name
        , address
        , description
    </sql>
    <!—Get organization company function statement -->
    <select id="get" resultType="xxx.database.OrgCompanyDO">
        select
        <include refid="fields"/>
        from org_company
        where id = #{id}
    </select>
</mapper>

4. Vor- und Nachteile

verdienen:

  1. Sie können das Codeformat anpassen, um die Konformität des generierten Codes sicherzustellen.
  2. Sie können die Codefunktion so anpassen, dass nur der gewünschte Code generiert wird. 3, Nach der Ausfällung vor dem Kabel kann der Code direkt später verwendet werden. ** Fehler: **
  3. Die Datenquelle muss berücksichtigt werden, um sicherzustellen, dass die für die Codegenerierung erforderlichen Daten erhalten werden.
  4. Es braucht Zeit, um ein Datenmodell zu erstellen und zu kompilieren und Code zu generieren.

Ultimative Methode: Halten Sie sich nicht nur an die Methode

Ist es die ultimative Codierungsmethode, bei der Sie dem Computer mitteilen können, was Sie benötigen, und der Computer automatisch den Code für Sie generiert? Dies kann nach einer gewissen technologischen Entwicklung in der Zukunft Realität werden. Diese Methode ist jedoch jetzt unpraktisch. In Wirklichkeit können Sie "keinen Code generieren, sobald Sie den Mund aufmachen", es sei denn, Sie sind Chef, Produktmanager oder technischer Manager.

Der ultimative Weg zum Code besteht darin, sich nicht nur an die Methode zu halten, sondern die für Sie richtige Methode zu verwenden. Alle in diesem Artikel aufgeführten Codierungsmethoden haben ihre Vor- und Nachteile und können auf eine Vielzahl von Szenarien angewendet werden. Daher kann gesagt werden, dass die wahre ultimative Codierungsmethode darin besteht, verschiedene Codierungsmethoden flexibel zu verwenden.

Code-Standardisierung

Bei vielen der vorhergehenden Codierungsmethoden müssen Sie den Beispielcode manuell kompilieren. Wenn Ihr Code nicht den Codespezifikationen entspricht, ist es schwierig, eine gemeinsame Basis zwischen den Codes zu finden und den als Standard geltenden Beispielcode zu abstrahieren. Wenn der Beispielcode, der als Standard fungiert, nicht den Codespezifikationen entspricht, entspricht der generierte Code auch nicht den Codespezifikationen, und die Nichteinhaltung wird um das Zehn-, Hundert- und Tausendfache erhöht. .. Daher ist die Codestandardisierung eine Codierungspriorität.

Recommended Posts

Codierungsmethode und Refactoring-Prinzip
Funktionen und Methoden
[Java] Generics-Klasse und Generics-Methode
Schienenpfad und URL-Methoden
Über die Zupfmethode und die ID-Methode
Java-Methoden und Methodenüberladungen
[Ruby] Singuläre Methoden und singuläre Klassen
Ruby-Methoden und -Klassen (grundlegend)
Java abstrakte Methoden und Klassen
Informationen zu statischen und nicht statischen Java-Methoden
Informationen zu den Methoden equals () und hashcode ()
Ruby-Standardeingabe und verschiedene Methoden
Aufrufen von Klassen und Methoden
Java 8 studieren (StaticIF und Standardmethode)
Java Generics (definiert Klassen und Methoden)
TCP: Grundprinzipien und Anwendungsarchitektur
Anwendung von Downcase- und Slice-Methoden