Methoden in großen Klassen gruppieren oder auslagern?

Diskutiere Methoden in großen Klassen gruppieren oder auslagern? im Java Basics - Anfänger-Themen Bereich.
H

Heiko2

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.
 
J

JustNobody

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.
 
H

Heiko2

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.
 
J

JustNobody

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!
 
H

Heiko2

Danke für den Input. Wenn ich Android kennengelernt habe, gebe ich Lombok vielleicht mal eine Chance.
 
mrBrown

mrBrown

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?
 
H

Heiko2

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

mrBrown

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.
 
H

Heiko2

Danke! Mit Strg+Alt+H erhalte ich die Call Hierarchy.

class.png
Die Methoden werden beim Klick auf 'MainActivity' jedoch nicht angezeigt.
 
sascha-sphw

sascha-sphw

Ich mach das über den Shortcut für Naviage -> File Structure. Ich habe aber nicht mehr den default, daher musst Du ihn im Menu selber nachschauen.
 
Thema: 

Methoden in großen Klassen gruppieren oder auslagern?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben