Et eksempel på implementering av skuespiller /rollemønsteret i fet skrift.
rollebasert programmering i Fet
Fet tillater utviklere å utvikle OOP programmer som vedvarer til en database. Dette gir oss muligheten til å legge arv til våre applikasjoner, men denne muligheten kan være over brukes.
Som et eksempel, i et program utviklet jeg i fet skrift når jeg hadde følgende modell
Listen strukturen tillater søknaden til rekordinnkjøpsordrer mot en kunde, admin arbeid kan tildeles en AdminEmployee, og flyinformasjon kan registreres mot en Pilot.
rolle basert
problem med ovennevnte scenario er når rollene begynner å bli blandet. For eksempel kan en ansatt bli en kunde, eller en pilot kan gjøre noen deltids administrasjon arbeid.
Løsningen på dette problemet er å bruke skuespiller /rollemønsteret. Hver skuespiller (abstrakt klasse) kan få flere roller (også en abstrakt klasse). Det er disse rollene som har virksomhet relatert informasjon knyttet til dem. For eksempel en PilotRole ville ha flyinformasjon forbundet med det, og CustomerRole ville ha innkjøpsordrer knyttet til den.
Nyere modell vil se omtrent slik ut.
En skuespiller kan ha noen roller, eller mange roller.
et konkret eksempel på en skuespiller kan forby fjerning av en rolle.
en rolle kan nekte søknad til en bestemt skuespiller.
en rolle kan spesifisere at det er nødvendig og ikke kan fjernes (dvs. LoginRole kan ikke fjernes fordi brukeren har også et SystemAdministratorRole)
kan en bestemt forekomst av en skuespiller avvise en rolle.
Oppføring 1: Skuespiller
//Godta eller avvise en rolefunction TActor.CanAcceptRole (ARoleClass: TRoleClass): Boolean, begynner om ikke ARoleClass.AllowDuplicates og HasRole (ARoleClass, null) så Resultat : = False annet hvis ikke ARoleClass.AllowActiveDuplicates og HasActiveRole (ARoleClass, null) så Resultat: = False annet Resultat: = ARoleClass.CanApplyTo (Selv); end;
//Tillat eller forby fjerning av en rolefunction TActor.CanRemoveRole ( ARole: Trole): Boolean, begynner Resultat: = ikke ARole.IsRequired; end; //Returnerer en rolle, men bare hvis det er activefunction TActor.FindActiveRole (AClass: TClass; ExcludeInstance: Trole): Trole; Var jeg: Integer; begynne Resultat: = null; for jeg: = 0 til Roles.Count - en gjøre hvis Roller [I] .Active og (Roller [I] .ClassType = AClass) og (Roller [I] < > ExcludeInstance) da begynne Resultat: = Roller [I ]; Gå i stykker; end, end; //Returnerer en rolle, enten aktivt eller notfunction TActor.FindRole (AClass: TClass; ExcludeInstance: Trole): Trole; Var jeg: Integer; begynne Resultat: = null; for jeg: = 0 til Roles.Count - en gjøre hvis (Roller [I] .ClassType = AClass) og (Roller [I] < > ExcludeInstance), og start Resultat: = Roller [I]; Gå i stykker; end, end; //Returnerer TRUE hvis Skuespiller eier en bestemt rolle, og det er activefunction TActor.HasActiveRole (AClass: TClass; ExcludeInstance: Trole): Boolean, begynner Resultat: = tilordnet (FindActiveRole (AClass, ExcludeInstance)); end; //Returnerer TRUE hvis Skuespillere eier en bestemt rolle (aktiv eller inaktiv) -funksjonen TActor.HasRole (AClass: TClass; ExcludeInstance: Trole): Boolean, begynner Resultat: = tilordnet (FindRole (AClass, ExcludeInstance)); end; funksjon rele .ReceiveQueryFromOwned (Opphavsmann: TObject; OriginalEvent: TBoldEvent, const args: array of const; Subscriber: TBoldSubscriber): Boolean; Var ObjectLocator: TBoldObjectLocator; Rolle: Trole, begynner Resultat: = arvet ReceiveQueryFromOwned (Opphavsmann, OriginalEvent, args, Subscriber); hvis ikke Resultat eller BoldObjectIsDeleted deretter Avslutt; //Sjekk for innsetting av roller if (Opphavsmann = M_Roles), og start hvis OriginalEvent = bqMayInsert deretter begynne //Kom i rollen som settes Assert (args [1] .VType = vtObject); ObjectLocator: = (args [1] .VObject som TBoldObjectLocator); Rolle: = (ObjectLocator.BoldObject som Trole); //Se etter like roller som ikke er tillatt hvis (ikke Role.AllowDuplicates) og (HasRole (Role.ClassType, null)) da begynne Resultat: = False; SetBoldLastFailureReason (TBoldFailureReason.Create ( 'Denne rollen kan bare brukes en gang', Selv)); ende annet //Se etter like aktive roller som ikke er tillatt hvis (ikke Role.AllowActiveDuplicates) og (HasActiveRole (Role.ClassType, null)) da begynne Resultat: = False; SetBoldLastFailureReason (TBoldFailureReason.Create ( 'Kan ikke bruke denne rollen fordi "+" det er allerede en aktiv rolle i denne typen', Selv)); ende annet Resultat: = CanAcceptRole (TRoleClass (Role.ClassType));
hvis ikke Resultat deretter SetBoldLastFailureReason (TBoldFailureReason.Create ( 'rolle kan ikke brukes til dette objektet', Selv)); ende annet //bqMayInsert //Sjekk for fjerning av rollene hvis OriginalEvent = bqMayRemove deretter begynne //Få rollen objektet fjernes Assert (args [0] .VType = vtInteger); Rolle: = Roller [args [0] .VInteger]; Resultat: = (ikke Role.Active) eller (ikke Role.IsRequired); hvis ikke Resultat deretter SetBoldLastFailureReason (TBoldFailureReason.Create ( 'rolle kan ikke fjernes,' + 'det er nødvendig med en annen aktiv rolle', Selv)); ende; //BqMayRemove slutten, slutten;
Oppføring 2: Rolle
//tillate eller nekte programmet til et bestemt Actorclass funksjon TRole.CanApplyTo (AObject: rele): Boolean; begynne Resultat : = False; end; //Virtual metode for å overstyre i etterkommere som beskriver roleclass funksjon TRole.GetRoleName: string; begynne Resultat: = ''; end; //Valgfritt, spesifiserer om aktive duplikater er tillatt eller notclass funksjons TRole.AllowActiveDuplicates : Boolean, begynner Resultat: = False; end; //Valgfritt, spesifiserer om duplikater er tillatt eller ikke (aktiv eller inaktiv) klasse funksjons TRole.AllowDuplicates: Boolean, begynner Resultat: = False; end; //Returnerer sann hvis noen rolle avhengig av denne rollen å være presentfunction TRole.IsRequired: Boolean, Var jeg: Integer; begynne hvis Actor < > nil deretter begynne Resultat: = true; for jeg: = 0 til Actor.Roles.Count - en gjøre hvis Actor.Roles [I] < > selv da hvis Actor.Roles [I] .RequiresRole (egen-) deretter Avslutt; ende; Resultat: = False; end; //styre dette til å angi om en annen rolle er avhengig uponfunction TRole.RequiresRole (ARole: Trole): Boolean, begynner Resultat: = False; end; //Fyller den avledet RoleName attributtet fra klassen methodprocedure Trole ._RoleName_DeriveAndSubscribe (DerivedObject: TObject; Subscriber: TBoldSubscriber), begynner arvet; M_RoleName.AsString: = GetRoleName; end; //Forhindrer sletting av en nødvendig rolefunction TRole.MayDelete: Boolean, begynner Resultat: = ikke IsRequired; ende; funksjon TRole.ReceiveQueryFromOwned (Opphavsmann: TObject; OriginalEvent: TBoldEvent, const args: array av konst, abonnent: TBoldSubscriber): Boolean, begynner Resultat: = arvet ReceiveQueryFromOwned (Opphavsmann, OriginalEvent, args, Subscriber); hvis ikke Resultat deretter Avslutt; if (Opphavsmann = M_Active) da //Aktiv attributtet begynne hvis OriginalEvent = bqMayModify deretter begynne hvis Skuespiller = null da Resultat: = True annet hvis Active deretter begynne //Forby deaktivering hvis en annen rolle krever //denne rollen å være aktiv Resultat: = ikke IsRequired; hvis ikke Resultat deretter SetBoldLastFailureReason (TBoldFailureReason.Create ( 'Kan ikke deaktivere denne rollen,' + 'andre roller krever det, Selv)); ende annet begynne //Forby reaktive hvis en annen aktiv rolle finnes //og duplikater er ikke tillatt Resultat: = AllowActiveDuplicates eller (ikke Actor.HasActiveRole (Self.ClassType, Selv)); hvis ikke Resultat deretter SetBoldLastFailureReason (TBoldFailureReason.Create ( 'Kan ikke aktivere denne rollen "+" fordi det allerede finnes en tilsvarende aktiv rolle', Selv)); ende; ende; //BqMayModify slutten; //Aktiv attributeend; end;
Koden så langt har alle vært abstrakte. Alt som er igjen er å gå ned noen konkrete klasser fra skuespiller og rolle.
Konklusjon
stedet for å ha en ansatt klasse eller en kunde klasse, kan vi nå enkelt tilordne en EmployeeRole eller CustomerRole til alle typer person objekt (som er en skuespiller).
I tillegg kan vi blande roller, kan en pilot utføre administrasjon, og noe kunne være en kunde (en person, avdeling, et selskap, eller et land).
Jeg håper denne artikkelen har vært informativ.
Rollebasert programmering i Bold
Previous:Sentre en image
Next Page:Hvordan lage en TEdit numeric