Wie markiere ich logische Codeabschnitte in Java-Kommentaren?

92

Java-Klassen werden im Allgemeinen in logische "Blöcke" unterteilt. Gibt es eine Konvention zur Kennzeichnung dieser Abschnitte? Idealerweise wird es von den wichtigsten IDEs unterstützt.

Ich persönlich benutze diese Methode:

//// Section name here ////

Einige Redakteure scheinen jedoch Probleme damit zu haben.

In Objective-C-Code können Sie beispielsweise diese Methode verwenden:

#pragma mark -
#pragma mark Section name here

Dies führt zu einem Menü in XCode, das folgendermaßen aussieht:

Alt-Text

Frederik
quelle
4
Als iOS-Entwickler habe ich dies am meisten vermisst, als ich mit Android Studio angefangen habe
Chris Chen
1
downvoted: Mit modernen IDEs und Sprachen ist es eine schlechte Praxis. Wenn Sie Ihren Code unterteilen müssen, verstoßen Sie wahrscheinlich bereits gegen das Prinzip der Einzelverantwortung, und es ist besser, ihn auf verschiedene Klassen / Dateien aufzuteilen. Wenn es mehrere Editoren gibt, ist es wahrscheinlich nach einer Weile ohnehin nicht mehr synchron, da einige dem folgen, andere den Code umgestalten und neu organisieren oder automatische Aktionen zum Speichern und Formatieren ihn brechen.
F. Carlsen
downvoted: Ich stimme @ f.carlsen zu. Wenn Sie Ihre Klasse mit Kommentaren strukturieren, ist es sehr wahrscheinlich, dass Sie gegen das Prinzip der Einzelverantwortung verstoßen .
schreveslaach
An Hasser: Rufen Sie mich an, wenn Java Klassenerweiterungen im Swift-Stil unterstützt, bei denen Sie Ihre Schnittstellenimplementierungen logisch in verschiedene Abschnitte unterteilen können. Und ja, eine Klasse kann gut daran tun, mehrere Schnittstellen gleichzeitig zu implementieren.
William Entriken

Antworten:

66

Ich persönlich verwende 80-Zeichen-Zeilentrennzeichen wie folgt:

public class Client {

    //================================================================================
    // Properties
    //================================================================================

    private String name;
    private boolean checked;

    //================================================================================
    // Constructors
    //================================================================================

    public Client() {
    }

    public Client(String name, boolean checked) {
        this.name = name;
        this.checked = checked;
    }

    //================================================================================
    // Accessors
    //================================================================================

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

}

Natürlich mag dies für ein so kleines POJO etwas übertrieben erscheinen, aber glauben Sie mir, es hat sich in einigen großen Projekten als sehr nützlich erwiesen, in denen ich große Quelldateien durchsuchen und schnell die Methoden finden musste, an denen ich interessiert war. Es hilft auch zu verstehen die Quellcodestruktur.

In Eclipse habe ich eine Reihe von benutzerdefinierten Vorlagen erstellt (Java -> Editor -> Vorlagen im Dialogfeld "Einstellungen" von Eclipse), die diese Balken generieren, z. - sepa (SEParator für Accessoren) - sepp (SEParator für Eigenschaften) - sepc (SEParator für Konstruktoren) - usw.

Ich habe auch die Standardvorlage "Neue Klasse" geändert (Java -> Codestil -> Codevorlagen im Bildschirm "Eclipse-Einstellungen").

Außerdem gibt es ein altes Eclipse-Plugin namens Coffee-Bytes , das die Art und Weise verbessert, wie Eclipse Teile des Codes faltet. Ich weiß nicht, ob es noch funktioniert, aber ich erinnerte mich, dass man beliebige faltbare Zonen definieren könnte, indem man spezielle Kommentare wie // [ABSCHNITT] oder so hinzufügt. Möglicherweise funktioniert es in den letzten Eclipse-Versionen noch. Schauen Sie sich das an.

Olivier Croisier
quelle
144

Für Intellij / Android Studio gibt es eine erstaunliche Lösung.
Beginnen Sie mit:
//region Description
und enden Sie mit:
//endregion

Die Verknüpfung dazu befindet sich im Menü, das Sie mit Command+ Alt+ T(Mac) oder Ctrl+ Alt+ T(Windows) öffnen können.

Sie können bei Bedarf auch eine eigene Linie für eine zusätzliche visuelle Trennung hinzufügen. Die Region kann wie jede Funktion mit den Tasten +/- nach Belieben verkleinert und erweitert werden. Sie können auch mit Command+ Alt+ Period( Ctrl+ Alt+ Period) zwischen Regionen navigieren.

Quelle .

Beispiel:

//region Parceler Implementation
//---------------------------------------------------------------------------------------
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelable(this.die, 0);
    dest.writeParcelable(this.dieSprite, 0);
}

private DieVm(Parcel in) {
    this.die = in.readParcelable(Die.class.getClassLoader());
    this.dieSprite = in.readParcelable(Sprite.class.getClassLoader());
}

public static final Parcelable.Creator<DieVm> CREATOR = new Parcelable.Creator<DieVm>() {
    public DieVm createFromParcel(Parcel source) {
        return new DieVm(source);
    }

    public DieVm[] newArray(int size) {
        return new DieVm[size];
    }
};
//---------------------------------------------------------------------------------------
//endregion
Andrey Petrov
quelle
Das ist unglaublich nützlich. Danke Andrey. Übrigens verwende ich das Eclipse-Tastaturkürzel-Layout und ich denke nicht, dass die Tastenkombinationen für mich funktionieren, aber die '// Region' funktioniert großartig
ThinkBonobo
2
Ich sehe keine Möglichkeit, dass dies in der Strukturansicht angezeigt wird, daher verwende ich immer noch gefälschte leere Elemente (zusammen mit der Unterdrückung nicht verwendeter Warnungen).
Tom
1
Gibt es eine Möglichkeit, diese Region in Android Studio anzuzeigen (Strukturansicht)?
MiguelHincapieC
Link ist tot; Dieser IntelliJ IDEA-Blog kann eine hilfreiche Referenz sein. Es wird auch erwähnt NetBeans-ähnliche Faltartikel erwähnt <editor-fold ...> .
Franklin Yu
die beste Antwort
Michał Ziobro
14

Eclipse definiert eine Javadoc-Annotation @category (scrollen Sie zu dem Abschnitt "Category Support"), der das Filtern nach Kategorien in der Gliederungsansicht ermöglicht. Nicht genau das, was Sie wollen. Ich bin überrascht, dass niemand ein Eclipse-Plugin geschrieben hat, das eine Ansicht wie Ihren Screenshot bietet.

Basszero
quelle
In den meisten Java-Ansichten ist es jedoch möglich, Klassenmitglieder nach ihren Kategorien zu filtern, um sie beispielsweise als Standard-Getter und -Setter auszublenden.
Riduidel
Keine Ahnung, warum ich @category in Android Studio nicht verwenden kann. Wissen Sie, was ich tun kann, um dasselbe Verhalten zu erzielen?
MiguelHincapieC
6

Das hat mir auch gefallen, als ich xcode verwendet habe. Für Eclipse verwende ich Strg + O (Kurzübersicht), um durch eine Java-Klasse zu navigieren.

Kukudas
quelle
6

Die Verwendung unnötiger Kommentare / Markierungen im Code zur Unterstützung der Arbeit ist möglicherweise keine gute Vorgehensweise. Ich habe wenig Ahnung von der Entwicklung von Xcode und Java, aber alle wichtigen IDEs, die die Mitglieder ohne spezielle Markierungen wie Eclipse unterstützen, zeigen die Methoden und Mitglieder mithilfe der Gliederungsansicht, die mit ctrl+OIntellij ausgelöst werden kann (ich bevorzuge die Verwendung von mehr auf Mac und hatte eine Community Edition) hat das gleiche Gliederungskonzept und kann mit (Strg + F12) schnell aufgerufen werden. Mein Punkt hier ist also, keine unnötigen Markierungen im Code zu verwenden, da alle (oder zumindest guten / vernünftigen) IDEs dies automatisch tun können.

Teja Kantamneni
quelle
2
Stimmen Sie zu, Abschnittsmarkierungen tragen nur zur visuellen Unordnung bei. Ihre Klasse sollte stark genug fokussiert sein, um diese Dinge irrelevant zu machen.
Paul McKenzie
15
Sicher, aber die Gruppierung von Methoden in logische und abgegrenzte Abschnitte kann dazu beitragen, einer ansonsten flachen Liste von Methoden eine visuelle Ordnung aufzuerlegen. Manchmal wissen Sie nicht genau, welche Methode Sie möchten, und es ist schön, die zugehörigen Methoden auf einmal zu erfassen und eine Vorstellung davon zu haben, dass Sie den vollen Umfang des zugehörigen Codes sehen.
Brian Rak
4

Soweit ich weiß, gibt es keine unterstützte Spezifikation für die Gruppierung von Klassenmitgliedern. Sie können eine beliebige Kommentarkonvention verwenden, die Sie mögen, aber wahrscheinlich wird sie von keinem Tool unterstützt.

Es ist besser, verwandte Mitglieder durch Vererbung oder Aggregation in separate Klassen zu gruppieren. Dies wird als guter OOP-Stil angesehen

artemb
quelle
5
Das Aufteilen von Codeabschnitten scheint nur theoretisch möglich zu sein. Nehmen Sie beispielsweise einen Klassenclient mit Attributen wie Name und eine Sammlung "Rechnungen". Ich würde gerne in der Lage sein, dies in einen Abschnitt "Name" aufzuteilen, der Getter / Setter für Namen enthält, und einen Abschnitt "Rechnungen", der Methoden zum Hinzufügen / Entfernen von Rechnungen enthält. Es erscheint unpraktisch, diese in eine Klassenhierarchie aufzuteilen, die nur ein Attribut pro Klasse hinzufügen kann, dh "NamedEntity", "NameAndAddressEntity", "Invoicable", ...
Frederik
3

Zusätzlich zu Andreys Antwort zur Verwendung von // region // endregion fügen wir [BigAscii-Buchstaben] [1] in wichtige Codeabschnitte ein. Beim schnellen Scrollen fällt es wirklich auf. Ein Nachteil dieses Ansatzes ist, dass ich nicht danach suchen kann, sodass Sie einen Suchbegriff direkt unter dem "Banner" hinzufügen müssen, wie ich es unten tue.

Blockquote

//    _      _____          _____                  _   _
//   | |    |  __ \   /\   |  __ \      /\        | | | |
//   | |    | |  | | /  \  | |__) |    /  \  _   _| |_| |__
//   | |    | |  | |/ /\ \ |  ___/    / /\ \| | | | __| '_ \
//   | |____| |__| / ____ \| |       / ____ \ |_| | |_| | | |
//   |______|_____/_/    \_\_|      /_/    \_\__,_|\__|_| |_|
//
//   Search here with: LDAP Auth

[1]: http://patorjk.com/software/taag/#p=display&c=c%2B%2B&f=Big&t=LDAP Auth

Manabu Tokunaga
quelle
3

Ich würde Javadoc verwenden ; oder verwenden Sie Folgendes als einfaches "Trennzeichen" (einzelne oder 3 Zeilen):

/** RecyclerOnItemClickListener */

/** 
 * RecyclerOnItemClickListener
 */

Damit es in IDE in einer anderen Farbe als dem unauffällig kommentierten Grau erscheint.

superarts.org
quelle
2

Mit einer modernen IDE können Sie Ihren Code auf viele verschiedene Arten anzeigen und sogar neu organisieren. Mit Eclipse können Sie sogar die Definition des Codes, auf den Sie den Cursor setzen, in einem anderen Bereich anzeigen.

Jede automatische Neuorganisation Ihres Codes führt dazu, dass ein solches Markup zusammenbricht.

Wenn Sie eine Gruppierung wünschen, sollten Sie in Betracht ziehen, Dinge, die zu derselben Klasse gehören, und Dinge, die nicht zu verschiedenen Klassen gehören, zusammenzufassen.

Thorbjørn Ravn Andersen
quelle
0

Wenn Sie Ihre Methoden gruppieren können, führen Sie eine andere Klasse speziell für das Konzept aus, das Sie in einem Abschnitt erfassen möchten. Das Erstellen von Dateien ist kostenlos.

Lay González
quelle
-19

Für IntelliJ mag ich:

        public void ________________INIT__________________() {};

sieht in der Dateistruktur hübsch aus!

user170317
quelle
3
Dies scheint eine sehr schlechte Lösung zu sein. Warum zusätzliche Methoden deklarieren, wenn Ihr Ziel die Code-Organisation ist?
nsg
1
Dadurch wird die gesamte Datei in der Strukturansicht segmentiert.
Tycho Pandelaar
1
Dies ist nur eine, die wirklich in Android Studio suchen, vorschlagen Sie eigene als Antwort und ich werde verwenden
user170317
13
Das Schlimmste, was ich je gesehen habe !! und es ist ÖFFENTLICH! o_O
Cocorico
3
Dies ist die einzige Antwort, die in der Strukturansicht angezeigt wird und über verschiedene IDEs hinweg funktioniert. Machen Sie es privat und grinsen und ertragen Sie es oder verwenden Sie es nicht, wenn Sie es nicht mögen, aber verbergen Sie diese Antwort nicht vor anderen Lesern, indem Sie sie in Vergessenheit geraten lassen.
Tom