O padrão Generation Gap surgiu da dificuldade de se manter código gerado automaticamente e código escrito manualmente em um mesmo arquivo.
Em primeiro lugar, precisamos contextualizar quando as duas abordagens tornam-se conflitantes.
A partir do momento que temos uma classe gerada automaticamente por alguma ferramenta (por exemplo: Entity Framework Database First) e precisamos adicionar a ela algum comportamento escrito manualmente (algum método, ou propriedade que não será persistida no banco de dados), corremos o risco de perder tais modificações manuais após qualquer atualização da classe gerada automaticamente. Isto é, qualquer modificação gerada a partir de uma atualização do modelo acarretará na perda de qualquer código escrito manualmente.
A partir desta dificuldade, o padrão Generation Gap preza que a classe gerada automaticamente e as modificações escritas manualmente devem permanecer em arquivos distintos. Desta maneira, quando a classe gerada automaticamente sofrer qualquer modificação, por conta de alguma atualização do modelo, as alterações feitas manualmente não serão perdidas.
Com o .NET Framework este padrão pode ser implementado de duas maneiras, sendo: a primeira, por meio de herança; e segundo, por meio do uso de partial classes.
Generation Gap com Herança
A implementação do padrão Generation Gap com herança consiste da criação de uma classe que herde de uma classe criada automaticamente, e que manterá os comportamentos implementados manualmente. Como exemplo, temos as classes Registry e RegistryConcrete. A classe Registry foi criada automaticamente pelo Entity Framework Database First, e a classe RegistryConcrete criada manualmente, mantendo herança com a classe Registry. A imagem e o código apresentados a seguir descrevem essa implementação.
public class RegistryConcrete : Registry { public bool IsValid() { if (this.Id == Guid.Empty) return false; if (this.Thread == 0) return false; return true; } }
Generation Gap com Partial Class
O .NET Framework suporta o uso de partial classes, que consistem na implementação de uma classe em diferentes arquivos, dado o uso da palavra reservada partial na declaração da classe.
Desta forma, conseguimos implementar o padrão Generation Gap criando um outro arquivo que contém uma classe com o mesmo nome da classe gerada automaticamente, e que também contém a palavra reservada partial em sua declaração.
O exemplo apresentado a seguir exemplifica o uso do padrão Generation Gap com partial classes.
public partial class Registry { public bool IsValid() { if (this.Id == Guid.Empty) return false; if (this.Thread == 0) return false; return true; } }
Observação: Quando criamos uma classe pelo Entity Framework Database First existe um comentário no topo dos arquivos. Este comentário já endereça a preocupação na sobrescrita de código escrito manualmente.
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated from a template. // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------
FH
Referência:
Fowler, M.; Domain-Specific Language; The Addison Wesley – Signature Series; 2011.
Ótima dica mestre.
Abs