Pergunta

Em um imperativo, a linguagem objeto orienta, faria mais sentido ter fechamentos mutáveis ??ou imutáveis?

Por exemplo:

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

Se o fechamento é mutável, este iria imprimir:

5
6

Se é imutável, seria imprimir:

5
5

Eu percebo que mesmo com fechos imutáveis, você ainda poderia fazer isso:

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

Assim, seria melhor ter fechamentos mutáveis ??ou imutáveis, ou ter a opção para ambos? fechamentos imutáveis ??parecer mais fácil de implementar, por isso neste momento, eu acho que vou com isso, a menos que haja uma boa razão para não.

Foi útil?

Solução

linguagens imperativas são normalmente construídos em torno do conceito de Estado. Por isso, faz mais sentido para recursos de linguagem para refletir que, incluindo os fechos. Sim, esse comportamento pode ser confuso às vezes, mas isso é parte do problema e vantagem de ter estado na sua aplicação.

Eu acho que a melhor prova desse argumento é olhar para algumas das línguas mais recentes que têm o apoio de encerramento. C # e VB.Net, linguagens OO imperativas, escolheu ter fechamentos mutáveis. Enquanto F #, uma linguagem funcional, tem encerramentos imutáveis ??(principalmente decorrente da ideia de que o F # é imutável por padrão).

Também o que isso realmente significa ter um fechamento imutável em uma linguagem imperativa? A maioria das pessoas pensar nisso como fazer as variáveis ??equivalente a C # é somente leitura. tipos de valor certeza seria protegido contra modificação, mas que sobre os tipos de referência mutáveis. Você não seria capaz de mudança onde a variável apontada, mas você poderia chamar uma função em mutação e obter um efeito semelhante. Por exemplo.

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

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

Esta poderia ser implementado com um fechamento imutável como eu realmente não modificar onde as variáveis ??apontam para. No entanto, estou claramente ainda está fazendo uma operação de mutação.

Outras dicas

Deveria línguas têm lambdas que capturam por valor ou captura por referência? Decidir por si mesmo, mas ver " Em lambdas, capturar e mutabilidade " para mais comentários.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top