Si entendí, el modelo de actor es como el modelo de objeto, pero con algunas diferencias:
- CADA objeto genera su propio hilo y no es un problema, incluso cuando tienes miles de objetos.
- Los actores no interactúan llamando a funciones y obteniendo valores de retorno, sino enviando y recibiendo mensajes.
- Si no violas ese modelo, tu aplicación utilizará la concurrencia en toda su potencia sin ningún riesgo de condiciones de carrera.
- Todo lo que puede hacer en OO puede hacer usando actores, pero mejor, el problema es que todo lo que codificamos en los últimos años se basó en OO, pero una transición es inminente.
Por ejemplo, supongamos que tengo que definir una clase / actor de vectores 3d, crear dos instancias y llamar a una operación de suma en ellos.
OBJETO ORIENTADO:
class V3d {
constructor V3d(x,y,z) //bla
float x,y,z;
function sum(V3d b)
{
return V3d(x+b.x,y+b.y,z+b.z);
}
}
//using:
mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly
drawPoint(mySum) //uses the result
MODELO DE ACTOR:
actor V3d
{
constructor V3d(x,y,z) //bla
float x,y,z;
loop
{
receive 'sum',b:V3d :
send(caller,'sumResult',V3d(x+b.x,y+b.y,z+b.z))
}
}
//using:
send(V3d(1,2,3),'sum',V3d(3,2,1)) //creates 2 instances, send to the first one a request to sum with the second one
loop
{
receive 'sumResult',result:
drawPoint(result) //receives result and draws it
}
¿Es eso? ¿O estoy completamente equivocado?