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

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.

- Ein Schauspieler kann keine Rollen oder viele Rollen haben.
- Eine bestimmte Instanz eines Schauspielers kann das Entfernen einer Rolle verbieten.
- Eine Rolle kann Anwendung von einem bestimmten Schauspieler zu verweigern.
- 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)
- 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.

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

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.

- Ein Schauspieler kann keine Rollen oder viele Rollen haben.
- Eine bestimmte Instanz eines Schauspielers kann das Entfernen einer Rolle verbieten.
- Eine Rolle kann Anwendung von einem bestimmten Schauspieler zu verweigern.
- 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)
- 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.

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
By Wiezutun
Rollenbasierte Programmierung in Fettdruck : Mehreren tausend Tipps, um Ihr Leben einfacher machen.