Domanda

In un imperativo, oggetto orienta la lingua, avrebbe più senso di avere chiusure mutabili e immutabili?

Ad esempio:

int i=5;
function() f={print(i);};
f();
i=6;
f();

Se la chiusura è mutevole, questo sarebbe stampa:

5
6

Se è immutabile, sarebbe stampa:

5
5

Mi rendo conto che anche con chiusure immutabili, si potrebbe ancora fare questo:

class I {int i;}
I i=new I();
i.i=5;
function() f={
    I j=i;
    print(j.i);
};
f();
i.i=6;
f();

Quindi, sarebbe meglio avere chiusure mutabili o immutabili, o hanno l'opzione per entrambi? chiusure immutabili sembrano più facili da implementare, quindi a questo punto, penso che andrò con questo, a meno che non ci sia una buona ragione per non farlo.

È stato utile?

Soluzione

linguaggi imperativi sono in genere costruiti attorno al concetto di stato. Quindi ha più senso per caratteristiche del linguaggio di riflettere sul fatto che, ivi comprese le chiusure. Sì, questo comportamento può essere fonte di confusione a volte, ma è parte del problema e il vantaggio di avere indicare nell'atto di candidatura.

Credo che la migliore prova di questa tesi è quello di esaminare alcune delle lingue più recenti che hanno il supporto di chiusura. Sia C # e VB.Net, linguaggi OO imperativi, ha scelto di avere chiusure mutevoli. Mentre F #, un linguaggio funzionale, ha chiusure immutabili (derivanti principalmente dall'idea che F # è immutabile per impostazione predefinita).

Anche ciò che sarebbe in realtà significa avere una chiusura immutabile in un linguaggio imperativo? La maggior parte della gente pensa di questo come rendere le variabili equivalenti a sola lettura C # 's. i tipi di valore certo sarebbe protetti contro eventuali modifiche, ma per quanto riguarda i tipi di riferimento mutevoli. Non sarebbe in grado di modificare in cui la variabile puntata, ma si potrebbe chiamare una funzione mutante e ottenere un effetto simile. Per esempio.

class Student {
  public string Name { get; set; }
}

void Example() {
  var student = new Student() { Name = "foo" };
  Action() del = () => 
    { student.Name = "bar"; };
  del();
}

Questo potrebbe essere implementato con una chiusura immutabile, come io in realtà non modifico in cui le variabili puntano. Comunque sto chiaramente ancora facendo un'operazione di mutazione.

Altri suggerimenti

dovrebbe linguaggi hanno lambda che la cattura per valore o per riferimento cattura? Decidete voi stessi, ma vedere " Su lambda, catturare e mutevolezza " per ulteriori commenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top