Lose Java-Codierungskonventionen

Was ist mit diesem Artikel?

Dies ist ein Codierungsstandard, der für die Eigenentwicklung erstellt wurde. Ich selbst war von einigen unbeabsichtigten Codierungskonventionen betroffen, die in der Vergangenheit von anderen Unternehmen erstellt wurden, und ich habe sie erheblich gelockert.

Soll ich dieser Vereinbarung folgen?

Es kann eine Idee geben, dass es eine Konvention ist und befolgt werden sollte. Aber ich mag diese einfache Idee nicht. Wenn der Zweck darin besteht, den Kodierungsstandards zu folgen, wird dies überwältigend sein. Im Extremfall müssen Sie diese Codierungskonvention also nicht befolgen. Warum dann schreiben? Das liegt daran, dass Sie nicht zögern müssen, wenn Sie einige Regeln haben. Wenn Sie sicher sind, ignorieren Sie diesen Codierungsstandard (oder ändern Sie ihn). Bitte beziehen Sie sich auf diesen Codierungsstandard, wenn Sie sich fragen, was Sie tun sollen.

Gebrauchsanweisung

★ </ font>: Wichtig. Diese Vereinbarung sollte nicht verletzt werden. Wenn es vernünftig ist, gegen das Gesetz zu verstoßen, sollten die Kodierungskonventionen geändert werden. Sie sollten jedoch auf das Refactoring aller Quellen vorbereitet sein, wenn sich die Codierungskonventionen ändern. ◆ </ font>: Wichtig. Wenn Sie sicher sind, dass Sie verletzen, aber das ist besser! Dies ist ein guter Zeitpunkt, um Ihre Codierungskonventionen zu ändern. ● </ font>: Empfohlen. Wenn Sie sich nicht sicher sind, folgen Sie ihm vorerst.

Namenskonvention

Verbreitet

● </ font> Grundidee

Befolgen Sie grundsätzlich den Google Java Style Guide (inoffizielle japanische Übersetzung).

★ </ font> Überlegen Sie genau.

Richtige Benennung bedeutet eine präzise und klare Definition dessen, was "es" ist. Dies ist Programmdesign.

Wenn Sie Probleme beim Benennen haben

  • Das Programmdesign ist nicht präzise und klar
  • Ich verstehe die Spezifikationen nicht
  • Legacy-Kosten sind zu hoch

Möglicherweise liegt ein Problem wie z. (= Problem kann erkannt werden)

Wenn die Benennung auf Text eingestellt ist, funktioniert diese Warnung nicht und das Programmdesign wird immer mehr zusammenbrechen.

Geben wir einen Namen, der genau richtig ist: "Es gibt nur diesen!"

★ </ font> Grundsätzlich muss es auf Englisch sein. Japanische, römische Schriftzeichen und mysteriöse Codes sind NG.

Der mysteriöse Code (Bildschirm-ID usw.) ist NG, da auf den ersten Blick nicht klar ist, worauf er sich bezieht. Romaji ist einfach schwer zu lesen, also NG. Auf Japanisch ist es mühsam, jedes Mal die Taste mit voller Breite / halber Breite zu drücken, daher ist es NG.

Gutes Beispiel


public class Employee {
    public String name;
    private Decimal monthlyIncome;
}

schlechtes Beispiel


public class Class002 {
    public String namae;
privates monatliches Dezimaleinkommen;
}

◆ </ font> Verwenden Sie keine anderen als die gebräuchlichsten Abkürzungen.

Weil es Zeit braucht, um die Abkürzung zu entschlüsseln. Im Gegenteil, es braucht Zeit, um eine Abkürzung zu machen.

Object menuFlg; // NG:'Flg'Ist FLaG? FLaGment?
String employeeNm; // NG:'Nm'Ist Name? NuMber?
SystemParameterDAO dao; // OK:'DAO'Wird allgemein als DataAccessObject bezeichnet
DBConnection dbConnection; // OK:'DB'Bezieht sich allgemein auf Datenbank

Wenn der Name lang genug ist, um eine ungewöhnliche Abkürzung zu bilden, sollten Sie vermuten, dass das Programmdesign nicht geeignet ist. Variablen mit einem sehr engen Bereich sind möglicherweise leichter zu erkennen, ob es sich um Abkürzungen handelt. In diesem Fall ist dies in Ordnung.

Gutes Beispiel


public class Corporation {
    private List<Employee> employees;
    public List<String> getEmployeesNameList() {
        List<String> result = new ArrayList();
        employees.forEach(e -> result.add(e.getName());
        return result;
    }
}

schlechtes Beispiel


public class Org {
    private List<String> corpEmpNmLst;
    public String getcorpEmpNmLst() {
        return corpEmpNmLst;
    }
}

Nebenbei bemerkt, ich bin einmal in einem Projekt mit einer mysteriösen Konvention der Romaji + Vokal-Abkürzung (GakuseiBango-> GKSIBNG) gestorben.

Name der Paketklasse

● </ font> Name der Basisklasse

Grundsätzlich folgt es dem Klassennamen. Ich möchte jedoch, dass Sie die Verwendung von Base aufgrund abgeleiteter Klassen auf einfache Weise vermeiden. Die Superklasse "Entwickler" sollte "Mitarbeiter" sein, nicht "Entwicklerbasis", und diese Superklasse sollte "Person" sein.

Name der Variablen / Konstante / Methode

◆ </ font> Variablenname

Benennen Sie boolesche Werte so, dass die Bedeutung von wahr / falsch klar ist, z. B. "ist", "hat". Der boolesche Wert "-Flag" wird kategorisch abgelehnt.

◆ Name der </ font> -Methode

Informationen zu der Methode, die einen booleschen Wert zurückgibt, finden Sie im oben genannten Variablennamen.

Codierungsstil

★ </ font> Aussehen

Es liegt am Code-Formatierer, Einrückungen und {} zu schreiben, mehrere Anweisungen in eine Zeile zu schreiben und so weiter. Es ist eine Verschwendung von Ressourcen, sich beim Codieren davon ablenken zu lassen.

◆ </ font> Nest

Das Nest zu vertiefen ist normalerweise etwas falsch. Wenn Sie mehr als 3 Ebenen haben, sollten Sie dies als Leitfaden überdenken.

Gutes Beispiel


public List<String> fizzBuzzList(List<Integer> themes) {
    List<String> result = new ArrayList<>();

    for(Integer theme: themes) {
        result.add(fizzBuzz(theme));
    }
    return result;
}

private String fizzBuzz(Integer theme) {
    Map<Integer, String> rule = new LinkedHashMap<>();
    rule.put(30, "FizzBuzzFizz");
    rule.put(15, "FizzBuzz");
    rule.put(5, "Buzz");
    rule.put(3, "Fizz");
    for(Integer ruleKey: rule.keySet()) {
        if(0 == theme % ruleKey) return rule.get(ruleKey);
    }
    return theme.toString();
}

schlechtes Beispiel


public List<String> fizzBuzzList(List<Integer> themes) {
    List<String> result = new ArrayList<>();

    for(Integer theme: themes) {
        if(0 == theme % 3) {
            if(0 == theme % 5) {
                if(0 == theme % 2) {
                    result.add("FizzBuzzFizz"); 
                } else {
                    result.add("FizzBuzz"); 
            } else {
                result.add("Fizz");
            }
        } else if(0 == theme % 5) {
            result.add("Buzz");
        } else {
            result.add(theme.toString());
        }
    }
    return result;
}

◆ </ font> Doppelte Ablehnung ist unverständlich

Menschen sind nicht klug genug, um doppelte Verleugnung zu verstehen. Verleugnung ist ein sehr kostspieliger Prozess für den Menschen.

Gutes Beispiel


public Boolean isActive(Boolean visible, Boolean enable) {
    return visible && enable;
}

schlechtes Beispiel


public Boolean isNotInactive(Boolean invisible, Boolean notDisenable) {
    return !invisible && notDisenable;
}

◆ </ font> Logischer Operator Tanzen Sie nicht

Verwenden Sie nach Möglichkeit einen logischen Operator pro Anweisung und höchstens drei. Für den Menschen sind keine weiteren logischen Operationen möglich.

schlechtes Beispiel


Boolean isTooBad = (!(arg1.equals('1') && arg2 == 0) || arg0 > 30) ^ arg3.canRead(); 

◆ </ font> Die magische Zahl wird entfernt

Die magische Zahl hat hier eine breite Bedeutung und enthält eine Zeichenkette. Ich verstehe die Bedeutung nicht, kann sie nicht reparieren und kenne den Einflussbereich nicht. Natürlich, es sei denn, die Bedeutung ist klar, wie z. B. "0! = List.size ()".

Gutes Beispiel


public Decimal getPrise(Item selectedItem, Campaign campaign) {
    return selectedItem.prise() * campaign.discountRate() * Constants.TAX_RATE;
}

schlechtes Beispiel


public Decimal getPrise(Item selectedItem, Boolean campaign) {
    if(compaign) {
        return selectedItem.prise() * 0.8 * 1.08;
    } else {
        return selectedItem.prise() * 1.0 * 1.08;
    }
}

Kommentar

Javadoc Bringen Sie so viel wie möglich an Klassen und Mitgliedern an. Verwenden Sie zu diesem Zeitpunkt die Javadoc-Tags entsprechend. Insbesondere sind nach Bedarf "@ param", "@ return", "@ throw" und "@ veraltet" erforderlich. Im Gegenteil, "@ author" und "@ Since" werden nicht separat benötigt. Es wird sowieso nicht richtig gewartet. Es ist ein Relikt der Zeit, als es kein Versionsverwaltungssystem gab.

◆ </ font> Unnötige Kommentare werden zerstört

Es gibt zu viele unnötige Kommentare auf der Welt. Bitte zerstören Sie die folgenden Kommentare, sobald sie gefunden werden.

  • Auskommentiert und die Quelle vor der Renovierung für alle Fälle verlassen
  • Kommentare, die den Reparaturbereich (Start- / Endposition), das Reparaturdatum, die Reparatur usw. angeben.
  • Beschreibung der sehr einfachen Verarbeitung // Ersetze Variable a durch 10`
  • Verarbeitungserklärung in Verbindung mit der Spezifikation // Diese Verarbeitung drückt die Tabelle yy auf der nn-Seite der Spezifikation xxx aus

Insbesondere wenn "Nur für den Fall auskommentieren" und "Kommentar zur Reparaturposition" vorhanden sind, werden sich meiner Meinung nach der Aufwand für die Untersuchung des Aufprallbereichs, der Korrekturaufwand und die Fehlerauftrittsrate im Vergleich zu dem Fall, in dem sie nicht vorhanden sind, um das 1,5- bis 4,0-fache erhöhen.

● </ font> Begrüßungskommentare

Kommentare mit der Aufschrift "Was war der Zweck des Schreibens dieses Prozesses (Warum)" oder "Andere Methoden können dasselbe tun, aber warum nicht (Warum nicht)" sind willkommen. Anhand dieses Kommentars können Sie das erwartete Ergebnis vorhersagen. Wenn das Ausführungsergebnis nicht dem erwarteten Ergebnis entspricht, können Sie feststellen, dass es sich um einen Fehler handelt.

Gutes Beispiel


void createCurry(RetortCurry retortCurry) {
      //Das Curry heiß erwärmen (Kommentar:"Heiß"Es ist wichtig, und Sie können sich vorstellen, dass die Anzahl der Sekunden abhängig von der Stärke des Bereichs und der Kapazität des Curry geändert werden muss.
      Microwave.execute(retortCurry, 180);
      //Legen Sie es in Anbetracht des Aussehens auf einen Teller (Erläuterung: Die Reihenfolge, in der es auf einen Teller gelegt wird, lautet"Sieht gut aus"のためにこの順にしていることがわかる。Sieht gut ausを無視すれば順番は崩してもよい)
      return new Dish().add(rice).add(retortCurry).add(fukujinzuke);
}

schlechtes Beispiel


void createCurry(RetortCurry retortCurry) {
      //Legen Sie das Curry in den Bereich, stellen Sie es auf 180 Sekunden ein und führen Sie es aus (Erläuterung: Ich kenne den Zweck nicht, daher weiß ich nicht, ob die Anzahl der Sekunden geändert werden muss, selbst wenn sich die Leistung des Bereichs oder die Kapazität des Curry ändert).
      Microwave.execute(retortCurry, 180);
      //Legen Sie Reis, Curry und Fukujin-zuke auf einen Teller (Erläuterung: Ich weiß nicht, was der Zweck ist, daher kann ich die Reihenfolge nicht ändern).
      return new Dish().add(rice).add(retortCurry).add(fukujinzuke);
}