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.