wtorek, 15 marca 2011

Rozszerzanie stringów

Spójrzmy na tego kulfona:

if( cloneableMetadataConcatenatorStr == “option1”
|| cloneableMetadataConcatenatorStr == “option2”
|| cloneableMetadataConcatenatorStr == “option3”
|| cloneableMetadataConcatenatorStr == “option4”)
{

}

I porównajmy do tego:

if( cloneableMetadataConcatenatorStr.In(“option1”, “option2”, 
“option3”, “option4”)
{

}

Oba fragmenty robią to samo, ale który z nich daje ci więcej natchnienia?

Metoda In() w string niestety nie istnieje, ale możemy ją łatwo dokleić. Wystarczy, że napiszemy klasę zawierającą metodę rozszerzającą string’a:

namespace Helpers
{
public class ExttentionMethods
{
public static In(this string obj, params string[] options)
{
return options.Contains(obj);
}
}
}

Sposobów na wykorzystanie tej funkcjonalności jest bardzo wiele.
Co prawda, nie będziemy chcieli rozszerzać klasy za każdym razem, gdy znajdziemy ku temu okazję, ale w często występujących przypadkach pomoże nam to zaoszczędzić czasu, ilości pisanego kodu oraz doda do kodu przejrzystości i świeżości.
Z pewnością nie ominie nas w aplikacji logowanie błędów, czy walidowanie parametrów metod:

catch (Exception e)
{
ErrorLogger.Log(e);
}

możemy zastąpić:

catch (Exception e)
{
e.Log();
}

oraz:

void SomeMethod(object mustBeNotNull)
{
if (mustBeNotNull == null)
{
throw new ArgumetNullException(mustBeNotNull);
}
}

zastępujemy:

void SomeMethod(object mustBeNotNull)
{
mustBeNotNull.ThrowIfNull(“mustBeNotNull”);
}

poprzez napisanie wcześniej paru linijek:

public static ThrowIfNull(this object obj, string objName)
{
if( obj == null )
{
throw new ArgumetNullException(objName);
}
}

Użycie metody rozszerzającej tak naprawdę jest tłumaczone przez kompilator na wywołanie metody statycznej, której pierwszym parametrem jest obiekt, na którym wywoływana jest metoda. Z tego powodu, jeśli obiekt będzie null’em to nie zostanie rzucony wyjątek tak jak przy wywołaniu metody instancji.

Kolejne przykłady użycia:

bool isHour = 17.Between(0, 24);
int number = “158”.ToInt();
DataTable dt = “SELECT * FROM WORKERS”.Execute();

Brak komentarzy:

Prześlij komentarz