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.