Pregunta

Me gusta el concepto de inmutabilidad, pero a veces me pregunto, si una aplicación no está destinada a ser en paralelo, se debe evitar hacer cosas inmutables?

Cuando una aplicación no es multi-threaded, usted no está plagado compartidas a los problemas del estado, derecho?

O es la inmutabilidad de un concepto como el de la programación orientada a objetos que utiliza todo el camino o no?Excluyendo los casos cuando algo no debería ser inmutable basado en el uso/rendimiento, etc.

Estoy frente a esta pregunta al escribir una aplicación para mí, que es moderadamente grande (tal vez como 1-2k líneas).

¿Fue útil?

Solución

Me encanta la inmutabilidad porque significa que no tiene que confiar en los demás pueblos de código de no meterse con los objetos que me esperan mantener el mismo.

Cuando se pasa un objeto a otro componente, como un List<T>, están a merced de lo que en el componente.Esto es especialmente importante cuando regrese colecciones como propiedades.

public class Foo { 
  private List<Bar> _barList;
  public ICollection<Bar> BarList { get return _barList; } 
}

No hay nada que impida que un consumidor de esta clase de compensación de la colección de debajo de mí.Incluso cambiar el tipo de retorno a IEnumerable<Bar> no es totalmente seguro.No hay nada que impida que algún pedazo de mal escrito el código de fundición de nuevo List<T> y las llamadas .Clear().

Sin embargo, si realmente quiero que la colección de mantenerse constante pude volver a escribir como followis

public class Foo {
  private ImmutableCollection<Bar> _barList;
  public ImmutableCollection<Bar> BarList { get { return _barList; } }
}

Ahora estoy a salvo de tener que confiar en otros código de uso de mi clase incorrectamente.Ellos no pueden lío para arriba.

Otros consejos

Me gusta la ventaja de la inmutabilidad que necesita validarlo solo una vez, en la creación del objeto. Esa es una gran ventaja en realidad.

Un beneficio importante de la inmutabilidad es que uno no necesita rastrear la propiedad de objetos inmutables. Simplemente existen mientras alguien los necesite, y luego desaparecen en la nada cuando ya no son necesarios. Si bien el uso de un recolector de basura en muchos casos significa que no es necesario escribir ningún código expresamente relacionado con la propiedad de objetos mutables (la mayor excepción son aquellos que implementan IDisposable), en muchos casos es muy difícil escribir el código correcto en qué objetos que tienen estado mutable no tienen un " propietario " ;. La confusión sobre quién posee el estado de los objetos mutables puede ser una fuente muy frecuente de errores; cuando se usan objetos inmutables (aparte de algunos que implementan List<T>) generalmente se pueden ignorar los problemas de propiedad.

Otro punto a considerar es que es mucho más fácil razonar sobre una referencia mutable a un objeto semánticamente inmutable, o una referencia inmutable a un objeto mutable, que razonar sobre una referencia mutable a un objeto mutable. Si uno tiene una referencia mutable a un objeto mutable, a menudo puede no estar claro si el enfoque correcto para actualizar el estado es simplemente mutar el objeto directamente, o copiar su estado a un nuevo objeto, mutar eso y actualizar la referencia. En algunos casos, habrá circunstancias que requerirán cada tipo de operación (como con <=>, que a veces reemplaza una matriz con una más grande, pero generalmente actualiza en el lugar), pero este enfoque solo funciona si el tipo se mantiene exclusivo control sobre los objetos mutables en cuestión. A menudo es más útil tener una referencia inmutable a un tipo mutable (en cuyo caso el código puede exponer la referencia, posiblemente a través de un contenedor de solo lectura, a otros objetos que desean una & Quot; live view & Quot; de su estado) o de lo contrario tener una referencia mutable a un objeto que sea inmutable o, como mínimo, nunca se mutará durante la vida útil de la referencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top