Se eu entendi, o modelo de ator é exatamente como o modelo de objeto, mas com algumas diferenças:
- CADA objeto gera sua própria thread separada e não é um problema, mesmo quando você tem milhares de objetos.
- Os atores não interagem chamando funções e obtendo valores de retorno, mas enviando e recebendo mensagens.
- Se você não violar esse modelo, seu aplicativo usará a simultaneidade em todo o seu potencial sem riscos de condições de corrida.
- Tudo o que você pode fazer no OO pode usar atores, mas melhor, o problema é que tudo o que codificamos nos últimos anos foi baseado no OO - mas uma transição é iminente.
Por exemplo, suponha que eu precise definir classe / ator de vetor 3d, criar duas instâncias e chamar uma operação de soma nelas.
ORIENTADO A OBJETO:
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 DO ATOR:
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
}
É isso? Ou estou completamente errado?