Hallo,
ich habe ein eher exotisches Problem. Ich möchte eine Art dynamisches Filtersystem für bestimmte Klassen erstellen.
Hintergrund ist das variable Zusammenstellen von Empfängergruppen für Nachrichten ("Alle Benutzer, die männlich sind", "Alle Benutzer, die weiblich sind und ein bestimmtes Alter haben", "Alle Benutzer, die 'Max' mit Vornamen heißen und zu einem bestimmten Zeitpunkt in einem bestimmten Raum sind", ...).
Dabei liegen die Daten über die Benutzer in verschiedenen Datenbanktabellen vor und werden über Hibernate auf die entsprechenden Klassen gemappt.
Mein bisheriger Ansatz war eine Art Beschreibungssprache zu entwickeln, mit der man die verschiedenen Klassen mit ihren Attributen als Adressat auswählen kann und mit einem bestimmten Vergleichswert vergleichen kann. Das hat grundlegend auch akzeptabel funktioniert.
Das Problem war hier nur die Erweiterbarkeit. Ich musste in meinem Parser natürlich einen großen switch-case-Block schreiben, um die entsprechenden Getter-Methoden der gewünschten Klasse aufzurufen, je nach dem, welches Attribut gefordert ist. Und dies müsste für alle weiteren Attribute und deren Änderungen erneut überarbeitet werden.
Ich habe nun zwei weitere Ansätze ausgearbeitet:
Zum einen wäre eine gewinnbringende Erweiterung schon mal, wenn es eine Möglichkeit gäbe, die Getter-Methoden über einen String aufzurufen (hier dann auch gleich meine Frage).
Und zum anderen ein Interface zu erstellen, das eine Methode beinhaltet, die einen String als Parameter erhält (den Namen eines Attributs) und den Wert des Attributs dann liefern soll. Dieser Ansatz bedeutet aber, dass die Autoren der entsprechenden Klassen, die mit der Datenbank gemappt werden, sich selbständig um die Implementierung dieser Methode kümmern müssen, deshalb möchte ich erst einmal von dem Ansatz absehen.
Nun zurück zu meiner Frage:
Gibt es irgendwie eine Möglichkeit, eine Methode oder ein Attribut auf Basis eines Strings aufzurufen? Ich kenne das von dem PHP-Framework "cakePHP", dort kann ich eine Variable mit einem String ($this->set('myVar', 42)) erstellen und in einer anderen Klasse dann tatsächlich auf die Variable $myVar zugreifen.
Oder habt ihr gegebenenfalls eine andere neue Idee für mich, wie ich das Problem möglichst effizient lösen könnte?
Grüße,
Naryxus
ich habe ein eher exotisches Problem. Ich möchte eine Art dynamisches Filtersystem für bestimmte Klassen erstellen.
Hintergrund ist das variable Zusammenstellen von Empfängergruppen für Nachrichten ("Alle Benutzer, die männlich sind", "Alle Benutzer, die weiblich sind und ein bestimmtes Alter haben", "Alle Benutzer, die 'Max' mit Vornamen heißen und zu einem bestimmten Zeitpunkt in einem bestimmten Raum sind", ...).
Dabei liegen die Daten über die Benutzer in verschiedenen Datenbanktabellen vor und werden über Hibernate auf die entsprechenden Klassen gemappt.
Mein bisheriger Ansatz war eine Art Beschreibungssprache zu entwickeln, mit der man die verschiedenen Klassen mit ihren Attributen als Adressat auswählen kann und mit einem bestimmten Vergleichswert vergleichen kann. Das hat grundlegend auch akzeptabel funktioniert.
Das Problem war hier nur die Erweiterbarkeit. Ich musste in meinem Parser natürlich einen großen switch-case-Block schreiben, um die entsprechenden Getter-Methoden der gewünschten Klasse aufzurufen, je nach dem, welches Attribut gefordert ist. Und dies müsste für alle weiteren Attribute und deren Änderungen erneut überarbeitet werden.
Ich habe nun zwei weitere Ansätze ausgearbeitet:
Zum einen wäre eine gewinnbringende Erweiterung schon mal, wenn es eine Möglichkeit gäbe, die Getter-Methoden über einen String aufzurufen (hier dann auch gleich meine Frage).
Und zum anderen ein Interface zu erstellen, das eine Methode beinhaltet, die einen String als Parameter erhält (den Namen eines Attributs) und den Wert des Attributs dann liefern soll. Dieser Ansatz bedeutet aber, dass die Autoren der entsprechenden Klassen, die mit der Datenbank gemappt werden, sich selbständig um die Implementierung dieser Methode kümmern müssen, deshalb möchte ich erst einmal von dem Ansatz absehen.
Nun zurück zu meiner Frage:
Gibt es irgendwie eine Möglichkeit, eine Methode oder ein Attribut auf Basis eines Strings aufzurufen? Ich kenne das von dem PHP-Framework "cakePHP", dort kann ich eine Variable mit einem String ($this->set('myVar', 42)) erstellen und in einer anderen Klasse dann tatsächlich auf die Variable $myVar zugreifen.
Oder habt ihr gegebenenfalls eine andere neue Idee für mich, wie ich das Problem möglichst effizient lösen könnte?
Grüße,
Naryxus