segunda-feira, novembro 06, 2006

Indexar delegates

Não sei se existe algum design pattern que descreva esta técnica, mas eu defendo que o importante é saber utilizar as técnicas adequadas para cada problema, invés de saber os nomes dos padrões.

O problema é o seguinte:
  • tenho uma função que me retorna um valor;
  • condicionado a esse valor quero chamar funções diferentes;
A primeira abordagem que nos pode vir a cabeça é: "então vamos lá por uns if's que testam o valor do retorno da primeira função". Apesar de no exemplo seguinte a primeira função ( FuncaoComplexa() ) só retornar 2 valores diferentes, e isto seria simplesmente resolvido com um if, imagine-se que a função podia retornar 100 números diferentes.


private Dictionary connectorMapper;
private delegate string DelegateFunction();

public Ctor()
{
connectorMapper = new Dictionary();
connectorMapper.Add(-1, new DelegateFunction(NegativeValue));
connectorMapper.Add(1, new DelegateFunction(PositiveValue));
}

private string NegativeValue()
{
return "Valor negativo";
}

private string
PositiveValue()
{
return "Valor positivo";
}

private void CalcFunction()
{
//uma função qualquer que retorne 1 ou -1
int indexer = FuncaoComplexa()

DelegateFunction func = connectorMapper[indexer];
Console.WriteLine( "Entrou na função com: " + func() );
}

Com esta técnica é criado um dicionário que como chave tem os possíveis valores retornados pela primeira função, e como valor tem as funções que se querem chamar consoante o valor retornado pela primeira função. Depois indexa-se ao dicionário com o retorno da primeira função e chama-se a função que o dicionário retorna.

Sem comentários: