Función de programación basado en negrita
Un ejemplo de la aplicación de la Actor/Rol de patrón en Negrita.
Papel de programación basado en Negrita
Negrita permite a los programadores desarrollar aplicaciones de la programación orientada a objetos que persisten a una base de datos. Esto nos da la posibilidad de añadir a la herencia para nuestras aplicaciones, pero esta capacidad puede ser más utilizado.
Como ejemplo, en una aplicación que he desarrollado en Negrita una vez tuve el siguiente modelo
La estructura anterior permite que la aplicación registro de órdenes de compra en contra de un Cliente, de administración de trabajo puede ser asignado a un AdminEmployee, y de información de vuelo puede ser que se registró contra un Piloto.
basado en funciones
El problema con el escenario anterior es cuando las funciones comienzan a mezclarse. Por ejemplo, un Empleado puede convertirse en un Cliente, o un Piloto puede hacer un poco de tiempo de trabajo de la administración.
La solución a este problema es utilizar el Actor/Rol de patrón. Cada Actor (clase abstracta) puede recibir múltiples Funciones (también una clase abstracta). Son estas Funciones las que tienen negocios relacionados con la información asociada a ellos. Por ejemplo, un PilotRole tendría el vuelo de la información asociada con ella, y la CustomerRole habría órdenes de compra asociadas con él.
El nuevo modelo sería algo como esto.
- Un Actor puede no tener papeles, o muchos papeles.
- Una instancia específica de un Actor puede prohibir la extracción de un papel.
- función puede negar aplicación a un determinado Actor.
- función puede especificar que es obligatorio y no puede ser removido (es decir, LoginRole no puede ser eliminado porque el usuario también tiene un SystemAdministratorRole)
- Una instancia específica de un Actor puede rechazar un papel.
Listado 1: Actor
//Aceptar o rechazar un papel función TActor.CanAcceptRole(ARoleClass: TRoleClass): Boolean begin si no ARoleClass.AllowDuplicates y HasRole(ARoleClass, nil) then Resultado := False else si no ARoleClass.AllowActiveDuplicates y HasActiveRole(ARoleClass, nil) then Resultado := False else Resultado := ARoleClass.CanApplyTo(Auto) fin
//permitir o no Permitir la eliminación de un rol función TActor.CanRemoveRole(ARole: TRole): Boolean begin Resultado := no ARole.IsRequired fin
//Devuelve un papel, pero sólo si está activo función TActor.FindActiveRole(AClass: TClass ExcludeInstance: TRole): TRole var I: Integer begin Resultado := nil for I := 0 para las Funciones.Count - 1 do si las Funciones[I].Activo y (Roles[I].ClassType = AClass) y (Roles[I] <> ExcludeInstance), a continuación, begin Resultado := Funciones[I] Break fin fin
//Devuelve un papel, ya sea activa o no función TActor.FindRole(AClass: TClass ExcludeInstance: TRole): TRole var I: Integer begin Resultado := nil for I := 0 para las Funciones.Count - 1 do si (Roles[I].ClassType = AClass) y (Roles[I] <> ExcludeInstance), a continuación, begin Resultado := Funciones[I] Break fin fin
//Devuelve True si el Actor es dueño de una función específica y es activo función TActor.HasActiveRole(AClass: TClass ExcludeInstance: TRole): Boolean begin Resultado := Asignada(FindActiveRole(AClass, ExcludeInstance)) fin
//Devuelve True si el actor es dueño de una función específica (activo o inactivo) función TActor.HasRole(AClass: TClass ExcludeInstance: TRole): Boolean begin Resultado := Asignada(FindRole(AClass, ExcludeInstance)) fin
función TActor.ReceiveQueryFromOwned(Autor: TObject OriginalEvent: TBoldEvent const Args: array de const Suscriptor: TBoldSubscriber): Boolean var ObjectLocator: TBoldObjectLocator Función: TRole begin Resultado := heredado ReceiveQueryFromOwned(Originador, OriginalEvent, Args, el Suscriptor) si no Resultado o BoldObjectIsDeleted, a continuación, Salir de //de Verificación para la inserción de funciones si (Autor = M_Roles) a continuación, begin si OriginalEvent = bqMayInsert, a continuación, begin //Obtener el papel que está insertado Assert(Args[1].VType = vtObject) ObjectLocator := (Args[1].VObject como TBoldObjectLocator) Función := (ObjectLocator.BoldObject como TRole) //Comprobar la duplicación de funciones que no están permitidos si (no Papel.AllowDuplicates) y (HasRole(en el Papel.ClassType, nil)), a continuación, begin Resultado := False SetBoldLastFailureReason( TBoldFailureReason.Create('Esta función puede ser aplicada solamente una vez', Self) ) else //Comprobación de duplicados roles activos que no están permitidos si (no Papel.AllowActiveDuplicates) y (HasActiveRole(en el Papel.ClassType, nil)) a continuación, begin
Resultado := False SetBoldLastFailureReason( TBoldFailureReason.Create('No se puede aplicar esta función porque' 'ya existe un rol activo de este tipo', Self) ) else Resultado := CanAcceptRole(TRoleClass(en el Papel.ClassType)) si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Crear ('Función no puede ser aplicado a este objeto', Self) ) end else //bqMayInsert //consulta para la eliminación de roles si OriginalEvent = bqMayRemove, a continuación, begin //Obtener el papel de objeto de ser eliminado Assert(Args[0].VType = vtInteger) Función := Funciones[Args[0].VInteger] Resultado := (no Papel.Activa) o (no Papel.IsRequired) si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Crear ('Función no puede ser eliminado,' es requerido por otro papel activo', Self) ) final //bqMayRemove fin fin |
Listado 2: Papel
//Permitir o no la aplicación de un determinado Actor función de la clase TRole.CanApplyTo(AObject: TActor): Boolean begin Resultado := False fin
//método Virtual para reemplazar en los descendientes, que describe el papel función de la clase TRole.GetRoleName: string begin Resultado := ' fin
//Opcional, especifica si se activa se permiten duplicados o no función de la clase TRole.AllowActiveDuplicates: Boolean begin Resultado := False fin
//Opcional, especifica si se permiten duplicados o no (activo o inactivo) función de la clase TRole.AllowDuplicates: Boolean begin Resultado := False fin
//Devuelve Verdadero si cualquier función depende de que este papel la función del TRole.IsRequired: Boolean var I: Integer begin si el Actor <> nil then begin Resultado := True for I := 0 para el Actor.Los Roles.Count - 1 do si el Actor.Funciones[I] <> luego si el Actor.Funciones[I].RequiresRole(auto), a continuación, Salir fin Resultado := False fin
//Anular esta opción para especificar si el otro papel es dependía la función del TRole.RequiresRole(ARole: TRole): Boolean begin Resultado := False fin
//Rellena los derivados RoleName atributo del método de clase procedimiento de TRole._RoleName_DeriveAndSubscribe(DerivedObject: TObject Suscriptor: TBoldSubscriber) begin heredado M_RoleName.AsString := GetRoleName fin
//para evitar la eliminación de un rol necesario la función del TRole.MayDelete: Boolean begin Resultado := no IsRequired fin
la función del TRole.ReceiveQueryFromOwned(Autor: TObject OriginalEvent: TBoldEvent const Args: array de const Suscriptor: TBoldSubscriber): Boolean begin Resultado := heredado ReceiveQueryFromOwned(Originador, OriginalEvent, Args, el Suscriptor) si no el Resultado de Salida si (Autor = M_Active) entonces //Activa el atributo begin si OriginalEvent = bqMayModify, a continuación, begin si el Actor = nil then Resultado := True else si se Activa, begin //no permitir la desactivación si otra función requiere //esta función se activa Resultado := no IsRequired si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Create('No se puede desactivar esta función, ' otras funciones requieren', Self) ) else begin //no permitir la reactivación si otro papel activo existe //y los duplicados no se permite Resultado := AllowActiveDuplicates o (no el Actor.HasActiveRole(Auto.ClassType, Auto)) si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Create('No se puede activar esta función' 'porque ya hay una similar papel activo', Self) ) fin final //bqMayModify final //Activa attributeend fin |
el código hasta El momento todo ha sido abstracto. Todo lo que queda es descender algunas clases concretas de Actor y el Papel.
Conclusión
en Lugar de tener un Empleado de clase o una clase de Cliente, que ahora se pueden asignar fácilmente una EmployeeRole o CustomerRole a cualquier tipo de Persona objeto (que es un Actor).
Además podemos mezclar los roles, un Piloto puede llevar a cabo la administración, y cualquier cosa podría ser un cliente (una Persona, un Departamento, una Empresa, o incluso de un País).
espero que este artículo ha sido informativos.
& nbsp
Funcion de programacion basado en negrita
Funcion de programacion basado en negrita : Multi-millones de consejos para hacer su vida mas facil.
Un ejemplo de la aplicacion de la Actor/Rol de patron en Negrita.
Papel de programacion basado en Negrita
Negrita permite a los programadores desarrollar aplicaciones de la programacion orientada a objetos que persisten a una base de datos. Esto nos da la posibilidad de añadir a la herencia para nuestras aplicaciones, pero esta capacidad puede ser mas utilizado.
Como ejemplo, en una aplicacion que he desarrollado en Negrita una vez tuve el siguiente modelo
La estructura anterior permite que la aplicacion registro de ordenes de compra en contra de un Cliente, de administracion de trabajo puede ser asignado a un AdminEmployee, y de informacion de vuelo puede ser que se registro contra un Piloto.
basado en funciones
El problema con el escenario anterior es cuando las funciones comienzan a mezclarse. Por ejemplo, un Empleado puede convertirse en un Cliente, o un Piloto puede hacer un poco de tiempo de trabajo de la administracion.
La solucion a este problema es utilizar el Actor/Rol de patron. Cada Actor (clase abstracta) puede recibir multiples Funciones (tambien una clase abstracta). Son estas Funciones las que tienen negocios relacionados con la informacion asociada a ellos. Por ejemplo, un PilotRole tendria el vuelo de la informacion asociada con ella, y la CustomerRole habria ordenes de compra asociadas con el.
El nuevo modelo seria algo como esto.
- Un Actor puede no tener papeles, o muchos papeles.
- Una instancia especifica de un Actor puede prohibir la extraccion de un papel.
- funcion puede negar aplicacion a un determinado Actor.
- funcion puede especificar que es obligatorio y no puede ser removido (es decir, LoginRole no puede ser eliminado porque el usuario tambien tiene un SystemAdministratorRole)
- Una instancia especifica de un Actor puede rechazar un papel.
Listado 1: Actor
//Aceptar o rechazar un papel funcion TActor.CanAcceptRole(ARoleClass: TRoleClass): Boolean begin si no ARoleClass.AllowDuplicates y HasRole(ARoleClass, nil) then Resultado := False else si no ARoleClass.AllowActiveDuplicates y HasActiveRole(ARoleClass, nil) then Resultado := False else Resultado := ARoleClass.CanApplyTo(Auto) fin
//permitir o no Permitir la eliminacion de un rol funcion TActor.CanRemoveRole(ARole: TRole): Boolean begin Resultado := no ARole.IsRequired fin
//Devuelve un papel, pero solo si esta activo funcion TActor.FindActiveRole(AClass: TClass ExcludeInstance: TRole): TRole var I: Integer begin Resultado := nil for I := 0 para las Funciones.Count - 1 do si las Funciones[I].Activo y (Roles[I].ClassType = AClass) y (Roles[I] <> ExcludeInstance), a continuacion, begin Resultado := Funciones[I] Break fin fin
//Devuelve un papel, ya sea activa o no funcion TActor.FindRole(AClass: TClass ExcludeInstance: TRole): TRole var I: Integer begin Resultado := nil for I := 0 para las Funciones.Count - 1 do si (Roles[I].ClassType = AClass) y (Roles[I] <> ExcludeInstance), a continuacion, begin Resultado := Funciones[I] Break fin fin
//Devuelve True si el Actor es dueño de una funcion especifica y es activo funcion TActor.HasActiveRole(AClass: TClass ExcludeInstance: TRole): Boolean begin Resultado := Asignada(FindActiveRole(AClass, ExcludeInstance)) fin
//Devuelve True si el actor es dueño de una funcion especifica (activo o inactivo) funcion TActor.HasRole(AClass: TClass ExcludeInstance: TRole): Boolean begin Resultado := Asignada(FindRole(AClass, ExcludeInstance)) fin
funcion TActor.ReceiveQueryFromOwned(Autor: TObject OriginalEvent: TBoldEvent const Args: array de const Suscriptor: TBoldSubscriber): Boolean var ObjectLocator: TBoldObjectLocator Funcion: TRole begin Resultado := heredado ReceiveQueryFromOwned(Originador, OriginalEvent, Args, el Suscriptor) si no Resultado o BoldObjectIsDeleted, a continuacion, Salir de //de Verificacion para la insercion de funciones si (Autor = M_Roles) a continuacion, begin si OriginalEvent = bqMayInsert, a continuacion, begin //Obtener el papel que esta insertado Assert(Args[1].VType = vtObject) ObjectLocator := (Args[1].VObject como TBoldObjectLocator) Funcion := (ObjectLocator.BoldObject como TRole) //Comprobar la duplicacion de funciones que no estan permitidos si (no Papel.AllowDuplicates) y (HasRole(en el Papel.ClassType, nil)), a continuacion, begin Resultado := False SetBoldLastFailureReason( TBoldFailureReason.Create('Esta funcion puede ser aplicada solamente una vez', Self) ) else //Comprobacion de duplicados roles activos que no estan permitidos si (no Papel.AllowActiveDuplicates) y (HasActiveRole(en el Papel.ClassType, nil)) a continuacion, begin
Resultado := False SetBoldLastFailureReason( TBoldFailureReason.Create('No se puede aplicar esta funcion porque' 'ya existe un rol activo de este tipo', Self) ) else Resultado := CanAcceptRole(TRoleClass(en el Papel.ClassType)) si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Crear ('Funcion no puede ser aplicado a este objeto', Self) ) end else //bqMayInsert //consulta para la eliminacion de roles si OriginalEvent = bqMayRemove, a continuacion, begin //Obtener el papel de objeto de ser eliminado Assert(Args[0].VType = vtInteger) Funcion := Funciones[Args[0].VInteger] Resultado := (no Papel.Activa) o (no Papel.IsRequired) si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Crear ('Funcion no puede ser eliminado,' es requerido por otro papel activo', Self) ) final //bqMayRemove fin fin |
Listado 2: Papel
//Permitir o no la aplicacion de un determinado Actor funcion de la clase TRole.CanApplyTo(AObject: TActor): Boolean begin Resultado := False fin
//metodo Virtual para reemplazar en los descendientes, que describe el papel funcion de la clase TRole.GetRoleName: string begin Resultado := ' fin
//Opcional, especifica si se activa se permiten duplicados o no funcion de la clase TRole.AllowActiveDuplicates: Boolean begin Resultado := False fin
//Opcional, especifica si se permiten duplicados o no (activo o inactivo) funcion de la clase TRole.AllowDuplicates: Boolean begin Resultado := False fin
//Devuelve Verdadero si cualquier funcion depende de que este papel la funcion del TRole.IsRequired: Boolean var I: Integer begin si el Actor <> nil then begin Resultado := True for I := 0 para el Actor.Los Roles.Count - 1 do si el Actor.Funciones[I] <> luego si el Actor.Funciones[I].RequiresRole(auto), a continuacion, Salir fin Resultado := False fin
//Anular esta opcion para especificar si el otro papel es dependia la funcion del TRole.RequiresRole(ARole: TRole): Boolean begin Resultado := False fin
//Rellena los derivados RoleName atributo del metodo de clase procedimiento de TRole._RoleName_DeriveAndSubscribe(DerivedObject: TObject Suscriptor: TBoldSubscriber) begin heredado M_RoleName.AsString := GetRoleName fin
//para evitar la eliminacion de un rol necesario la funcion del TRole.MayDelete: Boolean begin Resultado := no IsRequired fin
la funcion del TRole.ReceiveQueryFromOwned(Autor: TObject OriginalEvent: TBoldEvent const Args: array de const Suscriptor: TBoldSubscriber): Boolean begin Resultado := heredado ReceiveQueryFromOwned(Originador, OriginalEvent, Args, el Suscriptor) si no el Resultado de Salida si (Autor = M_Active) entonces //Activa el atributo begin si OriginalEvent = bqMayModify, a continuacion, begin si el Actor = nil then Resultado := True else si se Activa, begin //no permitir la desactivacion si otra funcion requiere //esta funcion se activa Resultado := no IsRequired si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Create('No se puede desactivar esta funcion, ' otras funciones requieren', Self) ) else begin //no permitir la reactivacion si otro papel activo existe //y los duplicados no se permite Resultado := AllowActiveDuplicates o (no el Actor.HasActiveRole(Auto.ClassType, Auto)) si no el Resultado de SetBoldLastFailureReason( TBoldFailureReason.Create('No se puede activar esta funcion' 'porque ya hay una similar papel activo', Self) ) fin final //bqMayModify final //Activa attributeend fin |
el codigo hasta El momento todo ha sido abstracto. Todo lo que queda es descender algunas clases concretas de Actor y el Papel.
Conclusion
en Lugar de tener un Empleado de clase o una clase de Cliente, que ahora se pueden asignar facilmente una EmployeeRole o CustomerRole a cualquier tipo de Persona objeto (que es un Actor).
Ademas podemos mezclar los roles, un Piloto puede llevar a cabo la administracion, y cualquier cosa podria ser un cliente (una Persona, un Departamento, una Empresa, o incluso de un Pais).
espero que este articulo ha sido informativos.
& nbsp
Función de programación basado en negrita
By Consejos Y Trucos
Función de programación basado en negrita : Multi-millones de consejos para hacer su vida más fácil.