Gibt es Bestellkonventionen für Java-Methoden? [geschlossen]

159

Ich habe eine große Klasse (ungefähr 40 Methoden), die Teil eines Pakets ist, das ich als Kursarbeit einreichen werde. Gegenwärtig sind die Methoden in Bezug auf öffentliche / private Versorgungsunternehmen usw. ziemlich durcheinander und ich möchte sie auf vernünftige Weise bestellen. Gibt es eine Standardmethode dafür? Normalerweise werden Felder vor Methoden aufgelistet, die Konstruktoren werden vor anderen Methoden aufgelistet und Getter / Setter zuletzt; Was ist mit den restlichen Methoden?

Fredley
quelle
Beachten Sie auch, dass Sie bei der Arbeit mit Code wie diesem in den meisten IDEs automatisch die Definition dessen sehen können, was sich unter dem Cursor befindet. Dies bedeutet, dass Sie nur einen Blick darauf werfen müssen.
Thorbjørn Ravn Andersen
Wenn Sie 40 Methoden in einer Klasse haben - Sie machen es falsch
Ben

Antworten:

132

In einigen Konventionen werden zuerst alle öffentlichen und dann alle privaten Methoden aufgelistet. Das bedeutet, dass es einfach ist, die API von der Implementierung zu trennen, auch wenn keine Schnittstelle beteiligt ist, wenn Sie sehen, was ich meine.

Eine andere Idee besteht darin, verwandte Methoden zu gruppieren. Dies erleichtert das Erkennen von Nähten, bei denen Sie Ihre vorhandene große Klasse in mehrere kleinere, gezieltere aufteilen können.

Jon Skeet
quelle
1
+1. Ich sortiere lieber nach Sichtbarkeit. Shame Eclipse kann dies nicht automatisch tun (es werden immer alle Konstruktoren und alle Methoden zusammen
gruppiert
16
@finnw, einen Fehlerbericht einreichen. Es ist bekannt, dass von dort aus seltsamere Dinge umgesetzt werden.
Thorbjørn Ravn Andersen
3
@ Ben: Meine Erfahrung ist, dass jedes "nie" Ausnahmen haben wird.
Jon Skeet
1
@ JonSkeet in einigen Fällen, in denen Bestellkonventionen nicht mehr relevant sind, z. B. Testklassen. Es ist besser, keinen schlechten Code zu schreiben, als einen schlechten Code anzuordnen.
Ben
1
@ Ben: Ich denke, wir müssen zustimmen, nicht zuzustimmen. Ich habe Code geschrieben, in dem es natürlich viele Mitglieder gibt, ohne die Trennung von Bedenken usw. zu verletzen.
Jon Skeet
121
  1. Klassenvariablen (statisch): Zuerst die öffentlichen Klassenvariablen, dann die geschützten und dann die privaten.

  2. Instanzvariablen: Zuerst öffentlich, dann geschützt und dann privat.

  3. Konstruktoren

  4. Methoden: Diese Methoden sollten eher nach Funktionalität als nach Umfang oder Zugänglichkeit gruppiert werden. Beispielsweise kann eine private Klassenmethode zwischen zwei öffentlichen Instanzmethoden liegen. Ziel ist es, das Lesen und Verstehen des Codes zu erleichtern.

Quelle: http://www.oracle.com/technetwork/java/codeconventions-141855.html

Michael
quelle
4
Dies ist 15 Jahre alt und wahrscheinlich ein wenig veraltet mit dem Erscheinen moderner IDEs ...
Assylias
16
@assylias: IMO, Lesbarkeit ist unabhängig von IDE. Es ist normalerweise besser, öffentlich vor privat zu bleiben.
Saurabheights
40

Der genauere Link zu «Code Conventions»: «Klassen- und Schnittstellendeklarationen»

Timofey Gorshkov
quelle
8
+1, afaik - dies ist der EINZIGE Beitrag, der die Frage tatsächlich beantwortet. JA, es gibt eine Standardreihenfolge, die von Oracle und Sun vorgegeben wird: 1. öffentlicher Kommentar, 2. Klasse, 3. interner Kommentar, 4. statische Daten, 5. Instanzdaten, 6. Ctors, 7. Methoden und innerhalb jeder Abschnittsgruppe logischerweise nicht durch Zugänglichkeit.
John Henckel
@VadimKirilchuk «Internet Archive» war ausgefallen ...
Timofey Gorshkov
15

Ich bin mir nicht sicher, ob es einen allgemein akzeptierten Standard gibt, aber meine eigenen Vorlieben sind es.

  • Konstruktoren zuerst
  • statische Methoden als nächstes, wenn es eine Hauptmethode gibt, immer vor anderen statischen Methoden
  • Als nächstes werden nicht statische Methoden verwendet, normalerweise in der Reihenfolge der Bedeutung der Methode, gefolgt von den von ihr aufgerufenen Methoden. Dies bedeutet, dass öffentliche Methoden, die andere Klassenmethoden aufrufen, oben angezeigt werden und private Methoden, die keine anderen Methoden aufrufen, normalerweise unten angezeigt werden
  • Standardmethoden wie toString, equalsund hashcodenächste
  • Getter und Setter haben einen speziellen Platz, der direkt am Ende der Klasse reserviert ist
Qwerky
quelle
Ich bevorzuge Konstruktoren wirklich als letztes, weil ein richtig geschriebener Konstruktor nur seine Argumente den Eigenschaften zuweisen sollte.
GordonM
@ GordonM Warum denkst du so? Ich würde so weit gehen zu argumentieren, dass das Gegenteil der Fall ist. Sie sollten immer an die sauberste API für Ihre Klassen denken. Und das ist oft nicht die Art und Weise, in der sie gespeichert sind, also mache ich oft einiges an Verarbeitung, um den Anrufer von dieser Belastung zu entlasten
Neuron
@ GordonM Ich spreche nicht über Nebenwirkungen. Also keine Änderungen an Listen, die übergeben wurden oder ähnliches. Nur das Übergeben und Festlegen von Werten erfordert, dass die Klasse Ihnen viel über die Implementierung erzählt, was nicht der Fall sein sollte
Neuron
@LonelyNeuron Ich bin mir nicht ganz sicher, was Sie hier sagen, aber es sieht so aus, als ob Sie sagen, dass der Konstruktor eine Menge Setup-Arbeit leisten sollte, außer seine Argumente dem internen Status zuzuweisen. Dies ist definitiv falsch, weil es bedeutet, dass Dinge durch "Magie" geschehen. Ein Aufruf von new Thing()sollte nur dazu führen, dass eine neue Sache instanziiert wird. Es sollte nicht dazu führen, dass Datenbankverbindungen geöffnet, Dateien geschrieben usw. usw. werden
GordonM
@LonelyNeuron Abhängigkeiten in einem Konstruktor zu haben, sagt nichts über die Implementierung der Klasse aus, außer über die Abhängigkeiten. Das ist eine gute Sache, keine schlechte.
GordonM
12

40 Methoden in einer Klasse sind ein bisschen viel.

Wäre es sinnvoll, einen Teil der Funktionalität in andere - entsprechend benannte - Klassen zu verschieben? Dann ist es viel einfacher zu verstehen.

Wenn Sie weniger haben, ist es viel einfacher, sie in einer natürlichen Lesereihenfolge aufzulisten. Ein häufiges Paradigma besteht darin, Dinge entweder vor oder nach dem Bedarf in der Reihenfolge aufzulisten, in der Sie sie benötigen.

Dies bedeutet normalerweise, dass main()oben oder unten geht.

Thorbjørn Ravn Andersen
quelle
1
Du bist so richtig - dies ist kein Bestellproblem
kostja
4
Sie haben nicht immer die Wahl, beispielsweise wenn Sie eine Schnittstelle mit vielen Methoden implementieren.
Finnw
5
Dies ist ein Android - Aktivität, so gibt es viele , die einfach nirgendwo anders gehen kann, onPause(), onResume()usw., sowie alle meine OnClickListenerFelder, die, obwohl sie Felder sind, schauen oder verhalten sich nicht wie sie so ist es sinnvoll, Listen Sie sie separat auf.
Fredley
@finnw, abstrakte Klassen sind nett und für diesen Zweck verwendbar.
Thorbjørn Ravn Andersen
11

Meine "Konvention": statisch vor Instanz, öffentlich vor privat, Konstruktor vor Methoden, aber Hauptmethode unten (falls vorhanden).

Eljenso
quelle
2

Außerdem bietet Eclipse die Möglichkeit, Klassenmitglieder für Sie zu sortieren, wenn Sie sie aus irgendeinem Grund verwechselt haben:

Öffnen Sie Ihre Klassendatei, gehen Sie im Hauptmenü zu "Quelle" und wählen Sie "Mitglieder sortieren".

von hier genommen: Sortiermethoden in Eclipse

Stephan Richter
quelle
1

Verwenden Sie Eclipse? Wenn ja, würde ich mich an die Standard-Sortierreihenfolge für Mitglieder halten, da dies wahrscheinlich jedem bekannt ist, der Ihren Code liest (obwohl dies nicht meine bevorzugte Sortierreihenfolge ist).

finnw
quelle