Hello Prevalence 2

By FernandoVM


Continue assim, você está indo bem! Esse é o segundo de uma sequência de tutoriais, ele visa a apresentar um outro modelo de programação utilizando prevalência. Utilizando a classe ProxiedPrevalenceEngine iremos remodelar o aplicativo desenvolvido no tutorial anterior, não serão necessárias as classes destinadas a realizar as alterações no PrevalentSystem. É extramente recomendado uma prévia leitura das seções O que é e manifesto, além do Hello Prevalence.

O aplicativo desenvolvido ao longo desse tutorial pode ser encontrado na pasta samples da distribuição do XPrevail.

Veremos que essa abordagem já possibilita uma programação um pouco mais natural, nos permitindo não precisar codificar as classes que implementam IOperation . Pegando o exemplo criado no primeiro tutorial, precisaremos fazer algumas alterações, a começar pela classe base de nosso PrevalentSystem. Para trabalhar com o ProxiedPrevalenceEngine é exigido que ele descenda de MarshalByRefObject, direta ou indiretamente.

Para substituir as classes AddPoeple e RemovePeople iremos criar dois métodos na classe PeopleManager, com os mesmos nomes das classes removidas. Feito isso a classe PeopleManager tem agora a seguinte definição:

  [Serializable]
  PeopleManager = class (MarshalByRefObject)
  strict private
    FPeoples : ArrayList;
  public
    property Peoples : ArrayList read FPeoples;
    [Operation]
    procedure AddPeople(aName : String; aEMail : String; aBirthDate, aRecordDate : DateTime);
    [Operation]
    procedure RemovePeople(aName : String);
    constructor Create;
  end;

Observe que os métodos recém-criados foram marcados com o atributo OperationAttribute , isso é necessário para indicar ao XPrevail que a chamada a esse método deve ser interceptada e persistida. O XPrevail faz isso automaticamente para qualquer alteração de valor em propriedades, já para métodos da classe é exigida a inclusão desse atributo, mas apenas naqueles que realizam alterações no PrevalentSystem. 

O próximo passo é alterar o tipo de PrevalenceEngine usado, vamos trocar o SimplePrevalenceEngine pelo ProxiedPrevalenceEngine. Veja abaixo:

  Engine := ProxiedPrevalenceEngine.Create(typeOf(PeopleManager),
            Path.Combine(Environment.CurrentDirectory, 'data'));

Veremos agora que a inclusão e remoção de pessoas passa a ser feita diretamente no PrevalenteSystem, conforme mostrado a seguir:

- Adicionando uma pessoa

  PManager.AddPeople(Name, Email, BirthDate, Clock.Now);

- Removendo uma pessoa

  PManager.RemovePeople('FernandoVM');

É isso, muito simples, não? Realmente é, contudo também temos um problema. Embora essa abordagem resolva a questão da necessidade de criação de classes para cada tipo de alteração a ser feita no PrevalentSystem, imposta pela abordagem tradicional, ela inclui um outro potencial problemático, ou no mínimo deselegante. Quando um PrevalentSystem mantém referência a vários tipos de objetos de negócios ele acaba tendo de ter vários métodos para trabalhar em vários tipos de objetos diferentes. Isso traz problemas de manutenção e legibilidade ao código, além de ser algo bem questionável segundo a ótica da boa programação orientada a objetos.

Para resolver essa situação o XPrevail traz o MultiSystemsPrevalenceEngine , capaz de trabalhar com vários PrevalentSystem's ao mesmo tempo. Ele possibilita uma boa separação de responsabilidades, de modo que cada PrevalentSystem mantenha operações apenas sobre objetos logicamente relacionados. Consulte a documentação das classes do XPrevail para obter maiores detalhes.

Fechamos aqui esse tutorial, mas não pare por aqui, prossiga na leitura dos demais e esteja daqui a pouco hápto a programar bons sistemas prevalentes.