Supponiamo che io sono un attore Erlang definita in questo modo:In che modo gli attori di Erlang differiscono dagli oggetti OOP?
counter(Num) ->
receive
{From, increment} ->
From ! {self(), new_value, Num + 1}
counter(Num + 1);
end.
E allo stesso modo, ho una classe di Ruby definita in questo modo:
class Counter
def initialize(num)
@num = num
end
def increment
@num += 1
end
end
Il codice Erlang è scritto in uno stile funzionale, con la coda ricorsione per mantenere lo stato. Tuttavia, qual è l'impatto significativo di questa differenza? Per i miei occhi ingenui, le interfacce con queste due cose sembrano le stesse: invia un messaggio, lo stato viene aggiornato e ottieni una rappresentazione del nuovo stato.
La programmazione funzionale viene spesso descritta come un paradigma completamente diverso rispetto a OOP. Ma l'attore di Erlang sembra fare esattamente ciò che gli oggetti dovrebbero fare: mantenere lo stato, incapsulare e fornire un'interfaccia basata sui messaggi.
In altre parole, quando sto trasmettendo messaggi tra gli attori di Erlang, come è diverso da quando sto passando messaggi tra oggetti Ruby?
Sospetto che ci siano maggiori conseguenze sulla dicotomia funzionale/OOP di quanto non vedo. Qualcuno può indicarli?
Mettiamo da parte il fatto che l'agente di Erlang sarà programmato dalla VM e quindi può essere eseguito contemporaneamente ad altro codice. Mi rendo conto che questa è una grande differenza tra le versioni di Erlang e Ruby, ma non è quello che sto ottenendo. La concorrenza è possibile in altre lingue, incluso Ruby. E mentre la concorrenza di Erlang può comportarsi in modo molto diverso (a volte meglio), non sto davvero chiedendo le differenze di rendimento.
Piuttosto, sono più interessato al lato funzionale-vs-OOP della domanda.
IMO l'esempio è troppo piccolo/isolato per mostrare differenze significative. Ovviamente in questo caso le differenze * concettuali * sono minori. Altri fattori di considerazione sono più importanti in questo esempio banale. –