Rollenbasierte Programmierung in Fettdruck

Rollenbasierte Programmierung in Fettdruck


Ein Beispiel für die Implementierung des Schauspieler/Rolle-Musters in Fettschrift.


Rollenbasierte Programmierung in Fettschrift

Fett ermöglicht Entwicklern, OOP-Anwendungen zu entwickeln, die zu einer Datenbank beibehalten. Dies gibt uns die Möglichkeit, unsere Anwendungen Vererbung hinzufügen, aber diese Fähigkeit kann über verwendet werden.

Beispielsweise in einer Anwendung habe ich entwickelt in Fettschrift einmal ich folgende Modell hatte

UMLInheritance.jpg

Die oben Struktur erlaubt die Anwendung aufzeichnen Bestellungen gegen einen Kunden, Admin-Arbeit eine AdminEmployee zugewiesen werden kann und Fluginformationen kann gegen einen Piloten aufgezeichnet werden.

Rollenbasierte

Das Problem mit dem obigen Szenario ist, wenn Rollen beginnen gemischt bekommen. Z. B. Angestellter kann Kunde werden, oder ein Pilot einige Teilzeit Verwaltung erledigen kann.

Die Lösung dieses Problems besteht darin, das Schauspieler/Rolle-Muster verwenden. Jeder Akteur (abstrakte Klasse) kann mehrere Rollen (auch eine abstrakte Klasse) erhalten. Es ist diese Rollen, die Geschäft haben ähnliche Informationen zugeordnet. Zum Beispiel ein PilotRole müsste die Fluginformationen zugeordnet, und die CustomerRole hätte Bestellungen zugeordnet.

Das neuere Modell würde wie folgt aussehen.

UMLActor.jpg

  1. Ein Schauspieler kann keine Rollen oder viele Rollen haben.
  2. Eine bestimmte Instanz eines Schauspielers kann das Entfernen einer Rolle verbieten.
  3. Eine Rolle kann Anwendung von einem bestimmten Schauspieler zu verweigern.
  4. Eine Rolle kann angeben, dass es erforderlich ist und nicht entfernt werden (dh, LoginRole kann nicht entfernt werden, da der Benutzer auch eine SystemAdministratorRole hat)
  5. Eine bestimmte Instanz eines Schauspielers kann eine Rolle ablehnen.

Codebeispiel 1: Schauspieler

Nehmen Sie an oder lehnen Sie eine Rolle ab
Funktion TActor.CanAcceptRole(ARoleClass: TRoleClass): Boolean;
beginnen
Wenn nicht ARoleClass.AllowDuplicates und HasRole(ARoleClass, nil) dann
Ergebnis: = False
sonst
Wenn nicht ARoleClass.AllowActiveDuplicates und
HasActiveRole(ARoleClass, nil) dann
Ergebnis: = False
sonst
Ergebnis: = ARoleClass.CanApplyTo(Self);
Ende;





Lassen Sie zu oder verbieten Sie eine Rolle entfernt
Funktion TActor.CanRemoveRole(ARole: TRole): Boolean;
beginnen
Ergebnis: = nicht ARole.IsRequired;
Ende;



Gibt eine Rolle, aber nur, wenn es aktiv ist
Funktion TActor.FindActiveRole (AClass: TClass; ExcludeInstance: TRole): TRole;
var
I: Integer;
beginnen
Ergebnis: = Nil;
für I: = 0 to Roles.Count - 1
Wenn Rollen [I]. Aktiv und (Rollen [I]. ClassType = AClass) und
(Rollen [I] <> ExcludeInstance) dann
beginnen
Ergebnis: = Rollen [I];
Zu brechen;
Ende;
Ende;



Eine Rolle, gibt zurück, ob aktiv oder nicht
Funktion TActor.FindRole (AClass: TClass; ExcludeInstance: TRole): TRole;
var
I: Integer;
beginnen
Ergebnis: = Nil;
für I: = 0 to Roles.Count - 1
Wenn (Rollen [I]. ClassType = AClass) und
(Rollen [I] <> ExcludeInstance) dann
beginnen
Ergebnis: = Rollen [I];
Zu brechen;
Ende;
Ende;



Gibt True zurück, wenn der Schauspieler eine besondere Rolle besitzt und aktiv ist
Funktion TActor.HasActiveRole (AClass: TClass; ExcludeInstance: TRole): Boolean;
beginnen
Ergebnis: = zugewiesenen (FindActiveRole (AClass, ExcludeInstance));
Ende;



Gibt True zurück, wenn die Akteure besitzt eine besondere Rolle (aktiv oder inaktiv)
Funktion TActor.HasRole (AClass: TClass; ExcludeInstance: TRole): Boolean;
beginnen
Ergebnis: = zugewiesenen (FindRole (AClass, ExcludeInstance));
Ende;



Funktion TActor.ReceiveQueryFromOwned (Urheber: TObject; OriginalEvent: TBoldEvent;
const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
var
ObjectLocator: TBoldObjectLocator;
Rolle: TRole;
beginnen
Ergebnis: = geerbte ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten);
Wenn nicht Ergebnis oder BoldObjectIsDeleted dann Ausfahrt; Kontrollkästchen für das Einfügen von Rollen
Wenn (Urheber = M_Roles) dann
beginnen
Wenn OriginalEvent = BqMayInsert then
beginnen
Die Rolle eingefügt wird
Geltend machen Sie (Args [1]. VType = VtObject);
ObjectLocator: = (Args [1]. VObject als TBoldObjectLocator);
Rolle: = (ObjectLocator.BoldObject als TRole); Überprüfung auf doppelte Rollen, die nicht zulässig sind
Wenn (nicht Role.AllowDuplicates) und
(HasRole(Role.ClassType, nil)) dann
beginnen
Ergebnis: = False;
SetBoldLastFailureReason)
TBoldFailureReason.Create ('diese Rolle kann nur einmal verwendet werden', selbst)
);
anderes Ende
Suchen Sie nach doppelten aktive Rollen, die nicht zulässig sind
Wenn (nicht Role.AllowActiveDuplicates) und
(HasActiveRole(Role.ClassType, nil)) dann
beginnen


Ergebnis: = False;
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Kann nicht gelten diese Rolle da' +
'Es gibt bereits eine aktive Rolle dieser Art', selbst)
);
anderes Ende
Ergebnis: = CanAcceptRole(TRoleClass(Role.ClassType));

Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Rolle nicht auf dieses Objekt angewendet werden', selbst)
);
sonst //bqMayInsert zu beenden
Überprüfen Sie, ob das Entfernen von Rollen
Wenn OriginalEvent = BqMayRemove then
beginnen
Erhalten Sie das Role-Objekt entfernt wird
Geltend machen Sie (Args [0]. VType = VtInteger);
Rolle: = Rollen [Args [0]. VInteger];
Ergebnis: = (nicht Role.Active) oder (nicht Role.IsRequired);
Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Rolle kann nicht entfernt werden,' +
'es ist erforderlich, von einer anderen aktiven Rolle', selbst)
);
Ende; bqMayRemove
Ende;
Ende;

Codebeispiel 2: Rolle

Lassen Sie zu oder verbieten Sie die Anwendung mit einem bestimmten Schauspieler
Klasse Funktion TRole.CanApplyTo(AObject: TActor): Boolean;
beginnen
Ergebnis: = False;
Ende;



Virtuelle Methode überschreiben, nachkommen, dem die Rolle beschrieben
Klasse Funktion TRole.GetRoleName: string;
beginnen
Ergebnis: = '';
Ende;



Optional, legt fest, wenn aktive Duplikate erlaubt sind oder nicht
Klasse Funktion TRole.AllowActiveDuplicates: Boolean;
beginnen
Ergebnis: = False;
Ende;



Optional: gibt an, ob Duplikate erlaubt sind oder nicht (aktiv oder inaktiv)
Klasse Funktion TRole.AllowDuplicates: Boolean;
beginnen
Ergebnis: = False;
Ende;



Gibt True, wenn alle Rolle hängt diese Rolle vorhanden sein
Funktion TRole.IsRequired: Boolean;
var
I: Integer;
beginnen
Wenn Schauspieler <> nil dahin
beginnen
Ergebnis: = True;
für I: = 0 to Actor.Roles.Count - 1
Wenn Actor.Roles[I] <> selbst dann
Wenn Actor.Roles[I]. RequiresRole(self) dann
Ausfahrt;
Ende;
Ergebnis: = False;
Ende;



Überschreiben Sie hier, um anzugeben, wenn eine andere Rolle von denen andere abhängig ist
Funktion TRole.RequiresRole(ARole: TRole): Boolean;
beginnen
Ergebnis: = False;
Ende;



Füllt das abgeleitete RoleName-Attribut aus der Klassenmethode
Prozedur TRole._RoleName_DeriveAndSubscribe (DerivedObject: TObject; Abonnenten: TBoldSubscriber);
beginnen
erbte;
M_RoleName.AsString: = GetRoleName;
Ende;



Verhindert das Löschen einer erforderlichen Rolle
Funktion TRole.MayDelete: Boolean;
beginnen
Ergebnis: = nicht IsRequired;
Ende;



Funktion TRole.ReceiveQueryFromOwned (Urheber: TObject; OriginalEvent: TBoldEvent;
const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
beginnen
Ergebnis: = geerbte ReceiveQueryFromOwned (Urheber,
OriginalEvent, Args, Abonnent);
Wenn nicht, dann Ausfahrt zur Folge;
Wenn (Urheber = M_Active) dann //Active Attribut
beginnen
Wenn OriginalEvent = BqMayModify then
beginnen
Wenn Schauspieler = NULL Then
Ergebnis: = True
sonst
Wenn dann aktiv
beginnen
Zulassen Sie Deaktivierung nicht, wenn eine andere Rolle erfordert
Diese Rolle aktiv sein
Ergebnis: = nicht IsRequired;
Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Kann nicht deaktivieren dieser Funktion' +
'andere Rollen erfordern es,' Self)
);
anderes Ende
beginnen
Reaktivierung zu verbieten, wenn eine andere aktive Rolle vorhanden ist
und Duplikate sind nicht zulässig.
Ergebnis: = AllowActiveDuplicates oder (nicht Actor.HasActiveRole(Self.ClassType, Self));
Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Kann diese Rolle nicht aktivieren' +
'da gibt es bereits eine ähnliche Rolle', selbst)
);
Ende;
Ende; bqMayModify
Ende; Aktive deklariert;
Ende;


Der Code hat alle abstrakten bisher. Noch einige konkreten Klassen von Schauspieler und Rolle abstammen soll.

UMLRoles.jpg

Fazit

Anstatt eine Employee-Klasse oder eine Customer-Klasse, können wir nun leicht eine EmployeeRole oder CustomerRole jede Art von Person-Objekt zuweisen (der Schauspieler ist).

Außerdem mischen wir Rollen, Pilot Verwaltung durchführen kann und nichts könnte ein Kunde (eine Person, Abteilung, eine Firma oder auch ein Land).

Ich hoffe, dieser Artikel ist informativ.








Rollenbasierte Programmierung in Fettdruck


Rollenbasierte Programmierung in Fettdruck : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Ein Beispiel für die Implementierung des Schauspieler/Rolle-Musters in Fettschrift.


Rollenbasierte Programmierung in Fettschrift

Fett ermöglicht Entwicklern, OOP-Anwendungen zu entwickeln, die zu einer Datenbank beibehalten. Dies gibt uns die Möglichkeit, unsere Anwendungen Vererbung hinzufügen, aber diese Fähigkeit kann über verwendet werden.

Beispielsweise in einer Anwendung habe ich entwickelt in Fettschrift einmal ich folgende Modell hatte

UMLInheritance.jpg

Die oben Struktur erlaubt die Anwendung aufzeichnen Bestellungen gegen einen Kunden, Admin-Arbeit eine AdminEmployee zugewiesen werden kann und Fluginformationen kann gegen einen Piloten aufgezeichnet werden.

Rollenbasierte

Das Problem mit dem obigen Szenario ist, wenn Rollen beginnen gemischt bekommen. Z. B. Angestellter kann Kunde werden, oder ein Pilot einige Teilzeit Verwaltung erledigen kann.

Die Lösung dieses Problems besteht darin, das Schauspieler/Rolle-Muster verwenden. Jeder Akteur (abstrakte Klasse) kann mehrere Rollen (auch eine abstrakte Klasse) erhalten. Es ist diese Rollen, die Geschäft haben ähnliche Informationen zugeordnet. Zum Beispiel ein PilotRole müsste die Fluginformationen zugeordnet, und die CustomerRole hätte Bestellungen zugeordnet.

Das neuere Modell würde wie folgt aussehen.

UMLActor.jpg

  1. Ein Schauspieler kann keine Rollen oder viele Rollen haben.
  2. Eine bestimmte Instanz eines Schauspielers kann das Entfernen einer Rolle verbieten.
  3. Eine Rolle kann Anwendung von einem bestimmten Schauspieler zu verweigern.
  4. Eine Rolle kann angeben, dass es erforderlich ist und nicht entfernt werden (dh, LoginRole kann nicht entfernt werden, da der Benutzer auch eine SystemAdministratorRole hat)
  5. Eine bestimmte Instanz eines Schauspielers kann eine Rolle ablehnen.

Codebeispiel 1: Schauspieler

Nehmen Sie an oder lehnen Sie eine Rolle ab
Funktion TActor.CanAcceptRole(ARoleClass: TRoleClass): Boolean;
beginnen
Wenn nicht ARoleClass.AllowDuplicates und HasRole(ARoleClass, nil) dann
Ergebnis: = False
sonst
Wenn nicht ARoleClass.AllowActiveDuplicates und
HasActiveRole(ARoleClass, nil) dann
Ergebnis: = False
sonst
Ergebnis: = ARoleClass.CanApplyTo(Self);
Ende;





Lassen Sie zu oder verbieten Sie eine Rolle entfernt
Funktion TActor.CanRemoveRole(ARole: TRole): Boolean;
beginnen
Ergebnis: = nicht ARole.IsRequired;
Ende;



Gibt eine Rolle, aber nur, wenn es aktiv ist
Funktion TActor.FindActiveRole (AClass: TClass; ExcludeInstance: TRole): TRole;
var
I: Integer;
beginnen
Ergebnis: = Nil;
für I: = 0 to Roles.Count - 1
Wenn Rollen [I]. Aktiv und (Rollen [I]. ClassType = AClass) und
(Rollen [I] <> ExcludeInstance) dann
beginnen
Ergebnis: = Rollen [I];
Zu brechen;
Ende;
Ende;



Eine Rolle, gibt zurück, ob aktiv oder nicht
Funktion TActor.FindRole (AClass: TClass; ExcludeInstance: TRole): TRole;
var
I: Integer;
beginnen
Ergebnis: = Nil;
für I: = 0 to Roles.Count - 1
Wenn (Rollen [I]. ClassType = AClass) und
(Rollen [I] <> ExcludeInstance) dann
beginnen
Ergebnis: = Rollen [I];
Zu brechen;
Ende;
Ende;



Gibt True zurück, wenn der Schauspieler eine besondere Rolle besitzt und aktiv ist
Funktion TActor.HasActiveRole (AClass: TClass; ExcludeInstance: TRole): Boolean;
beginnen
Ergebnis: = zugewiesenen (FindActiveRole (AClass, ExcludeInstance));
Ende;



Gibt True zurück, wenn die Akteure besitzt eine besondere Rolle (aktiv oder inaktiv)
Funktion TActor.HasRole (AClass: TClass; ExcludeInstance: TRole): Boolean;
beginnen
Ergebnis: = zugewiesenen (FindRole (AClass, ExcludeInstance));
Ende;



Funktion TActor.ReceiveQueryFromOwned (Urheber: TObject; OriginalEvent: TBoldEvent;
const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
var
ObjectLocator: TBoldObjectLocator;
Rolle: TRole;
beginnen
Ergebnis: = geerbte ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten);
Wenn nicht Ergebnis oder BoldObjectIsDeleted dann Ausfahrt; Kontrollkästchen für das Einfügen von Rollen
Wenn (Urheber = M_Roles) dann
beginnen
Wenn OriginalEvent = BqMayInsert then
beginnen
Die Rolle eingefügt wird
Geltend machen Sie (Args [1]. VType = VtObject);
ObjectLocator: = (Args [1]. VObject als TBoldObjectLocator);
Rolle: = (ObjectLocator.BoldObject als TRole); Überprüfung auf doppelte Rollen, die nicht zulässig sind
Wenn (nicht Role.AllowDuplicates) und
(HasRole(Role.ClassType, nil)) dann
beginnen
Ergebnis: = False;
SetBoldLastFailureReason)
TBoldFailureReason.Create ('diese Rolle kann nur einmal verwendet werden', selbst)
);
anderes Ende
Suchen Sie nach doppelten aktive Rollen, die nicht zulässig sind
Wenn (nicht Role.AllowActiveDuplicates) und
(HasActiveRole(Role.ClassType, nil)) dann
beginnen


Ergebnis: = False;
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Kann nicht gelten diese Rolle da' +
'Es gibt bereits eine aktive Rolle dieser Art', selbst)
);
anderes Ende
Ergebnis: = CanAcceptRole(TRoleClass(Role.ClassType));

Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Rolle nicht auf dieses Objekt angewendet werden', selbst)
);
sonst //bqMayInsert zu beenden
Überprüfen Sie, ob das Entfernen von Rollen
Wenn OriginalEvent = BqMayRemove then
beginnen
Erhalten Sie das Role-Objekt entfernt wird
Geltend machen Sie (Args [0]. VType = VtInteger);
Rolle: = Rollen [Args [0]. VInteger];
Ergebnis: = (nicht Role.Active) oder (nicht Role.IsRequired);
Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Rolle kann nicht entfernt werden,' +
'es ist erforderlich, von einer anderen aktiven Rolle', selbst)
);
Ende; bqMayRemove
Ende;
Ende;

Codebeispiel 2: Rolle

Lassen Sie zu oder verbieten Sie die Anwendung mit einem bestimmten Schauspieler
Klasse Funktion TRole.CanApplyTo(AObject: TActor): Boolean;
beginnen
Ergebnis: = False;
Ende;



Virtuelle Methode überschreiben, nachkommen, dem die Rolle beschrieben
Klasse Funktion TRole.GetRoleName: string;
beginnen
Ergebnis: = '';
Ende;



Optional, legt fest, wenn aktive Duplikate erlaubt sind oder nicht
Klasse Funktion TRole.AllowActiveDuplicates: Boolean;
beginnen
Ergebnis: = False;
Ende;



Optional: gibt an, ob Duplikate erlaubt sind oder nicht (aktiv oder inaktiv)
Klasse Funktion TRole.AllowDuplicates: Boolean;
beginnen
Ergebnis: = False;
Ende;



Gibt True, wenn alle Rolle hängt diese Rolle vorhanden sein
Funktion TRole.IsRequired: Boolean;
var
I: Integer;
beginnen
Wenn Schauspieler <> nil dahin
beginnen
Ergebnis: = True;
für I: = 0 to Actor.Roles.Count - 1
Wenn Actor.Roles[I] <> selbst dann
Wenn Actor.Roles[I]. RequiresRole(self) dann
Ausfahrt;
Ende;
Ergebnis: = False;
Ende;



Überschreiben Sie hier, um anzugeben, wenn eine andere Rolle von denen andere abhängig ist
Funktion TRole.RequiresRole(ARole: TRole): Boolean;
beginnen
Ergebnis: = False;
Ende;



Füllt das abgeleitete RoleName-Attribut aus der Klassenmethode
Prozedur TRole._RoleName_DeriveAndSubscribe (DerivedObject: TObject; Abonnenten: TBoldSubscriber);
beginnen
erbte;
M_RoleName.AsString: = GetRoleName;
Ende;



Verhindert das Löschen einer erforderlichen Rolle
Funktion TRole.MayDelete: Boolean;
beginnen
Ergebnis: = nicht IsRequired;
Ende;



Funktion TRole.ReceiveQueryFromOwned (Urheber: TObject; OriginalEvent: TBoldEvent;
const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
beginnen
Ergebnis: = geerbte ReceiveQueryFromOwned (Urheber,
OriginalEvent, Args, Abonnent);
Wenn nicht, dann Ausfahrt zur Folge;
Wenn (Urheber = M_Active) dann //Active Attribut
beginnen
Wenn OriginalEvent = BqMayModify then
beginnen
Wenn Schauspieler = NULL Then
Ergebnis: = True
sonst
Wenn dann aktiv
beginnen
Zulassen Sie Deaktivierung nicht, wenn eine andere Rolle erfordert
Diese Rolle aktiv sein
Ergebnis: = nicht IsRequired;
Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Kann nicht deaktivieren dieser Funktion' +
'andere Rollen erfordern es,' Self)
);
anderes Ende
beginnen
Reaktivierung zu verbieten, wenn eine andere aktive Rolle vorhanden ist
und Duplikate sind nicht zulässig.
Ergebnis: = AllowActiveDuplicates oder (nicht Actor.HasActiveRole(Self.ClassType, Self));
Wenn nicht dann führen
SetBoldLastFailureReason)
TBoldFailureReason.Create ('Kann diese Rolle nicht aktivieren' +
'da gibt es bereits eine ähnliche Rolle', selbst)
);
Ende;
Ende; bqMayModify
Ende; Aktive deklariert;
Ende;


Der Code hat alle abstrakten bisher. Noch einige konkreten Klassen von Schauspieler und Rolle abstammen soll.

UMLRoles.jpg

Fazit

Anstatt eine Employee-Klasse oder eine Customer-Klasse, können wir nun leicht eine EmployeeRole oder CustomerRole jede Art von Person-Objekt zuweisen (der Schauspieler ist).

Außerdem mischen wir Rollen, Pilot Verwaltung durchführen kann und nichts könnte ein Kunde (eine Person, Abteilung, eine Firma oder auch ein Land).

Ich hoffe, dieser Artikel ist informativ.

Rollenbasierte Programmierung in Fettdruck

Rollenbasierte Programmierung in Fettdruck : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Rollenbasierte Programmierung in Fettdruck
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung