Arquitetura em prática

por Fabio Margarito Martins de Barros

Dynamic Dispatcher e Dynamic Binding

Com certeza se desconhece estes termos, já os usou sem saber. Vamos ver em C# como isto rola.

Dynamic Dispatch: A Wikipedia define como "...processo de mapear uma mensagem para uma sequência de código em tempo de execução", simplificando, é o recurso que a plataforma de desenvolvimento oferece, onde você consegue executar um método sem saber detalhes do tipo em tempo de compilação. Se houver algum erro, como nome de método incorreto, falta de parâmetros ou tipo incorreto de parâmetro, só será possível saber em tempo de execução. Linguagem dinâmicas que não são tipadas(ex. JavaScript), utilizam o recurso de dynamic dispatch o tempo todo. Quando precisamos executar algum componente COM em .Net, também utilizamos dynamic dispatch. Para exemplificar, utilizando C# 3.5 vou executar o método Soma dinamicamente.

using System;
using System.Reflection;
namespace DynamicDispatchDynamicBinding
{
class Calculo
{
public int Soma(int a, int b){
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
var tipo = typeof(Calculo);
var objeto = new Calculo();
var retorno = tipo.InvokeMember("Soma",BindingFlags.InvokeMethod,null,objeto ,new object[] { 10, 20 });
Console.Write(retorno);
}
}
}
Com a nova DLR(Dynamic Language Runtime) incluída no .Net 4.0, ficou bem mais fácil
using System;
namespace DynamicDispatcherDynamicBinding40
{
class Calculo
{
public int Soma(int a, int b)
{
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
var tipo = typeof(Calculo);
dynamic objeto = new Calculo();
var retorno = objeto.Soma(10, 20);
Console.Write(retorno);
}
}
}

Dynamic Binding: É a forma de determinar a partir do objeto recebido, qual a implementação do método deverá ser executada em tempo de execução. Com exemplo fica mais fácil

using System;
using System.Reflection;
namespace DynamicDispatchDynamicBinding
{
class Calculo
{
public virtual int Soma(int a, int b)
{
return a + b;
}
}
/*Cálculo incorreto propositalmente*/
class CalculoFilho1:Calculo
{
public override int Soma(int a, int b)
{
return a + a + b;
}
}
class Program
{
static void Main(string[] args)
{
/*Dynamic Binding*/
Calculo calculo = new CalculoFilho1(); 
Console.Write(calculo.Soma(10, 20));
}
}
}
Nossa variável é do tipo Calculo, entretanto, o método executado foi da subclasse que é o tipo instanciado. Entenderam?

Referências: Dynamic Dispatch, Dynamic Binding, DLR
[]'s
Fabio Margarito
Posted: fev 07 2010, 21:39 by fabiomargarito | Comentários (2) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5