TDM Geschrieben 10. April 2006 Geschrieben 10. April 2006 Hallo, Ich habe folgendes Problem zwar theoretisch gelößt aber bräuchte Hilfe bei der Umsetzung: Ich habe einige Klasse zur Suche von Objekten (Firmen, Geräte usw.). Diese werden jetzt über verschiedene Klassen (von denen keine Instanzen erzeugt werden) geladen. Da ich aber nicht jede Klasse einzeln aufrufen möchte, hab ich mir gedacht ich mach das ganze dynamisch: Eine Factory (welche auch die abstrakte Basis Klasse für die Unterklassen ist) soll diese Methoden selber aufrufen. Die Klassen haben fast alle den selben Namen - GeraetSearchforxxx (wobei xxx das zusuchende Attribut ist). Jetzt dacht ich mir, ich mach das über die Klasse Class. also: public static Collection find (String searchAttribut, searchText, searchOperator) { return ((GeraetSearchforID) Class.forName(CLASS_PACKAGE + STD_CLASS_NAME + searchAttribut)).find(searchText,searchOperator); } Dabei geben alle Methoden der Unterklasse eine Collection zurück. CLASS_PACKAGE ist das Package in dem die SuchKlassen liegen. STD_CLASS_NAME ist "GeraetSearchfor" und Attribut wäre hier "ID". Soweit zur Theorie... praktisch funktioniert das allerdings nicht wirklich: Cannot cast from Class to GeraetSearchforID. The static method find(...) from GeraetSearchforID be accessed in a static way. Wäre äußerst dankbar für Hilfe. In der Java API zu 1.4 hab ich jedenfalls nicht wirklich was brauchbares gefunden. Zitieren
geloescht_Newlukai Geschrieben 10. April 2006 Geschrieben 10. April 2006 Könnte daran liegen, daß Dein Aufruf versucht ein Objekt der Klasse zu initialisieren: public static Class forName(String className) throws ClassNotFoundException Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to: Class.forName(className, true, currentLoader) Zitieren
TDM Geschrieben 10. April 2006 Autor Geschrieben 10. April 2006 ja, genau das möchte ich aber nicht... ich will nur die Methoden der Klasse benutzen können und sie nicht instanziieren Zitieren
perdian Geschrieben 10. April 2006 Geschrieben 10. April 2006 ich will nur die Methoden der Klasse benutzen können und sie nicht instanziierenDu solltest dich dringend genauer mit den Grundlagen von objektorientierter Programmierung auseinandersetzen, wenn du dir nicht dein gesamtes Design auf Jahre hinaus versauen willst. Eine Methode kann nicht losgelöst von der Klasse existieren, von der sie definiert worden ist und dynamisches Laden von Klassen ist eher eine Ausnahmesituation, als eine angenehme Lösung für das erreichen der meisten Ziele. Zitieren
geloescht_Newlukai Geschrieben 10. April 2006 Geschrieben 10. April 2006 Du solltest dich dringend genauer mit den Grundlagen von objektorientierter Programmierung auseinandersetzen, wenn du dir nicht dein gesamtes Design auf Jahre hinaus versauen willst. Eine Methode kann nicht losgelöst von der Klasse existieren, von der sie definiert worden ist und dynamisches Laden von Klassen ist eher eine Ausnahmesituation, als eine angenehme Lösung für das erreichen der meisten Ziele. *zustimm* Erklär' doch einmal leicht verständlich was Du vorhast. Dann können wir evtl. auch mit einem objektorientierten Ansatz weiterhelfen. Zitieren
TDM Geschrieben 10. April 2006 Autor Geschrieben 10. April 2006 Das Problem an dem ganzen ist ganz einfach das ich für jede Suche eine extra Klasse anlegen soll... bei mitlerweile 50 - 60 Klassen verlier ich aber allmählich die Übersichtlichkeit. Sicher könnte ich das auch ganz einfach mit einem IF-ELSE Konstrukt realisieren - nur da geht wieder die Übersichtlichkeit drauf. Außerdem würde ich meinen dass der Prozess schneller abgehandelt ist, wenn genau diese eine Klasse (mit Funktion) erzeugt wird bevor er erst unzählige von Abfragestrukturen durchgeht. Zitieren
Morbid_Soul Geschrieben 10. April 2006 Geschrieben 10. April 2006 Hi, wie suchst Du denn? Durchsuchst Du eine SQL-Datenbank? Vielleicht brauchst Du auch nicht unbedingt für jede Datenbank/Tabelle (?) eine eigene Klasse. Mir scheint es auch, dass die ganze Sache nicht so kompliziert sein muss. Gruß Zitieren
TDM Geschrieben 10. April 2006 Autor Geschrieben 10. April 2006 ja, db Also momentan ist es noch mysql zwecks Entwicklung... später ist es dann oracle dass mit der klasse für jede suche war eine vorgabe. Ich hätte das auch am liebsten in eine reingehauen... - allerdings wäre dann wieder das Problem, dass man soviele verschiedene methoden hat - ich hab das am liebsten alles zentralisiert, also dass man nur eine methode mit den entsprechenden parametern aufrufen muss... btw: sind durchschnittlich 6 Objektklassen mit ~ 12 attributen... (wobei nicht immer alle im Tabellenmodell abgebildet werden) Zitieren
Morbid_Soul Geschrieben 10. April 2006 Geschrieben 10. April 2006 Hi, sry aber ich kann mir leider noch immer kein Bild von dem Problem machen... Vielleicht kannst Du eine Klasse bauen und ihr die Suchparameter übergeben. Anhand der Suchparameter kann diese Klasse vielleicht versuchen die Suche zu deligieren. Da kann man bestimmt auch was mit abstrakten Methoden machen oder etwas in der Art. Gruß Zitieren
TDM Geschrieben 10. April 2006 Autor Geschrieben 10. April 2006 Ich erklärs nochmal, wieder anhand von code: class SearchFactory { [INDENT]find(String Typ, String Attribut, String text) { [INDENT]//hier soll eine Schnittstellenfunktion geladen werden[/INDENT] }[/INDENT] } class TypASearchFactory extends SearchFactory{ [INDENT]find(String Attribut, String text) { [INDENT]//hier soll eine Schnittstellenfunktion geladen werden[/INDENT] }[/INDENT] } class TypBSearchFactory extends SearchFactory{ [INDENT]find(String Attribut, String text) { [INDENT]//hier soll eine Schnittstellenfunktion geladen werden[/INDENT] }[/INDENT] } class TypASearchFactoryAttributA extends TypASearchFactory { [INDENT]find(String text) { [INDENT]//hier werden Objekte geladen[/INDENT] }[/INDENT] } class TypASearchFactoryAttributB extends TypASearchFactory { [INDENT]find(String text) { [INDENT]//hier werden Objekte geladen[/INDENT] }[/INDENT] } class TypBSearchFactoryAttributA extends TypBSearchFactory { [INDENT]find(String text) { [INDENT]//hier werden Objekte geladen[/INDENT] }[/INDENT] } class TypBSearchFactoryAttributB extends TypBSearchFactory { [INDENT]find(String text) { [INDENT]//hier werden Objekte geladen[/INDENT] }[/INDENT] } So in etwa hatte ich mir das gedacht... Sprich ich ruf eine Funktion der Superklasse auf, die ruft die Basisklasse des entsprechenden Typs auf und diese hat eine Funktion, die die einzelne Suchklassenfunktion aufrufen soll... Also Fabrik -> TypFabrik -> AttributSuche Wenns wirklich so schlechtes Design ist wie perdi sagte, werd ich wohl doch ein großes if-else verwenden... dachte halt so ist das übersichtlicher... Zitieren
perdian Geschrieben 10. April 2006 Geschrieben 10. April 2006 Das Problem an dem ganzen ist ganz einfach das ich für jede Suche eine extra Klasse anlegen soll... bei mitlerweile 50 - 60 Klassen verlier ich aber allmählich die Übersichtlichkeit. 50 bis 60 Klassen? Für jede Suche eine einzige Klasse? :eek Das riecht nach ganz grauenhaften Design. Vererbung ist ja eine feine Sache, aber gerade hier vollkommen unangebracht. Für eine Suche gibt es andere Patterns die hier Verwendung finden sollten. Als Beispiel fällt mir hier ein, ein einziges Suchobjekt zu haben, dass dann entsprechend der Eingaben unterschiedlich mit Werten befüllt wird und von der ausführenden Suchklasse dann anhand dieser Objekte wieder ausgelesen wird. Außerdem würde ich meinen dass der Prozess schneller abgehandelt ist, wenn genau diese eine Klasse (mit Funktion) erzeugt wird bevor er erst unzählige von Abfragestrukturen durchgeht.Vorsicht: Fange nicht an zu optimieren, bevor du durch intensive Untersuchungen (z.B. durch einen Profiler) herausgefunden hast, dass du tatsächlich ein Performanceproblem hast. Auf der einen Seite kann der JIT Compiler durchaus IF-Strukturen zur Laufzeit optimieren, auf der anderen Seite gibt es meistens bei jedem Programm Stellen, die deutlich mehr die Performance bremsen. Zitieren
TDM Geschrieben 11. April 2006 Autor Geschrieben 11. April 2006 50 bis 60 Klassen? Für jede Suche eine einzige Klasse? :eek Das riecht nach ganz grauenhaften Design. Vererbung ist ja eine feine Sache, aber gerade hier vollkommen unangebracht. Für eine Suche gibt es andere Patterns die hier Verwendung finden sollten. Als Beispiel fällt mir hier ein, ein einziges Suchobjekt zu haben, dass dann entsprechend der Eingaben unterschiedlich mit Werten befüllt wird und von der ausführenden Suchklasse dann anhand dieser Objekte wieder ausgelesen wird. Gut 50-60 war bissl übertrieben... sind vielleicht 15 :floet: dennoch viel... das mit der einzelnen klasse hab ich mir auch gedacht aber ich halt mich halt an die vorgaben Wieso soll ich die Suche eigentlich instanziieren ? würde doch mehr Sinn machen wenn es ein Interface ist welches einzelne Funktionen zur Verfügungstellt. Zitieren
perdian Geschrieben 11. April 2006 Geschrieben 11. April 2006 Wieso soll ich die Suche eigentlich instanziieren ? würde doch mehr Sinn machen wenn es ein Interface ist welches einzelne Funktionen zur Verfügungstellt.Dir hierauf hier im Forum eine Antwort zu geben würde nur an der Oberfläche kratzen. Was du machen solltest ist dir ein gutes Buch/Tutorial/whatever zuzulegen, wo erstmal die grundlegenden Prinzipien von objektorientierter Programmierung behandelt werden. Als nächstes wäre dann ein witerführendes Werk über Design Patterns angesagt. Alels Dinge, die einem nicht sofort weiterhelfen, die aber (in der Regel) einen bleibenden Eindruck hinterlassen und sich auf den weitere Programmierstil auswirken und damit für strukturelle Probleme von vorneherein Lösungen vorschlagen bevor das ganze Design vermurkst ist. Und ja, das wird sowohl zeitlich als auch inhaltlich anspruchsvoll und ist nicht mal eben in in paar Tagen erledigt - aber gut Software-Entwicklung ist eben keine Sache, die man mal eben nebenbei erledigen kann. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.