Недавно сделав некоторую разработку для iPhone, я заметил замечательный шаблон дизайна, который много использовал в iPhone SDK, касающийся изменчивости объекта.Шаблоны проектирования Mutability в Objective C и C++
Кажется, что типичный подход заключается в определении неизменяемого класса NSFoo
, а затем вытекает из него изменчивый потомок NSMutableFoo
. Как правило, класс NSFoo
определяет члены данных, геттеры и операции только для чтения, а производные NSMutableFoo
добавляет к сеттерам и мутирующим операциям.
Будучи более знакомым с C++, я не мог не заметить, что это похоже на полную противоположность тому, что я делал бы при написании того же кода на C++. Хотя вы, конечно, может принять этот подход, мне кажется, что более кратким подходом является создание одного класса Foo
, маркирования геттеров и операций только для чтения как функций const
, а также реализации изменяемых операций и сеттеров в том же классе , Затем вы закончите с изменяемым классом, но типы Foo const*
, Foo const&
и т. Д. Все это фактически непреложный эквивалент.
Я думаю, мой вопрос в том, имеет ли смысл воспринимать ситуацию? Я понимаю, почему Objective-C делает вещи по-другому, но есть ли какие-либо преимущества для двухклассового подхода на C++, который я пропустил? Или я пропущу точку целиком?
Не слишком серьезный вопрос - больше для моего собственного любопытства, чем что-либо еще.
'std :: string' разрешено использовать COW для сохранения при копировании, но не требуется для этого стандартом. Поскольку COW на самом деле является хитом производительности в многопоточной среде, некоторые реализации все еще делают это. –