Se ho capito, il modello dell'attore è proprio come il modello a oggetti, ma con alcune differenze:
- OGNI oggetto genera il proprio thread separato e non è un problema anche quando hai migliaia di oggetti.
- Gli attori non interagiscono chiamando le funzioni e ottenendo valori di ritorno ma invece inviando e ricevendo messaggi.
- Se non violi quel modello, la tua app utilizzerà la concorrenza al massimo della sua potenza senza rischi di condizioni di gara.
- Tutto ciò che puoi fare in OO puoi fare usando gli attori, ma meglio, il problema è che tutto ciò che abbiamo codificato negli ultimi anni era basato su OO - ma una transizione è imminente.
Quindi, per esempio, supponiamo che io debba definire la classe / attore vettoriale 3d, creare due istanze e chiamare un'operazione somma su di essi.
ORIENTATO AGLI OGGETTI:
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
MODELLO ATTORE:
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
}
È così? O mi sbaglio completamente?