In Java-Überprüfungen wurde auf schlechte Gewohnheiten hingewiesen, als Java noch Anfänger war

Als ich ein neuer Mitarbeiter war, der Java-Anfänger war, erinnerte ich mich an das, worauf meine Senioren in der Codeüberprüfung hingewiesen hatten, und fasste es zusammen.


Ergänzung: </ font> Wir haben viele nützliche Kommentare zu diesem Artikel erhalten, einschließlich Vor- und Nachteile. Wenn Sie diesen Artikel lesen, lesen Sie bitte auch den Kommentarbereich.

2018/04/26 Die Überschrift und der Text von "Versuch, etwas konstant zu machen" in Bezug auf die Kommentare wurden korrigiert. Vielen Dank, @kagilinn. 2018/04/30 Der Beispielcode enthielt einen Beurteilungsfehler, daher habe ich ihn behoben. Vielen Dank für den Hinweis, @y_miz. Tippfehler in Kommentaren und Tippfehlern wurden korrigiert. Vielen Dank an @scivola für Ihre Bearbeitungsanfrage.

Erstellen Sie unnötige Instanzvariablen

Instanzvariablen behalten ihren Status bei, sodass Fehler leicht erstellt werden können. Es wurde oft darauf hingewiesen, dass "Ist dies eine lokale Variable?"

** Überlegen Sie vor dem Erstellen einer Instanzvariablen, ob sie mit einer lokalen Variablen realisiert werden kann. ** ** **

Versuche, alle Variablen zu Beginn der Methode zu deklarieren

Es scheint eine häufige Angewohnheit für Menschen zu sein, die aus der C-Sprache gekommen sind. Die Ablaufverfolgung ist sehr umständlich, da der Umfang der Variablen unnötig erweitert wird.

schlechtes Beispiel


public String function() {
    int count;
    int max;
    int min;
    List fooList;
    String hogeCode;
    String fugaCode;
    String ret;
    
    //Verschiedene Verarbeitung

    return ret;
}

** Deklarieren Sie Variablen unter Berücksichtigung des Umfangs und bei Bedarf. ** ** **

Geben Sie einen Variablennamen an, der nicht ausreichend erklärt wird

Es gibt einen Anfänger. Sogar Veteranen haben überraschend geeignete Leute. Anfänger neigen dazu, Dinge wie das Weglassen des Modellnamens oder der Seriennummern zu tun, die nur die Person kennt, die sie geschrieben hat.

schlechtes Beispiel


String str;  //Ich weiß nur, dass es eine Zeichenfolge ist

String code; //Ich weiß nicht, was der Code ist

int a;       //Schrecklich, aber selten gesehen

File file1;  //Geheimnisvolle Seriennummer
File file2;

static final String MSGID_E0001 = "E0001"; //Der Konstantenname enthält einen Wert

Gutes Beispiel


String userName;

String messageCode;

int age;

File userListFile;
File companyListFile;

static final String MSGID_FILE_NOT_FOUND = "E0001";

Dies bedeutet jedoch nicht, dass Sie einen Variablennamen mit zahlreichen Änderungen an allem angeben sollten. Manchmal ist ein Kurzname in Ordnung, z. B. ein Zähler in einer for-Anweisung oder eine abgefangene Ausnahme.

** Wie detailliert der Variablenname sein sollte, hängt von der Länge des Bereichs ab. ** ** ** Es ist eine gute Idee, Instanzvariablen und lokalen Variablen, die in langen Methoden verwendet werden, detaillierte Namen zu geben. Wenn umgekehrt der Umfang der Variablen auf einige Blockzeilen beschränkt ist, ist ein kurzer Variablenname in Ordnung.

Das Wichtigste ist, vom Standpunkt des Codelesers (einschließlich meiner selbst einige Monate später) verstehen zu können, "was in dieser Variablen gespeichert ist".

Die Benennung von Variablen scheint einfach und in einer sehr tiefen Welt zu sein. Das berühmte Buch "Readable Code" verwendet auch eine beträchtliche Anzahl von Seiten für Variablennamen.

Verwenden Sie xxxflg für den Namen der booleschen Variablen

Der Typ, der sich nicht unwohl fühlte, bis er darauf hingewiesen wurde. Mit xxxFlg ist es schwer zu verstehen, was passiert, wenn es wahr ist.

schlechtes Beispiel


private boolean writeFlg = false; //Auf jeden Fall wahr/Es ist unklar, ob es falsch sein wird

Gutes Beispiel


private boolean writable = false;

** Boolesche Variablennamen sind Sätze. ** ** ** Wenn Sie "Variablenname == wahr" schreiben, ist es wünschenswert, dass dies als Anweisung verstanden werden kann.

Beispiel für einen Methodennamen


public boolean isWritable() {
    return writable;
}

Durch Verwendung des obigen Methodennamens wird die Instanz beim Aufrufen zum Betreff, und die Bedeutung ist als englischer Satz leicht zu verstehen.

if (note.isWritable()) { /* ... */ }

Einige der am häufigsten verwendeten Methodennamen sind:

--ist + Adjektiv --can + Verb Prototyp

  • hat + letzten Teil
  • Drei einfache Verben (+ Nomenklatur)

[Referenz] Ein Artikel, der die Benennung von Booleschen Werten aus Sicht der englischen Grammatik zusammenfasst http://kusamakura.hatenablog.com/entry/2016/03/03/boolean_値を返却するメソッド名、変数名の付け方

Machen Sie es konstant, ohne einen Sinn zu geben

Da darauf hingewiesen wurde, dass "buchstäbliches solides Schreiben nutzlos ist", ist es ein Beispiel für die Herstellung verschiedener Konstanten. Die Konstanten haben keine Bedeutung, sie ersetzen nur die Buchstaben.

private static final String HANKAKU_SPACE = " ";
private static final String BLANK = "";
private static final String COMMA = ",";
private static final String SLASH = "/";
private static final int ZERO = 0;

Versuchen Sie immer, am Ende der Methode zurückzukehren

Als ich zum ersten Mal darauf hingewiesen wurde, verstand ich nicht, was los war, Ich habe gut verstanden, als ich lesen konnte.

schlechtes Beispiel


boolean isPrimeNumber(int num) {
    boolean ret;
    if (num < 2) {
        ret = false; //Weniger als 2 ist keine Primzahl
    } else if (num == 2) {
        ret = true;  //2 ist eine Primzahl
    } else if (num % 2 == 0) {
        ret = false; //Gerade Zahlen außer 2 sind keine Primzahlen
    } else {
        ret = true; //Wenn es nicht teilbar ist, ist es eine Primzahl
        double sqrtNum = Math.sqrt(num);
        for (int i = 3; i <= sqrtNum; i+=2) {
            if (num % i == 0) {
                ret = false;   //Wenn es teilbar ist, ist es keine Primzahl
                break;
            }
        }
    }
    return ret; 
}

Gutes Beispiel


boolean isPrimeNumber(int num) {
    if (num < 2) {
        return false; //Weniger als 2 ist keine Primzahl
    }
    if (num == 2) {
        return true;  //2 ist eine Primzahl
    }
    if (num % 2 == 0) {
        return false; //Gerade Zahlen außer 2 sind keine Primzahlen
    }
    double sqrtNum = Math.sqrt(num);
    for (int i = 3; i <= sqrtNum; i+=2) {
        if(num % i == 0) {
            return false;   //Wenn es teilbar ist, ist es keine Primzahl
        }
    }
    return true; //Wenn es nicht teilbar ist, ist es eine Primzahl
}

Betrachten Sie den Fall, in dem ein Dritter den Fall verfolgt, in dem 1 in num eingegeben wird.

Im "schlechten Beispiel" muss der Leser, da nicht bekannt ist, wo die Ret neu geschrieben wird, den Status der Ret lesen und bis zur endgültigen Rückkehr weiterlesen.

Andererseits kehrt im "guten Beispiel" jedes Urteil sofort zurück. Wenn Sie den Fall von num = 1 verfolgen, lesen Sie nach, um in die dritte Zeile zurückzukehren.

Dieses Beispiel ist eine Methode mit mehr als 10 Zeilen, aber wenn die Methode mit 50 Zeilen und 100 Zeilen wie ein "schlechtes Beispiel" implementiert wird, ist die Belastung für den Leser unermesslich.

** Die Methode sollte zurückgeben, wenn der Rückgabewert fest ist **

Darüber hinaus hat eine schnelle Rückkehr den Vorteil, dass es für das Nest schwierig ist, sich zu vertiefen.

Versuchen Sie, die Öffentlichkeit unnötig hinzuzufügen

Als Anfänger neige ich dazu, private Variablen und Methoden öffentlich zu machen. Machen Sie es zunächst privat und erweitern Sie es gegebenenfalls auf geschützt und öffentlich.

Erstellen Sie ganz einfach Gottklassen wie xxxUtil, xxxHelper, xxxManager

Klassen mit unklaren Namen sind gefährlich. Es ist zum Zeitpunkt der Erstellung gut, aber da es 5 Jahre und 10 Jahre lang gewartet wird, werden die Funktionen verschoben ~ ~ hinzugefügt ~ ~ und es wird unantastbar.

Je abstrakter der xxx-Teil ist, desto schlimmer. Das Schlimmste ist CommonUtil. Ich habe CommonUtil vor über 10 Jahren gesehen und es sind über 4000 Zeilen.

Zunächst ist zu prüfen, ob ein Name wie Factory, Builder, Writer, Reader usw. geändert werden kann, der die Rolle einschränkt **.

Schreibe keine Kommentare

Ich wollte es unbedingt implementieren, deshalb war ich wütend, wenn ich es zur Codeüberprüfung brachte, ohne Kommentare zu schreiben.

Lassen Sie uns die Kommentare richtig schreiben.

Insbesondere sollte das Folgende durch Kommentare ergänzt werden.

  • Sooterische Verarbeitung und komplizierte bedingte Verzweigung
  • Besondere Umstände und Absichten, die nicht aus dem Code gelesen werden können

Schreiben Sie selbsterklärende Informationen als Kommentar

Nachdem ich darauf hingewiesen wurde: "Schreiben Sie einen Kommentar", schrieb ich einen zeilenweisen Kommentar, auf den auch hingewiesen wurde.

Wenn Sie einen Kommentar Zeile für Zeile schreiben, der wie eine japanische Übersetzung des Codes aussieht, ist er laut. Da die Anzahl der effektiven Linien, die in den Bildschirm passen, verringert wird, ist auch die Sicht schlecht.

schlechtes Beispiel


//Benutzer-ID abrufen
String userId = user.getId();

//Benutzer-ID zur Liste hinzufügen
userIdList.add(userId);

Ohne Berücksichtigung von 0 Schleifen

Bei der Implementierung von Schleifenanweisungen, z. B. für Anweisungen und while-Anweisungen, haben wir keinen Fall angenommen, in dem sich die Schleife nicht einmal gedreht hat, und es gab Zeiten, in denen ein Fehler im 0-Fall-Muster des Komponententests entdeckt wurde.

Foo foo = null;
for (int i=0; i < hogeList.size(); i++) {
    if (i == 0) {
        foo = new Foo();
    }
    //wird bearbeitet
}
foo.function(); //NullPointerException tritt auf, wenn die Schleife 0 Mal ist

** Wenn Sie eine Schleife implementieren, nehmen Sie 0, 1 oder mehrere Muster an **

Vernachlässigen Sie das Design von Methodenrückgabewerten und Ausnahmen

Trotz der öffentlichen gemeinsamen Methoden Die Angaben zu Argumenten und Rückgabewerten waren nicht eindeutig.

Zum Beispiel sollte das Folgende ohne Auslassung entworfen und in Javadoc beschrieben werden.

--Was soll zurückgegeben werden, wenn als Argument eine Null oder eine negative Zahl angegeben wird? ――Wann und welche Ausnahme zu werfen ――Wenn Null als Rückgabewert zurückgegeben wird

Wenn Sie ein Modellbeispiel für Javadoc kennen möchten, sollten Sie sich Javadoc of Oracle ansehen. Die bekannte String-Klassenmethode ist leicht zu verstehen.

schließlich

Damit neue Programmierer guten Code schreiben können, ganz zu schweigen von ihren eigenen Bemühungen, Ich denke, es ist wichtig, Code-Reviews von guten Programmierern zu erhalten. Nachdem ich den Rat des Rezensenten erhalten hatte: "Ich würde das für mich selbst schreiben", bekam ich das Bewusstsein, dass "Oh, gibt es so etwas?" Durch die Anhäufung werden wir das Know-how aufnehmen und in der Lage sein, bessere Programme zu schreiben.

Recommended Posts

In Java-Überprüfungen wurde auf schlechte Gewohnheiten hingewiesen, als Java noch Anfänger war
Wie man Arrays mit Java stapelweise initialisiert, wusste ich als Anfänger nicht
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Ein Hinweis, wenn Sie Tupel in Java möchten
Bei Verwendung einer Liste in Java wird java.awt.List ausgegeben und ein Fehler tritt auf
Was ich beim Erstellen eines Servers in Java gelernt habe
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
Unterschiede im Code bei Verwendung des Längensystems in Java
Beheben Sie den CreateProcess-Fehler = 206, wenn Sie Java in einer Windows-Umgebung ausführen
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
Suchen Sie eine Teilmenge in Java
Java mit Visual Studio Code
Schreiben Sie Java8-ähnlichen Code in Java8
In Java 10, wenn Gradle Eclipse abgeschlossen ist und JavaSE-1.10 herauskommt, ...
Vermeiden Sie Zeichencodefehler in Java, wenn Sie die VScode-Erweiterung RUN-CODE verwenden