Stilfrage: Klassen & Methoden

F

Frank123134

Gast
Hallo zusammen,
ich bin recht neu in Java und hab steh grad vor nem Stil-Problem.
Situtation: ich hab ne Klasse die recht viele Methoden zur Verfügung stellt -> jede diese Methoden greift auch noch auf Hilfsfunktionen zu... insgesamt, ist das ganze File der Klasse dann so ca 2500 Zeilen lang und dementsprechend unübersichtlich.

Deshalb meine Frage: Kann ich Methoden in ein anderes File auslagern und zwar so, dass sie sich trotzdem wie normale Methoden verhalten?
Also, ich kann ja zum Beispiel für ne große Methode auch ne eigene Klasse im gleichen Pakage erzeugen - dann hab ich zwar bei protected Variable, auch normalen Zugriff auf die Werte der urspünglichen Klasse, aber muss halt dann immer wenn ich die Methode benutzen will, erst eine Instanze erzeugen...
Des find ich irgendwie nicht so schick...

Naja, würd mich auf jedenfall interessieren, wie ihr sowas macht...
 

Atze

Top Contributor
wenn es wirklich nur hilfmethoden sind, kannst du sie dir doch in eine hilfsklasse auslagern und statisch machen. dann brauchst du dafür auch kein objekt!
 

Sekundentakt

Bekanntes Mitglied
Hi,

2.500 Zeilen. Das ist schon ein wahres Monster.
Ich erinnere mich an die Worte eines Linux-Gurus: "Jedes Programm erfüllt nur einen ganz bestimmten Zweck."

Ich würde mal behaupten, Deine 2.500-Zeilen-Klasse ist eine Art "Mädchen für alles".
Schau Dir mal an, welche Methoden Du zu einer logischen Einheit zusammenschließen kannst.
Das erhöht dann auch die Wiederverwendbarkeit deines Codes.

Mach das aber nicht unter der Zielstellung "die Klasse muss kleiner werden", sondern schau auch, dass die Klassen ohne die "Haptklasse" arbeiten können, sonst gewinnst Du auf lange Sicht nicht viel dabei.

Grüße
 
F

Frank123134

Gast
Nee, also es ist schon so, dass die Methoden direkt auf die Klassenvariabeln zugreifen müssen, also auch direkt auf Klassenobjekten operieren sollten... Ist nur so, daß ein paar der Methoden aus mehreren Funktionen bestehen z.B. sowas wie initFunction1(), iterationFunction1() ect...
Wollt damit nur zum Ausdruck bringen, dass es einfach sehr viel Code ist...
 
F

Frank123134

Gast
Hmm ok... dann schau ich mal ob ich da was auseinanderbauen kann..
Geht halt konkret um ne Baum Struktur, mit Sachen wie insert, delete, search, NNsearch, kNNsearch, RangeSearch ect...
Ich find des gehört da schon alles rein oder?
 

Sekundentakt

Bekanntes Mitglied
Ohne sowas mal selbst gemacht zu haben, kann ich Dir da nicht viel zu sagen.

Aber ich würde da in etwa so rangehen:
Welche Objekte gibt's?

Es gibt den Baum als Ganzes.
Der besteht aus Knoten und Blättern.

Würde ich mich noch weiter mit der Materie beschäftigt haben, fielen mir sicherlich noch ein paar Dinge mehr ein.

Jetzt würde ich in etwa so vorgehen:
Der Baum an sich ist nur eine Art Controller. Er bestimmt wann gelöscht, wann eingefügt und wann irgendetwas traversiert wird. Das sind Methoden, die er haben muss, um seine Knoten und Blätter zu verwalten.

Die Knoten verwalten wiederum den Zugriff auf Blätter und haben auch noch weitere Methoden, auf die der Baum bei Suchanfragen zugreifen können muss.
Blätter verwalten die Daten und haben Methoden, auf die ein Knoten und ggf. sogar der Baum zugreifen können muss.

Ich stecke gerade nicht in der Materie, aber ich sehe hier doch schon eine auftrennbare Struktur.

Hilft Dir das weiter?

EDIT: Um noch mal auf das Zitat von oben zurückzukommen:
Der Baum hat nur einen Zweck: Die Verwaltung der Knoten und Blätter.

Wenn Operationen zu komplex werden, zum Beispiel das Einfügen neuer Knoten und Blätter, dann lohnt es sich auch diese in eine eigene Klasse zu implementieren. Der Baum stößt dann lediglich eine Art addNode()-Methode dieser Klasse an und der Rest geschieht dann an anderer Stelle.
 
Zuletzt bearbeitet:
F

Frank123134

Gast
Ja, Baum und Knoten sind schon 2 Klassen...
Also,was man noch machen könnte ist die ganzen Queries auslagere.

Also, daß ich dann sowas in der Art:

public class Tree{
...
}

public class Query{

public static Point NearestNeighborSearch(Tree t, Point p){
....
}


public static LinkedList<Point> RangeSearch(Tree t, Range r){
.....
}
}




Dann kann ich z.B. wenn ich nen Tree t und Point o hab mit Query.NearestNeighborSearch(t, p) die NearestNeighbor-abfrage aufrufen....
Ich denk des mach Sinn..
Vielen Dank!
 
F

Frank123134

Gast
Wenn Operationen zu komplex werden, zum Beispiel das Einfügen neuer Knoten und Blätter, dann lohnt es sich auch diese in eine eigene Klasse zu implementieren. Der Baum stößt dann lediglich eine Art addNode()-Methode dieser Klasse an und der Rest geschieht dann an anderer Stelle.


Ja des klingt gut, dabei ist es dann aber üblich die Funktionen in dieser neuen Klassen public static zu machen oder?
Dass man, wie auch schon erwähnt wurde, keine Objekte braucht...
 

Sekundentakt

Bekanntes Mitglied
Ja des klingt gut, dabei ist es dann aber üblich die Funktionen in dieser neuen Klassen public static zu machen oder?
Dass man, wie auch schon erwähnt wurde, keine Objekte braucht...

Static macht Sinn, wenn die Methode so aussehen könnte:

myClass.addNode(Tree t, Node n)

Vorausgesetzt, myClass braucht Wissen nicht dauerhaft speichern und benötigt zum Ausführen seiner Aufgabe nur die über t und n verfügbaren Daten, dann kannst Du das static machen.

Fang aber nicht an Static Fields einzusetzen.
Wenn Du einen statischen Wert in irgendeinem instantiierten Objekt veränderst, dann veränderst Du ihn für alle Objekte dieser Klasse.
Static-Variablen und Methoden sind nicht mehr an Objekte, sondern nur noch an die Klasse gebunden.

EDIT:
Mir fällt gerade ein wunderbares Beispiel für Static-Fields ein.
Konstanten! Denn nichts anderes sollte in solchen Variablen gespeichert werden.
Beispielsweise könnte Deine Konstante so aussehen:

Java:
public static int ADD_AND_TRAVERSE = 1;

Dann könnte die addNode - Methode z.B. auch so aussehen:
addNode(Tree t, Node n, int Mode) -> aufgerufen dann so:
myClass.addNode(t, n, myClass.ADD_AND_TRAVERSE);

Du könntest dann in dieser Methode auf die Konsante näher eingehen, z.B. so:

Java:
if(mode == ADD_AND_TRAVERSE)
{
   //hier wird der Baum nach dem Hinzufügen des Knoten traversiert...
}
 
Zuletzt bearbeitet:

slawaweis

Bekanntes Mitglied
große Klassen kommen schon mal vor, bei der Arbeit mit Swing sogar öfters. JTree hat z.B. ~4800 LOC, JTable ~7800 LOC, wobei ~2/3 Dokumentation ist. So kommt es immer auf die Funktionalität an, die benötigt wird. Wenn also eine Klasse per Definition viele Methoden haben muss, muss die Klasse diese auch haben. Folgend ein paar Vorgehensweisen zu möglichen Klassenorganisation.

1. Man kann größere Klassen strukturieren/formatieren. Ich verwende z.B. so ein System:

Java:
/////////////////////////////////////////////////////////////////////////////
// Teil 2: Getter / Setter

 public void set...

// Teil 2: Getter / Setter
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// Teil 3: Actions

wobei ich eine größere Datei in logische Blöcke unterteile und Oben in der Datei aufschreibe, was es alles für Blöcke gibt.

2. Klassen kann man auch als erweiterten Namespace-Mechanismus verwenden. D.h. eine große Klasse enthält wenig eigener Funktionalität, aber viele innere statische Klassen und bildet eine Art erweitertes Package. Per Refactoring kann man jederzeit diese rausnehmen oder einfügen.

3. Eine weitere Möglichkeit wäre die Delegation. D.h. die Funktionalität wird in einer anderen Klasse implementiert und von dieser Klasse wird in der Hauptklasse eine Instanz erzeugt. Die Methodenaufrufe werden dann von der Hauptklasse in die andere Klasse durchgeschleift. Dazu kann man sich das Delegations-Pattern ansehen.

Delegation pattern - Wikipedia, the free encyclopedia

4. Noch eine Möglichkeit größere Klassen zu verkleinern ist die Auslagerung bestimmter Funktionalität in statische Funktionen in anderen Klassen. Dabei werden der statischen Funktion die benötigten Klassenvariablen übergeben oder zu Not das ganze Objekt. z.B.:

Java:
public class Hauptklasse
{
 protected Integer value1 = new Integer(1);
 protected Integer value2 = new Integer(2);

 public Integer operationX(Integer p1, Integer p2)
  {
  return HauptklasseHelper.operationX(value1, value2, p1, p2);
  }

 public Integer operationY(Integer p1, Integer p2)
  {
  return HauptklasseHelper.operationY(this, p1, p2);
  }
}

protected class HauptklasseHelper
{
 protected static Integer operationX(Integer v1, Integer v2, Integer p1, Integer p2)
  {
  return ...
  }

 protected static Integer operationY(Hauptklasse hk, Integer p1, Integer p2)
  {
  return ...
  }
}

allerdings finde ich diese Möglichkeit am hässlichsten, dann lieber größere Klassen.

Slawa
 

mvitz

Top Contributor
Bisher lief das in allen Projekten die ich gesehen habe über Konstanten.
Gibt es da bei Enums einen besonderen Vorteil?

Evtl. waren das Projekte, die vor Java 1.5 entstanden sind und ja, enums haben Vorteile

1) Ein enum kann noch eigene Methoden haben
2) Ein enum sichert dir Typsicherheit zu. Bei der Methode mit dem Modi, kann man als Aufrufer ja auch einen int übergeben, der zu keinem Modi passt, mit einem enum kann dies nicht passieren.
3) Enums sind halt genau für solche Fälle konzipiert worden, da sollte man diese auch verwenden.
 

Landei

Top Contributor
4) Enums sind wesentlich unproblematischer, wenn neue Optionen hinzukommen oder alte wegfallen
5) Enums lassen sich leicht in normale Klassen umstrukturieren, wenn man mehr Funktionalität/Flexibilität braucht als ursprünglich geplant
 
B

bygones

Gast
Ja, Baum und Knoten sind schon 2 Klassen...
Also,was man noch machen könnte ist die ganzen Queries auslagere.

Also, daß ich dann sowas in der Art:

public class Tree{
...
}

public class Query{

public static Point NearestNeighborSearch(Tree t, Point p){
....
}


public static LinkedList<Point> RangeSearch(Tree t, Range r){
.....
}
}




Dann kann ich z.B. wenn ich nen Tree t und Point o hab mit Query.NearestNeighborSearch(t, p) die NearestNeighbor-abfrage aufrufen....
Ich denk des mach Sinn..
Vielen Dank!

schau dir mal das Visitor Pattern an...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Stilfrage: statische Methoden und Attribute auf jeden Fall verhindern? Java Basics - Anfänger-Themen 5
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
S Stilfrage: Neue Klasse wenn es in einer Klasse zu viele Methoden gibt? Java Basics - Anfänger-Themen 14
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
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 Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
E Klassen implementieren Java Basics - Anfänger-Themen 94
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
L Wie teilt man ein Programm in vernünftige Klassen ein? Java Basics - Anfänger-Themen 10
T Klassen Denkfehler im Klassen "dynamisch" instanzieren? Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
A Methode, Klassen Java Basics - Anfänger-Themen 3
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
J Zwei Klassen die sich gegenseitig referenzieren - Bad practice? Java Basics - Anfänger-Themen 4
G Klassen und Objekte Java Basics - Anfänger-Themen 2
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
D Klassen ausgeben Java Basics - Anfänger-Themen 2
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
G Refactoring von mehreren identischen Klassen Java Basics - Anfänger-Themen 36
O Wrapper Klassen Java Basics - Anfänger-Themen 6
CptK Best Practice Klassendiagramm aus fertigen Klassen erstellen lassen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben