Después de haber hecho recientemente algunos desarrollos para iPhone, he notado un patrón de diseño interesante que se usa mucho en el SDK de iPhone, con respecto a la mutabilidad de objetos.Patrones de diseño de mutabilidad en Objective C y C++
Parece que el enfoque típico es definir una clase inmutable NSFoo
, y luego derivar de ella un descendiente mutable NSMutableFoo
. Generalmente, la clase NSFoo
define miembros de datos, getters y operaciones de solo lectura, y el NSMutableFoo
derivado agrega operaciones setters y mutating.
Al estar más familiarizado con C++, no pude evitar observar que esto parece ser completamente contrario a lo que haría al escribir el mismo código en C++. Aunque sin duda podría tomar, me parece que un enfoque más conciso es crear una sola clase Foo
, marcar getters y operaciones de solo lectura como funciones const
, y también implementar las operaciones mutables y los setters en la misma clase . Entonces terminarías con una clase mutable, pero los tipos Foo const*
, Foo const&
etc. son todos el equivalente inmutable.
Supongo que mi pregunta es, ¿tiene sentido mi opinión sobre la situación? Entiendo por qué Objective-C hace las cosas de manera diferente, pero ¿hay alguna ventaja en el enfoque de dos clases en C++ que me he perdido? ¿O me estoy perdiendo el punto por completo?
No es una pregunta demasiado seria, más por mi propia curiosidad que por otra cosa.
'std :: string' puede usar COW para ahorrar en la copia, pero no está obligado a hacerlo en el estándar. Dado que COW es en realidad un éxito de rendimiento en un entorno multiproceso, pocas implementaciones todavía lo hacen. –