Hallo,
Ich habe ein Problem und eine Lösung dafür. Mit dieser bin ich jedoch nicht wirklich zufrieden:
Das Problem:
Bisherige Lösung:
Beschreibung eines Beispiels:
Code-Beispiel: (Seiteneffekt werden über eine Ausgabe dargestellt)
Warum bin ich mit dieser Lösung nicht zufrieden?
Es geht mir an sich nicht um einen konkreten Fall, sondern um ein allgemeines Problem.
Die Anzahl der Interfaces, die man erstellen muss, schießt schnell in die Höhe:
Will man nun noch mehrere Eigenschaften zusammenfassen, steht man wieder vor dem gleichen Problem. Man müsste für jede Kombination von Interfaces, die eine Eigenschaft beschreiben, erneut ein Interface erstellen:
Ich hoffe, meine Formulierung ist einigermaßen verständlich und es gibt den ein oder anderen interessanten Vorschlag.
Ich habe ein Problem und eine Lösung dafür. Mit dieser bin ich jedoch nicht wirklich zufrieden:
Das Problem:
- Ich habe mehrere Klassen und mehrere "Eigenschaften".
- Die Eigenschaften werden/können nicht durch Methoden oder ähnliches beschrieben werden. Sie sind über die Klassen definiert, die sie besitzen (Gemeinsamkeiten).
- Es sollen Gruppen von Klassen gebildet werden. Jede dieser Gruppen besteht aus Klassen, die alle eine bestimmte Eigenschaft gemeinsam haben.
- Die Eigenschaften der Untergruppen/Teilmengen haben/müssen nichts mit den Eigenschaften der übergeordneten Gruppe/Obermenge zu tun haben.
- Außerdem soll der Compiler bei diesen Gruppen auf Typ-Korrektheit überprüfen (können).
Bisherige Lösung:
- Für jede Gruppe wird ein (möglicherweise leeres) Interface erstellt.
- Alle Klassen, die eine gemeinsame Eigenschaft besitzen, implementieren dieses Interface. Die Gruppe bzw. das Interface steht also für alle Klassen mit dieser Eigenschaft.
- Will man nun einer Methode, einen Parameter übergeben, der nur Klassen mit einer bestimmten Eigenschaft annehmen soll, ist der Parameter-Typ das entsprechende Interface.
Beschreibung eines Beispiels:
- Alle Klassen implementieren ein Interface mit einer Methode m1.
- Für jede Eigenschaft wird ein Interface (Grupp) erstellt, das von allen Klassen implementiert wird, die die entsprechende Eigenschaft erfüllen. Eigenschaften könnten z.B. Seiteneffekte sein, die beim ausführen der Methode m1 auftreten.
Das Interface steht folglich für eine Gruppe von Klassen mit einer entsprechenden Eigenschaft. Es repräsentiert sozusagen die Eigenschaft. - Des weiteren existiert noch eine Methode m2, die als Parameter ein Objekt einer Gruppe mit bestimmter Eigenschaft/Seiteneffekt bekommt.
In m2 wird m1 vom übergebenen Objekt aufgerufen. Dabei wissen wir über den Seiteneffekt (SE) bzw. die Eigenschaft (E) Bescheid, die beim Ausführen von m1 auftritt (SE) bzw. erfüllt ist (E). - Es ist nicht möglich, m2 ein Objekt ohne entsprechende Eigenschaft/Seiteneffekt zu übergeben, da der Compiler auf Typ-Korrektheit überprüft.
Code-Beispiel: (Seiteneffekt werden über eine Ausgabe dargestellt)
Java:
public class Example {
public static void m2(Property_12 p_12) {
p_12.m1();
}
public static void main() {
Class_1 c_1 = new Class_1();
Class_2 c_2 = new Class_2();
Class_3 c_3 = new Class_3();
m2(c_1);
m2(c_2);
// m2(c_3); // Is not passed by the compiler (wrong type)
}
}
interface Combinable {
public void m1();
}
interface Property_12 extends Combinable {}
interface Property_13 extends Combinable {}
interface Property_23 extends Combinable {}
interface Property_123 extends Combinable {}
class Class_1 implements Property_12, Property_13, Property_123 {
@Override
public void m1() {
System.out.println("Property (1,2)");
System.out.println("Property (1,3)");
System.out.println("Property (1,2,3)");
}
}
class Class_2 implements Combinable, Property_12, Property_23, Property_123 {
@Override
public void m1() {
System.out.println("Property (1,2)");
System.out.println("Property (2,3)");
System.out.println("Property (1,2,3)");
}
}
class Class_3 implements Combinable, Property_13, Property_23, Property_123 {
@Override
public void m1() {
System.out.println("Property (1,3)");
System.out.println("Property (2,3)");
System.out.println("Property (1,2,3)");
}
}
Warum bin ich mit dieser Lösung nicht zufrieden?
Es geht mir an sich nicht um einen konkreten Fall, sondern um ein allgemeines Problem.
Die Anzahl der Interfaces, die man erstellen muss, schießt schnell in die Höhe:
Kombinations-Möglichkeiten = Potenzmenge der Menge aller Klassen
Wenn die Interfaces/Gruppierungen, wie in diesem Fall, nach einem bestimmten System aufgebaut sind, muss es doch eine Möglichkeit geben, das Ganze eleganter zu lösen, als für jede Gruppe ein Interface zu schreiben. Der Aufwand 2^|K| Interfaces zu erstellen ist schon enorm groß und sollte sich zumindest reduzieren lassen.=> |P(K)| = 2^|K|
Will man nun noch mehrere Eigenschaften zusammenfassen, steht man wieder vor dem gleichen Problem. Man müsste für jede Kombination von Interfaces, die eine Eigenschaft beschreiben, erneut ein Interface erstellen:
|P(P(K))| = 2^2^|K|
Bewältigt man den riesigen Schreibaufwand, kann man dafür, Objekte mit mehreren Eigenschaften übergeben.Ich hoffe, meine Formulierung ist einigermaßen verständlich und es gibt den ein oder anderen interessanten Vorschlag.