![]() |
|
|||||||
| Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Nicht angemeldet
Fachbeiträge: n/a
|
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... |
|
| #2 (permalink) | |
|
Stammbenutzer
Megabyte
Registriert seit: 25.10.2007
Fachbeiträge: 1.275
Abgegebene Danke: 47
Erhielt 56 Danke für 53 Beiträge
|
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!
__________________
Quis custodiet ipsos custodes? - Wer überwacht die Wächter? SEM - Skin Editor for Minecraft |
|
|
|
| #3 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 08.11.2009
Fachbeiträge: 187
Abgegebene Danke: 27
Erhielt 7 Danke für 7 Beiträge
|
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 |
|
|
|
| #4 (permalink) | |
|
Nicht angemeldet
Fachbeiträge: n/a
|
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... |
|
| #6 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 08.11.2009
Fachbeiträge: 187
Abgegebene Danke: 27
Erhielt 7 Danke für 7 Beiträge
|
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. Geändert von Sekundentakt (17.10.2010 um 10:20 Uhr) |
|
|
|
| #7 (permalink) | |
|
Nicht angemeldet
Fachbeiträge: n/a
|
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! |
|
| #8 (permalink) | |||||||||||||||||||
|
Nicht angemeldet
Fachbeiträge: n/a
|
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... |
||||||||||||||||||
|
|||||||||||||||||||
| #9 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Kilobyte
Registriert seit: 08.11.2009
Fachbeiträge: 187
Abgegebene Danke: 27
Erhielt 7 Danke für 7 Beiträge
|
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: 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: Geändert von Sekundentakt (17.10.2010 um 10:57 Uhr) |
||||||||||||||||||
|
|
|
||||||||||||||||||
| #13 (permalink) | |||||
|
Stammbenutzer
Viertel Megabyte
Registriert seit: 21.07.2008
Fachbeiträge: 433
Abgegebene Danke: 23
Erhielt 41 Danke für 40 Beiträge
|
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:
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.:
allerdings finde ich diese Möglichkeit am hässlichsten, dann lieber größere Klassen. Slawa |
||||
|
|
|
| #14 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Megabyte
Registriert seit: 28.11.2008
Fachbeiträge: 1.573
Abgegebene Danke: 33
Erhielt 192 Danke für 189 Beiträge
|
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.
__________________
|
||||||||||||||||||
|
|
|
||||||||||||||||||
| #15 (permalink) | |
|
Stammbenutzer
Halbes Gigabyte
Registriert seit: 06.04.2005
Fachbeiträge: 5.533
Blog-Einträge: 15
Abgegebene Danke: 199
Erhielt 728 Danke für 596 Beiträge
|
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 |
|
|
|
| Danke sagt: |
mvitz (17.10.2010)
|
| #16 (permalink) | |||||||||||||||||||
|
Stammbenutzer
CD-R 80
Registriert seit: 07.10.2003
Fachbeiträge: 9.070
Blog-Einträge: 7
Abgegebene Danke: 96
Erhielt 390 Danke für 302 Beiträge
|
__________________
When I was young, I invented an invisible friend called Mr Ravioli. My psychiatrist says I don't need him anymore, so he just sits in the corner and reads |
||||||||||||||||||
|
|
|
||||||||||||||||||
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Methoden von anderen Klassen Aufrufen | Leck0rkuchen | Java Basics - Anfänger-Themen | 5 | 16.02.2010 14:10 |
| Problem Methoden, Klassen, Listen | Copy | Allgemeine Java-Themen | 27 | 05.06.2009 09:47 |
| Tool zum herausfiltern verwendeter Klassen und Methoden | IDEs und Tools | 0 | 02.09.2007 09:16 | |
| dringende frage zu klassen und methoden ( klassendiagramm) | Java Basics - Anfänger-Themen | 19 | 04.08.2005 08:27 | |
| Klassen samt Methoden aus Jar-Archiv laden macht Problem | Tomtom | Allgemeine Java-Themen | 9 | 25.04.2005 13:01 |
| Lesezeichen |
|
|