Rollenverhalten in OOP Systemen abbilden

kossy

Bekanntes Mitglied
Hallo !

Ich habe mal eine Frage an euch. Des geht um sogenanntes Rollenverhalten innerhalb eines OOP Systems. Häufig findet in einem OOP Design eine Art Klassenexplosion statt, wenn man versucht eine Art Rollenverhalten abzubilden.

Beispiel: Eine Person könnte als Kellner, oder als Student, oder als Gast auftreten. Der Kellner könnte nun eine Cafe Kellner sein und der Gast bspw. ein Hotelgast. Man müsste also von der Basisklasse Person die Klassen Kellner, Student und Gast ableiten und von den Klassen Kellner widerum die Klasse Cafekellner usw.

Das führt schnell zu einer zu unübersichtlichen und schwer wartbaren Klassenhierarchie und ich frage mich nun, wie man solches Rollenverhalten (in Prinzip nimmt die Klasse Person immer unterschiedliche Rollen ein) langfristig sinnvoll in einem OOP System adaptieren könnte.

Grüße
Kossy
 
D

dhalsim

Gast
Wenn dich die Abbildung von Rollenkonzepten interessiert, dann solltest du dich auf jeden Fall mal zum DCI (Data Context Interaction) einlesen.
 

bwbg

Mitglied
Als erstes kam mir in den Sinn, das Ganze mittels Komposition, statt Vererbung abzubilden.

Statt "Kellner ist eine Person" eben "Eine Person hat KellnerRolle"

So kann man die Vererbungshierarchie flach halten.

Grüße ... bwbg
 

Tobse

Top Contributor
Als erstes kam mir in den Sinn, das ganze mittel Komposition, statt Vererbung abzubilden.

Statt "Kellner ist eine Person" eben "Eine Person hat KellnerRolle"

So kann man die Vererbungshierarchie flach halten.

Grüße ... bwbg

Ich würde das auch so regeln. Etwa so:
Java:
class Role
{
}
class WaiterRole extends Role
{
    public toString()
    {
        return "Waiter";
    }  
}
class Person
{
    private Role role;
}
 
D

dhalsim

Gast
Ich würde das auch so regeln. Etwa so:
...
Könntest du bitte kurz skizzieren, wie du bei diesem Ansatz die Person dann auch wirklich als Kellner und Student benutzt? Das ist mir aus diesem Code noch etwas unklar.



Davon abgesehen würde ich das Ganze in Java eher mittels Adaption zur Laufzeit lösen, bin da aber für andere Anregungen sehr offen:

Entweder in den rollenfähigen Objekten
Java:
Person john = new Person("John Doe");

Student studentJohn = john.adaptTo( Student.class );
studentJohn.learn(...);
studentJohn.writeExam(...);

Waiter waiterJohn = john.adaptTo( Waiter.class );
...
Oder durch eine dritte Instanz:
Java:
Person john = new Person("John Doe");

Student studentJohn = RoleAdapter.adapt( john ).to( Student.class );

Waiter waiterJohn = RoleAdapter.adapt( john ).to( Waiter.class );
Der letztere Ansatz hat den Vorteil, dass die Person-Klasse vom Rollenkonzept absolut unberührt bleibt.

Die einzelnen Rollen könnten als einfacher Ansatz als normale Adapter implementiert sein

Java:
interface Student {
   void learn(...);
   void writeExam(...);
}

class StudentRole implements Student {
   Person adaptee;
   ...
}
 
Zuletzt bearbeitet von einem Moderator:

Tobse

Top Contributor
Kommt darauf an, was die Rolle heissen soll. Auf meine art liesen sich eben über die Rolle aufgaben/etc zuteilen, allerdings nur schwer verhaltensweisen.
 
D

dhalsim

Gast
Ich seh da jetzt nicht so viele Unklarheiten. Was der TO anspricht deckt sich stark mit den Konzepten des DCI. Hattest du dir das schon mal angeschaut? Das wäre sicherlich sinnvoll, um nicht aneinander vorbeizureden.
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Oben