quinta-feira, outubro 18, 2007

Qualidade de vida

Aí está uma coisa que eu acho que a maioria das pessoas actualmente abdica, cada vez mais não se aproveitam as coisas simples mas boas da vida, cada vez mais as pessoas vivem para trabalhar em vez de trabalharem para viver.

Ontem à noite estava a fazer um zapping habitual pelos canais quando apanhei o início de um filme no canal Hollywood, claro que são filmes antigos mas porque não ver pelo menos que filme era? O filme era "Despertares" (Awakenings), já há uns anos atrás o tinha visto, mas como já não me lembrava bem decidi ficar a assistir. Este filme transmite exactamente a mensagem que a vida é efémera, cada momento que dispomos deve ser aproveitado como se fosse o último, cada momento deve ser aproveitado para realizarmos coisas que nos dão prazer e nos fazem felizes.

segunda-feira, outubro 15, 2007

Nobel da paz

Não quero que este post se confunda com um post político, porque efectivamente não o é apesar de poder parecer. Al Gore prémio Nobel da paz... para mim é insultuoso, ele é simplesmente mais um frustrado que ainda não conseguiu ser presidente dos EUA e faz tudo para parecer o "menino bonito" à opinião pública. Será que ele se preocupa tanto com o ambiente como diz? Quanto a mim não, é pura estratégia de marketing. Será que a nível mundial ninguém contribuiu mais para a paz do que ele? Não me parece...

quinta-feira, outubro 11, 2007

Chamada a métodos

Com o aproximar do fim do desenvolvimento do projecto Novo Site Optimus tenho tido muito pouco tempo para fazer posts. Contudo ontem deparei com uma situação que me deixou a pensar, e que acho que à primeira vista é difícil responder correctamente, imagine-se o seguinte código:
static void Main(string[] args)
{
  SetError("A");
  SetError("X", "Y");
  SetError("M", "N", "O");
  SetError("G", null);
  SetError("R", null, "S");
  Console.ReadLine();
}

static void SetError(string message, params object[] data)
{
  Console.WriteLine("Message=" + message);
}

static void SetError(string code, string message, params object[] data)
{
  Console.WriteLine("Code=" + code + "; Message=" + message);
}
Qual dos métodos será chamado em cada invocação?

Só a primeira chamada invoca o primeiro método, a segunda, terceira e quinta invocam o 2 método e a quarta dá erro de compilação porque a chamada é ambígua. Isto leva-me a dizer que a assinatura do primeiro método foi mal pensada, não devendo ter o segundo parâmetro, visto que uma chamada com dois ou mais parâmetros, vai invocar o segundo método ou no caso da quarta chamada ainda é pior provocando um erro de compilação.

terça-feira, outubro 02, 2007

Método genérico

O meu problema passava por ter de criar métodos com implementações iguais, só diferindo no tipo dos parâmetros recebidos, pois os objectos que eu queria passar como parâmetro eram em tudo distintos à excepção das propriedades acedidas nesses métodos. Exemplo:

Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, Group[] data)
{
foreach (Group info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}

private string GetName(int Id, Tone[] data)
{
foreach (Tone info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}
Solução 1: Criar uma interface que será implementada pelos dois objectos, e a interface terá os campos e/ou métodos que se desejem ter em comum:

Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, ShareInterface[] data)
{
foreach (ShareInterface info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}

Solução 2: Esta solução foi a que utilizei para o meu caso pois a Solução 1 tem um problema, no caso dos objectos serem obtidos através de uma black box é impossível criar uma interface para ambos os objectos implementarem. A solução é a seguinte:


Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, object[] data)
{
foreach (object info in data)
{
System.Reflection.PropertyInfo prop = info.GetType().GetProperty("Id");
int tester = (int)prop.GetValue(info, null);
if (tester == Id)
return info.GetType().GetProperty("Name").ToString();
}
return null;
}