Software Development Kit
to the Delphi-Win32 and Free Pascal compilers
Home > Wiki > br/Classes de negócio

br/Classes de negócio

english (en) | português (br)

Classes de negócio devem ser descendentes da classe TPressObject. Seus atributos são registrados através de seu metadata, veja Metadata para mais informações sobre metadata de classes. Se precisar de referencia para um atributo, em outros pontos do código, poderá criar ponteiros de atributos. Mesmo não sendo necessários, visto que se pode usar o método AttributeByName, os ponteiros proporcionam uma forma mais rápida e menos propensa a erros, de acesso aos atributos.

Contents

Criando ponteiros de atributos

Há duas maneiras de criar um ponteiro de atributo dentro da classe de negócio. A primeira é criar o atributo na seção inicial, sem nome, da classe, adicionando um underscore "_" antes do nome. Como o TPressObject é descendente de TPersistent, ele tem RTTI habilitado, então a seção inicial da classe é do tipo published.

TClient = class(TPressObject)
  _Name: TPressString;
protected
  class function InternalMetadataStr: string; override;
end;

Um atributo chamado "Name", do tipo String, será acessado pelo membro _Name, nas instâncias da classe TClient.

A segunda maneira é:

TClient = class(TPressObject)
private
  FName: TPressString;
protected
  function InternalAttributeAddress(const AAttributeName: string): 
   PPressAttribute; override;
  class function InternalMetadataStr: string; override;
end;

...

function TClient.InternalAttributeAddress(const AAttributeName: string): 
  PPressAttribute;
begin
  if SameText(AAttributeName, 'Name') then
    Result := Addr(FName)
  else
    Result := inherited InternalAttributeAddress(AAttributeName);
end;

Esta maneira gera mais código, porém não quebrará o encapsulamento.

Usando propriedades que acessam membros

Assessores de atributos são propriedades das classes de negócio, com tipos nativos do compilador. Provem uma forma mais fácil de acessar os valores dos atributos. O framework subject, do PressObjects, procurará por propriedades do tipo published com o mesmo nome dos atributos.

TClient = class(TPressObject)
  _Name: TPressString;
private
  function GetName: string;
  procedure SetName(const AValue: string);
protected
  class function InternalMetadataStr: string;
published
  property Name: string read GetName write SetName;
end;

Neste exemplo, sempre que o atributo Name é buscado pelos internos do framework, o método GetName é chamado. O mesmo acontece com o método SetName, sempre que o valor do atributo é alterado. Se o getter, setter ou a propriedade como um todo, não forem declados, ou (no caso da propriedade) não estiver na seção published, o framework trabalhará diretamente no atributo.

A lista a seguir relaciona os tipos de propriedades nativos, pra cada tipo de atributo do PressObjects:

TPressString     = string
TPressInteger    = Integer
TPressFloat      = Double
TPressCurrency   = Currency
TPressEnum       = Enumeração declarada e registrada pelo usuário
TPressBoolean    = Boolean
TPressDate       = TDate
TPressTime       = TTime
TPressDateTime   = TDateTime
TPressMemo       = string
TPressPicture    = (não implementado)
TPressBinary     = sem recomendação, geralmente usado para streaming
TPressPart and
TPressReference  = a classe de negócio que o atributo referencia
TPressParts and
TPressReferences = o próprio atributo, ou o atributo registrado pelo usuário

Nota: não faz diferença usar atributos Parts e Reference na seção published.

Atributos definidos pelo usuário

Pra criar um atributo personalizado:

  • declare uma classe descendente de TPressAttribute
  • sobreponha (override) a função ValidObjectClass, para os atributos Part(s) e Reference(s), se o novo atributo for de uma classe diferente, isto é obrigatório. Veja Criando atributos para mais detalhes
  • registre seu atributo, usando o método RegisterAttribute na seção initialization da unit:
initialization
  TZipCodeString.RegisterAttribute;

Classes query (consulta)

Query é uma classe de negócio, cujas instâncias são usadas para recuperar objetos, sem conhecer seus IDs. Estas clases (queries) são descendentes de TPressQuery.

Os atributos de uma query são usados para filtrar dados.

TClientQuery = class(TPressQuery)
  _Name: TPressString;
private
  function GetName: string;
  procedure SetName(const AValue: string);
protected
  class function InternalMetadataStr: string; override;
published
  property Name: string read GetName write SetName;
end;

Quando executada, esta query vai encontrar objetos da classe "client" baseada no atributo Name. Veja Metadata para mais detalhes sobre os tipos de consulta.

Registrando classes de negócio

Para registrar classes de negócio, chame o seguinte método na seção initialization da unit onde a classe estiver declarada:

initialization
  TClient.RegisterClass;

Registrando enumerações

PressObjects suporta atributos enumerados. Para criar uma enumeração e registrá-la, use:

PressModel.RegisterEnumMetadata(TypeInfo(<EnumName>), '<EnumNameString>', 
 ['<FirstItemStr>', '<SecondItemStr>', ...]);

<EnumName> = nome da enumeração para o compilador (como foi declarado)

<EnumNameString> = nome da enumeração para o framework. Para evitar confusão, é altamente recomendado usar o mesmo nome para o compilador e para o framework.

<FirstItemStr>, <SecondItemStr> = Items de um array aberto, que carrega uma string para cada item da enumeração. Opcional, caso não seja fornecido, uma versão formatada do próprio item é usada.