Fluent Argument Validation

Posted by Fabiano França on August 31st, 2008

Um bom exemplo de como usar uma fluent interface para fazer validação de pré e pós condições escrito por Roger Alsing.

Ele até empacotou tudo em um “framework”.

E por falar em fluent interfaces, o Guilherme Chapiewski fez dois ótimos posts a alguns meses.

static string ValidationFunc(int a,string b,DateTime c)
{
  //pre conditions:
  a.Require("a")
   .IsGreaterThan(10);

  b.Require("b")
   .NotNull()
   .NotEmpty()
   .LongerThan(2)
   .StartsWith("Ro");

  c.Require("c")
   .IsInRange(new DateTime(2000, 01, 01),
   new DateTime(2010, 01, 01));

Usando o Castle ActiveRecord

Posted by Fabiano França on March 27th, 2008

O Castle ActiveRecord é uma implementação do pattern Active Record desenvolvido em .NET em cima do NHibernate.

Ele faz parte do pacote de frameworks do projeto Castle Projet, e tem forte influencia da implementação do Active Record do framework Ruby On Rails.

Entre as muitas características dele vale destacar, a possibilidade de mapeamento de classes via atributos e não dos famigerados arquivos xml e um mecanismo de validação eficiente e flexível.

Read the rest of this entry »

Automatic Properties

Posted by Fabiano França on March 27th, 2008

No post anterior acabei usando um recurso disponível no C# 3.0 que ficou sem explicação.

O Automatic Properties.

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
}

Agora ao encontrar a declaração { get; set; }, o compilador gera automaticamente a variável privada e a implementação necessária para a propriedade.

Também é possível declarar uma propriedade como somente leitura usando o accessor private.

public class Pessoa {
  public int Id { get; private set; }
  public string Nome { get; set; }
  public string Email { get; set; }
}

E caso você precise usar atributos é necessário fazer a declaração da propriedade do modo tradicional.

Object e Collection Initializers

Posted by Fabiano França on March 27th, 2008

Mais uma novidade do C# 3.0 é a nova sintaxe para a inicialização de objetos e coleções.

Object Initializers

Agora podemos ao instanciar um objeto passar valores para as suas propriedades.

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
} 

Pessoa joao = new Pessoa() { Nome = "João", Email = "joao@gmail.com" };
Pessoa maria = new Pessoa() { Nome = "Maria", Email = "maria@gmail.com" };

No exemplo acima, são instanciados dois objetos do tipo Pessoa, chamando o construtor padrão, e em seguida setadas as propriedades Nome e Email.

Tudo em uma única linha de código.

Também é possível passar parâmetros para o construtor, conforme o exemplo a seguir:

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
  public int Idade { get; set; }
  public Pessoa(string nome)
  {
    this.Nome = nome;
  }
}
Pessoa pedro = new Pessoa("Pedro") {
  Email = "pedro@gmail.com",
  Idade = 20
};

Collection Initializers

Já nas coleções podemos passar um conjunto de objetos.

No exemplo abaixo a coleção pessoas é instanciada com os objetos joao, maria e pedro como os seus membros.

IList<Pessoa> pessoas = new List<Pessoa>() { joao, maria, pedro }

É aqui uma combinação das duas formas.

IList<Pessoa> pessoas = new List<Pessoa>() {
  joao, maria, pedro,
  new Pessoa() { Nome = "Jose", Email = "jose@gmail.com" }
}

Conclusão

Como vimos nesse segundo post, o C# 3.0 vem trazendo grandes melhorias para a implementação de um código mais legível e bonito.

Muitas dessas melhorias foram influenciadas por dois projetos da Microsoft Research, o F# e o .

Nesse post, Tomas Petricek detalha as novidades incorporadas no C# 3.0 vindas desses dois projetos.

Extension Methods

Posted by Fabiano França on March 26th, 2008

Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.

Essa funcionalidade é chamada de Extension Methods.

Criando um Extension Method

Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a definição de um método de validação (estático) em uma classe utilitária (estática).

static class Program
{
  static void Main(string[] args)
  {
    string emailCliente = System.Console.ReadLine();

    if (!Utilidades.IsEmailValido(emailCliente))
      System.Console.WriteLine("E-mail informado inválido.");
  }
}

Usando um Extension Method a solução é parecida, mas a utilização é mais elegante.

if (!emailCliente.IsEmailValido())
  System.Console.WriteLine("E-mail informado inválido.");

A criação do Extension Method se resume a definição de uma classe estática com um método estático.

namespace Utilidades
  public static class Extensoes
  {
    public static bool IsEmailValido(this string email)
    {
      return Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
    }
  }
}

Notem o keyword this antes da declaração do primeiro parâmetro. Ele é responsável por passar ao compilador que o método IsEmailValido é aplicável a todos os objetos do tipo string.

E para utilizar o extension method basta importar o namespace que contém a classe estática usando o statement using. Sendo que não é necessária a importação caso as classes estejam dentro do mesmo namespace.

using Utilidades;

Passando parâmetros para o Extension Method

namespace Utilidades
  public static class Extensoes
  {
    public static bool IsMaiorQue(this string s, int tamanho)
    {
      return s.Length > tamanho;
    }
  }
}

string nome = "Joao da Silva";

if (nome.IsMaiorQue(10))
  System.Console.WriteLn("Nome só pode ter 10 caracteres");

Com essa introdução dá para ter uma pequena idéia das possibilidades. Vale lembrar que também é possível criar extension methods para interfaces e generics.

Abaixo três boas referências que valem à pena dar uma lida.


Copyright © 2007 Algumas Idéias. All rights reserved.