Methoden in großen Klassen gruppieren oder auslagern?

Heiko2

Mitglied
Hallo,

ich habe lange Zeit in C# programmiert und möchte mich nun wieder Java widmen. Was ich in Java vermisse, ist, dass man in größeren Klassen mit vielen Methoden diese offenbar (immer noch) nicht gruppieren kann. In C# gibt es die Möglichkeit, mit dem Schlüsselwort partial zusammengehörende Teile einer Klasse in eine andere Datei auszulagern. Außerdem kann man in C# innerhalb einer Datei mit #region und #endregion Methoden gruppieren, sodaß diese regions in einer komfortablen IDE mit einem Klick geschlossen oder geöffnet werden können.

Muß man in Java nach wie vor zwingend die gesamte Klasse in eine Datei schreiben?

Ich beginne gerade die Android-Programmierung mit Android Studio. Darin gibt es nicht mal Dropdown-Auswahllisten, um schnell zu einer Klasse oder einer Methode zu navigieren. Man muss was man sucht schon ziemlich genau kennen und eintippen, und als Ergebnis erhält man alles, was das Eingetippte enthält und muß sich dann aus allen Treffern noch das gewünchte herraussuchen. Irgendwie ist da C# und Visual Studio schon seit langer Zeit weit vorraus.
 
K

kneitzel

Gast
Also dieses Aufteilen gibt es in Java nicht und auch in C# / Visual Studio habe ich dies für eine Unart gehalten.
Hintergrund ist, dass die Grundsätze bezüglich Clean Code schon überein stimmen.

Was hier ein bisschen fehlt sind so Dinge wie Properties aus C#. Die ganzen Getter / Setter sind in Java schon extrem, aber da gibt es dann z.B. Lombok.

Wenn Dich gewisse Dinge stören: Evtl. willst Du Dir auch einmal Kotlin ansehen? Da hast Du halt auch ein paar "modernere" Ansätze aber bewegst Dich noch im Java Umfeld so man das so ausdrücken möchte. (Ich selbst war da zuerst begeistert, aber die Ernüchterung ist schnell gekommen. https://allegro.tech/2018/05/From-Java-to-Kotlin-and-Back-Again.html beschreibt auch meine Erfahrung recht gut fand ich ...

Was #region / #endregion anging: Das war in meinen Augen ein Visual Studio Feature. IntelliJ hat sowas auch. Da wäre das z.B.:

Code:
// <editor-fold desc="Some Text">

  ...
 
// </editor-fold>

Bezüglich der DropDown Auswahllisten weiss ich jetzt nicht genau, was Du meinst. Meinst Du beim Tippen von Klassen das Intellisense, das einem dann einiges vorschlägt? Da ich früher mal lange Zeit mit Visual Studio Professional arbeiten musste und da einiges eingeschränkt war, war lange Zeit ReSharper mein Wegbegleiter. --> Da hat JetBrains halt umgesetzt, was aus Ihrer Sicht eine Verbesserung ist. Und das haben sie natürlich nicht nur für Visual Studio als Erweiterung gemacht sondern das ist eigentlich auch alles in IntelliJ drin....
Ok, gewisse Unterschiede gibt es. Visual Studio hat sehr schön die Dokumentation mit eingeblendet. Das findet man in der Java Welt nicht, zumindest ich habe es noch nicht gefunden. Aber da wird ja auch direkt alles in html erzeugt - Visual Studio generiert erst einmal nur xml Dateien, die dann auch vom Visual Studio mit verwendet werden. (Aber ich habe da nur einen oberflächigen Blick drauf - mag sein, dass JavaDoc da auch deutlich mehr kann...)

Ansonsten sehe ich das mit dem "weit voraus" nicht. Auch Java wird regelmäßig erweitert. Aber ja: C# ist halt deutlich später entstanden und konnte daher einiges auch durchaus besser machen. Dafür war es aber viel zu lange nur auf Windows beschränkt. Die Öffnung der letzten Jahre ist zu spät gekommen und Microsoft hat vieles viel zu halbherzig angepackt (Da spreche ich leider aus sehr leidvoller Erfahrung!). Das muss man aber hier alles nicht zu sehr vertiefen. Bezüglich des einen oder anderen Punktes konnte ich evtl. etwas weiter helfen.

Ansonsten einfach bei konkreten Dingen einfach einmal konkreter werden: Der eine oder andere wird dann bestimmt paar hilfreiche Ideen haben.
 

Heiko2

Mitglied
Danke für deine Informationen. Die Sache mit
Code:
<editor-fold ...>
ist ja schon mal was Positives, wenn auch etwas mehr Tipparbeit. Es funktioniert im Android Studio.

Es hängt vieles davon ab, was man in all den Jahren in seiner Sprache und IDE gewöhnt war und auch lieben gelernt hat. Dinge, die man häufig benutzt hat, vermißt man dann in anderen Umgebungen, die wiederum ihre eigenen Vor- und Nachteile haben.

Da es in Java keine Properties gibt, muss man sich nun wieder auf mehr Tipparbeit einstellen, Zugriffsmethoden und Variablen getrennt definieren. Kotlin verienfacht da wohl einiges, schränkt aber nach meiner Vermutung (da ich Kotlin nicht wirklich kenne) die Möglichkeiten des Java selbst wieder ein.

Im Visual Studio hat man direkt über dem Edit-Fenster der C#-Datei drei Dropdown-Listen, über die man zum Namespace, einer Klasse und einer ihrer Methoden navigieren kann. Dadurch konnte man schnell zu einer Methode springen, da Namespace und Klasse meist eh schon passend eingestellt sind. Im Android Studio gibt es da wohl nur den Baum in der Projektübersicht mit den Klassen. Jedoch hat man die Möglichkeit, mit Strg+Shift+- alles in einer Datei zuzuklappen. Damit hat man dann auch eine bessere Überischt über Methoden und Methoden-Gruppen.

Mir fällt gerade auf, daß Anrdoid Studio/IntelliJ den Baum für die Aufrufer einer Methode "falsch" herum aufbaut. In VS habe ich diese Funktionalität sehr oft benutzt. In VS konnte man im Baum alle Aufrufer einer Methode sehen und dann tiefer im Baum wiederum deren Aufrufer sehen. Das habe ich im VS sehr oft benutzt, da es sehr effektiv ist. Das ist in Andriod Studio nun leider etwas umständlicher.

Es ist halt Alles eine Frage der Effektivität und Tipparbeit.
 
K

kneitzel

Gast
Ich hatte es evtl. zu kurz erwähnt:
Ich spare mir extrem viel Schreibkram in Java mit Lombok (https://projectlombok.org/). Dann verschwinden massiv die ganzen Getter / Setter. Aber auch andere Dinge sind sehr nett:
@NotNull bei Parametern gefällt mir, denn zum einen schreibt Lombok mir die Validierung und zum anderen hat man noch eine Art rote Fahne für Entwickler ...
@Builder habe ich in der Vergangenheit schon genutzt.
Generell sollte man aber sehr gut aufpassen, was man wie nutzt. Es gibt Dinge, die einfach überholt sind. @Cleanup wäre da ein gutes Beispiel: Dazu gibt es nun einmal try with resources ...

Die von Dir beschriebene Vorgehensweise habe ich so nie genutzt. Auch im Visual Studio bin ich über den Solution Explorer gegangen bzw. über den Explorer, der die TFS Sourcen zeigte (Der Name fällt mir jetzt gerade nicht einmal ein.) Daher war das Vorgehen über dieses Projekt-Fenster von IntelliJ immer das, was ich auch brauchte.

Ich müsste mir Visual Studio noch einmal installieren. In IntelliJ (und damit wohl auch im Android Studio) gibt es ja das Find Usages (Alt F7), welches einem dann anzeigt, wo das alles aufgerufen wird incl. Codeabschnitt des Aufrufst. In dem Codeabschnitt kann man wieder Alt F7 drücken wenn einem da weitere Aufrufe interessieren.
Aber vermutlich meinst Du eine andere Funktionalität, an die ich mich jetzt nicht erinnere. Aber ja: Jede IDE hat gewisse Vor- und Nachteile und ein Umgewöhnen wird sich kaum vermeiden lassen.

Viel Spass und Erfolg wünsche ich Dir aber dabei!
 

mrBrown

Super-Moderator
Mitarbeiter
Da es in Java keine Properties gibt, muss man sich nun wieder auf mehr Tipparbeit einstellen, Zugriffsmethoden und Variablen getrennt definieren. Kotlin verienfacht da wohl einiges, schränkt aber nach meiner Vermutung (da ich Kotlin nicht wirklich kenne) die Möglichkeiten des Java selbst wieder ein.
Im Idealfall hat man sowieso möglichst wenige Getter und Setter - und wenn doch generiert einem IntelliJ da alles automatisch :)


Im Visual Studio hat man direkt über dem Edit-Fenster der C#-Datei drei Dropdown-Listen, über die man zum Namespace, einer Klasse und einer ihrer Methoden navigieren kann. Dadurch konnte man schnell zu einer Methode springen, da Namespace und Klasse meist eh schon passend eingestellt sind.
Klingt etwas nach diesem:
Bildschirmfoto 2020-08-04 um 20.38.45.png
Klick auf irgendein Element erlaubt den Sprung zu Unterelementen, egal ob Package, Ordner, Klasse, Methode


Mir fällt gerade auf, daß Anrdoid Studio/IntelliJ den Baum für die Aufrufer einer Methode "falsch" herum aufbaut. In VS habe ich diese Funktionalität sehr oft benutzt. In VS konnte man im Baum alle Aufrufer einer Methode sehen und dann tiefer im Baum wiederum deren Aufrufer sehen. Das habe ich im VS sehr oft benutzt, da es sehr effektiv ist. Das ist in Andriod Studio nun leider etwas umständlicher.
"Call Hierarchy" zeigt einem alle Aufrufer einer Methode (und wiederum deren Aufrufer, usw). Ist das nicht genau das, was du meinst?
 

Heiko2

Mitglied
Im Idealfall hat man sowieso möglichst wenige Getter und Setter - und wenn doch generiert einem IntelliJ da alles automatisch :)
OK, ich denke für den Datenaustausch zwischen GUI und Model wirds in Android schon ein paar Setters und Getters brauchen. Die Funktionen zum automatischen Generieren von Gettern/Settern habe ich in Android Studio nun gefunden (Encapsulate Fields), oder über die Glühbirne auf einem Feld.

Klick auf irgendein Element erlaubt den Sprung zu Unterelementen, egal ob Package, Ordner, Klasse, Methode
Hm... Ich habe da nur eine Liste der Klassen, eine Liste der Methoden erhalte ich nicht.

"Call Hierarchy" zeigt einem alle Aufrufer einer Methode (und wiederum deren Aufrufer, usw). Ist das nicht genau das, was du meinst?
Ja, das ist das richtige Wort. Doch im Android Studio finde ich kein solches Fenster. Alt+Shift+F7 zeigt mir lediglich die Aufrufer einer Methode A. Alt+Shift+F7 auf einen Aufrufer von A zeigt mir dessen Aufrufer und löscht alle Aufrufer von A aus dem 'Find Usages'-Fenster. Ist also keine schnell überschaubare Aufruf-Hierarchie im Sinne einer Baumansicht.
 

mrBrown

Super-Moderator
Mitarbeiter
Die Funktionen zum automatischen Generieren von Gettern/Settern habe ich in Android Studio nun gefunden (Encapsulate Fields), oder über die Glühbirne auf einem Feld.

Über den Shortcut lässt sich alles Automaisch generieren :)


Hm... Ich habe da nur eine Liste der Klassen, eine Liste der Methoden erhalte ich nicht.
Wenn man auf eine Klasse klickt sollte man auch die Methoden angezeigt bekommen:
Bildschirmfoto 2020-08-05 um 13.07.20.png

Ja, das ist das richtige Wort. Doch im Android Studio finde ich kein solches Fenster. Alt+Shift+F7 zeigt mir lediglich die Aufrufer einer Methode A. Alt+Shift+F7 auf einen Aufrufer von A zeigt mir dessen Aufrufer und löscht alle Aufrufer von A aus dem 'Find Usages'-Fenster. Ist also keine schnell überschaubare Aufruf-Hierarchie im Sinne einer Baumansicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
J Argumente in Methoden übergeben Java Basics - Anfänger-Themen 1
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
Renjiroo Java Bmi Rechner mit Methoden Java Basics - Anfänger-Themen 4
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
Alen123 Erstes Arbeiten mit Methoden. Java Basics - Anfänger-Themen 5
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
M Erklärung von Ausnahmebehandlung in Methoden Java Basics - Anfänger-Themen 13
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
L Rekursive Methoden Java Basics - Anfänger-Themen 14
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
W Methoden aufrufen - auch klassenübergreifend? Java Basics - Anfänger-Themen 9
Kotelettklopfer Methoden nicht aufrufbar Java Basics - Anfänger-Themen 34
R Schulaufgabe, Bruache Hilfe mit non-static Methoden Java Basics - Anfänger-Themen 2
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
S Methoden - Warum int wenn auch void? Java Basics - Anfänger-Themen 3
H Kann man Methoden öfter aufrufen? Java Basics - Anfänger-Themen 2
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
Zeppi OOP Methoden mit einander Verknüpfen Java Basics - Anfänger-Themen 6
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
Junger_Basileus Celsius -> Fahrenheit / Strukturierung in statischen Methoden Java Basics - Anfänger-Themen 7
J Verschachtelte Methoden Java Basics - Anfänger-Themen 9
H Methoden in anderen Methoden aufrufen Java Basics - Anfänger-Themen 6
Kawastori Hilfe bei Methoden Übung Java Basics - Anfänger-Themen 6
veryck Methoden Rekursive Methoden mit Rückgabeparameter Java Basics - Anfänger-Themen 9
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
P Methoden aufrufen - Fehler Java Basics - Anfänger-Themen 20
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
G Generics Methoden Java Basics - Anfänger-Themen 7
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
S throws bei Methoden Java Basics - Anfänger-Themen 4
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
I Greedy Methode Methoden nutzen Java Basics - Anfänger-Themen 3
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
S Übergabe von Arrays an Methoden Java Basics - Anfänger-Themen 20
L Methoden Wie Löse ich ext Methoden Aufruf Fehler? Java Basics - Anfänger-Themen 3
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
T Methoden Verständnis Java Basics - Anfänger-Themen 14
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
Kirby.exe Methoden Aufrufe Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
H Aufruf von Methoden durch Methoden Java Basics - Anfänger-Themen 3
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
H Wie kann ich durch Methoden definiren? Java Basics - Anfänger-Themen 8
D Methoden Scannervariablen in static Methoden Java Basics - Anfänger-Themen 5
P Verzweigungen und Methoden Java Basics - Anfänger-Themen 10
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
B Polymorphie Warum funktionieren polymorphe Referenzvariablen bei überschriebenen Methoden und bei nicht überschriebenen nicht? Java Basics - Anfänger-Themen 3
B Methoden Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Methoden richtig anwenden Java Basics - Anfänger-Themen 3
C Zusammenfassen von Methoden in einer Hilfsmethode Java Basics - Anfänger-Themen 19
A Methoden Serialisieren Java Basics - Anfänger-Themen 17
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
H Datenkapselung (get und set Methoden) Java Basics - Anfänger-Themen 2
H if bedinung in methoden umändern Java Basics - Anfänger-Themen 33
H Frage zu Methoden/Funktionen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben