Función de programación basado en negrita

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

UMLInheritance.jpg

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.

UMLActor.jpg

  1. Un Actor puede no tener papeles, o muchos papeles.
  2. Una instancia específica de un Actor puede prohibir la extracción de un papel.
  3. función puede negar aplicación a un determinado Actor.
  4. 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)
  5. 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.

UMLRoles.jpg

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

UMLInheritance.jpg

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.

UMLActor.jpg

  1. Un Actor puede no tener papeles, o muchos papeles.
  2. Una instancia especifica de un Actor puede prohibir la extraccion de un papel.
  3. funcion puede negar aplicacion a un determinado Actor.
  4. 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)
  5. 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.

UMLRoles.jpg

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

Función de programación basado en negrita : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación