Anúncios

Padrão Generation Gap

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.

GenerationGapHeranca

    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.

Anúncios

One Response to Padrão Generation Gap

  1. Ótima dica mestre.
    Abs

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: