Melhorando o código com Extension Methods

Publicado em 26/12/2011

19


Olá pessoal. Tudo certo?!

No último post, mostrei como melhorar o “significado” do código através da criação de tipos para ValueTypes.

Nesse post, tento demonstrar como melhorar o código através de Extension Methods.

O que são Extension Methods

Segundo o MSDN:

Extension Methods permitem a você “adicionar” métodos para tipos existentes sem criar um novo derivado de tipo, recompilar ou modifique o tipo original de alguma forma. São um tipo especial de método estático, mas eles são chamados como se fossem os métodos de instância no tipo estendido. Para o código de cliente escrito em C# e Visual Basic, não existe aparente diferença entre chamar um método de extensão e os métodos que realmente são definidos em um tipo.

Estamos entendidos?

Criando um Extension Method

Como explicado na definição, um Extension Method é um tipo especial de método estático. Além disso, ele precisa estar definido em uma classe estática. Observe:

public static class StringExtensions
{
	public static MemoryStream ToStream(this string value)
	{
		return new MemoryStream(Encoding.UTF8.GetBytes(value));
	}
}

Agora, podemos escrever códigos assim:

var st = "Hello World!";
var s1 = st.ToStream();
var s2 = "Essa string será convertida em Stream".ToStream();

… e o compilador aceita!

Repare também na presença do modificador this antes do primeiro argumento. Esse modificador explicita o tipo que estamos “ampliando”.

Usos criativos

Nunca gostei da sintaxe do TimeSpan. Por isso, adorei a possibilidade de melhorar a legibilidade dos códigos que usam TimeSpan com Extension Methods. Observe:

public static class TimeSpanExtensions
{
	public static TimeSpan Hours(this int value)
	{
		return new TimeSpan(value, 0, 0);
	}
	
	public static TimeSpan Minutes(this int value)
	{
		return new TimeSpan(0, value, 0);
	}
	
	public static TimeSpan Seconds(this int value)
	{
		return new TimeSpan(0, 0, value);
	}
}

Bacana, não?! Agora, meus códigos que necessitam Timespan ficam assim:

class MainClass
{
	public static void Main (string[] args)
	{
		var t = 2.Hours() + 14.Minutes() + 27.Seconds();
		Console.WriteLine (t);
	}
}

Bacana, não?!

Use, com moderação

Como vimos, Extension Methods representam uma excelente oportunidade de melhorar o código. Entretanto, eles podem fazer com que deixemos de realizar todo potencial da OO expandindo tipos existentes no lugar de definir tipos novos. Eu mesmo, cometo esse “engano” com mais frequência que gostaria.

Era isso.

Publicado em: Post