Início > Qualidade de Código > Layer Supertype Pattern

Layer Supertype Pattern

superman logoUm bom código deve evitar ao máximo a replicação de suas partes, favorecendo a manutenção. Nesse post, vamos apresentar um artifício para combater esse problema.

O padrão Layer Supertype tem como objetivo definir uma classe que agrupa operações que são semelhantes em todas as classes de uma camada. Vamos ao exemplo:

public class Teacher
{
    private string name;
    private int Age;

    public int Id { get; set; }

    public void Insert()
    {
       this.IsValid();
       //código de persistência comum a todas as classes
    }

    public void Update()
    {
        this.IsValid();
        //código de persistência comum a todas as classes
    }

    private bool IsValid()
    {
       //código de validação específico para a entidade Teacher
    }
}

public class Lesson
{
    private int level;

    public int Id { get; set; }

    public void Insert()
    {
       this.IsValid();
       //código de persistência comum a todas as classes
    }

    public void Update()
    {
       this.IsValid();
       //código de persistência comum a todas as classes
    }

    private bool IsValid()
    {
      //código de validação específico para a entidade Lesson
    }
}

Note que as classes possuem os mesmos métodos Insert, Update e IsValid, além da propriedade Id. Utilizando o padrão Layer Supertype, criaremos uma classe base que vai agrupar essas operações e será herdada pelas demais classes da camada.

O código fica assim:

public class BaseEntity
{
    public int Id { get; set; }

    public void Insert()
    {
       this.IsValid();
       //código de persistência comum a todas as classes
    }

    public void Update()
    {
       this.IsValid();
       //código de persistência comum a todas as classes
    }

    protected abstract bool IsValid();
}

public class Teacher : BaseEntity
{
   private string name;
   private int Age;

   protected override bool IsValid()
   {
      //...
   }
}

public class Lesson : BaseEntity
{
    private int level;

    protected override bool IsValid()
    {
      //...
    }
}

Com isso, evitamos duplicação de códgio, centralizando a lógica de negócio que estaria repetida por diversas classes em uma única classe. O código ficou mais limpo e mais fácil de manter.

Anúncios
  1. 10/05/2011 às 7:15 PM

    Esse não seria o Template Method ?

    • 10/06/2011 às 1:35 AM

      Marcelo, no exemplo temos o padrão Layer Supertype, com relação ao compartilhamento dos métodos Insert e Update e IsValid. O código desses métodos é o mesmo para todas as classes que herdam de BaseEntity.
      No ponto de vista da implementação desses métodos temos o padrão Template Method sim, devido ao fato do método IsValid poder ser sobrescrito pelas subclasses.
      Muito bem observado.

  1. No trackbacks yet.

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: