Red de conocimiento informático - Aprendizaje de programación - iOS ¿Por qué no utilizar NSMutableArray en lugar de NSArray?

iOS ¿Por qué no utilizar NSMutableArray en lugar de NSArray?

Las estructuras subyacentes de NSArray y NSMutableArray deberían ser similares. La diferencia se puede ver en el nombre: NSArray es inmutable y NSMutableArray es mutable. NSArray es más sencillo de implementar porque es inmutable.

Este diseño de iOS es apropiado y distingue claramente entre estructuras de datos inmutables y estructuras de datos mutables. A lo inmutable a veces se le llama de solo lectura. La inmutabilidad es una restricción que reduce la incertidumbre. Por ejemplo:

doSomething(NSMubaleArray* array);

Con una interfaz de este tipo, es posible modificar el contenido de la matriz en doSomething, por lo que cuando utilice esta función, necesitará para considerar los datos ¿Qué debo hacer si se modifican? ¿Debo hacer una copia primero para evitar modificaciones? Esto crea más incertidumbre. Esta interfaz:

doSomething(NSArray* array);

no tiene este problema.

Puede decir que debo tener cuidado al implementar doSomething para garantizar que las partes internas no se modifiquen y usar comentarios para indicar que no se modificará al llamar a esta función, de modo que cuando otros la usen , no se modificará. Pero no se puede confiar en este tipo de precaución. Si algo puede salir mal, saldrá mal. No debe pensar en escribir comentarios para atraer la atención de los demás, sino pensar en formas de eliminar el problema desde la fuente.

Además, la estructura inmutable viene con los siguientes beneficios:

Tiene una única función y es más fácil de implementar.

La interfaz sin datos modificados evita que los datos se modifiquen accidentalmente desde la fuente.

Como no se modificará, es más fácil almacenarlo en caché y reutilizarlo.

Debido a que es inmutable y de solo lectura, cuando varios subprocesos acceden a él, no se producirá lectura y escritura al mismo tiempo, por lo que no hay problemas de sincronización y no es necesario bloquear.

Aparte, al diseñar una interfaz de clase, cuantas más funciones mejor, no agregue la interfaz primero pensando que puede ser útil en el futuro, sino elimínela directamente pensando que la interfaz no es necesaria ahora. . Esto puede ser diferente de lo que piensan las personas que son nuevas en la programación. A veces piensan que una clase tiene demasiadas interfaces, por lo que la encapsulan con otra clase y solo proporcionan unas pocas interfaces.

De hecho, no solo el desarrollo de iOS, sino también otras situaciones distinguirán entre mutables e inmutables. Por ejemplo, constante en C++. let in swift, final en Java, abra el archivo para especificar si se puede leer y escribir. Se trata de la imposición de limitaciones, y la llamada libertad sin restricciones significa caos.

Lo vi en Zhihu y creo que la explicación es bastante razonable