Чтобы избежать этих проблем, зачастую достаточно обеспечить, чтобы каждый
объект с динамически выделяемой памятью имел четко обозначенного владельца.
Владелец памяти гарантирует правильное использование памяти и ее
освобождение, когда она больше не нужна. В больших программах, как и в
реальной жизни, споры за право быть собственником разделяемого ресурса могут
создать проблемы.
4.2.3. Указатели
Указатели — эффективное средство работы с динамической информацией, и по
этой причине они используются практически во всех объектно-ориентированных
языках. Вопрос: «Указатели — это полезная абстракция или нет?» активно
дискутируется в сообществе программистов. Это нашло свое отражение в том
факте, что не все объектно-ориентированные языки поддерживают указатели.
В некоторых языках (Java, Smalltalk) объекты представляются внутренним образом
как указатели, но при этом они не используются в этом качестве программистами.
В других языках (C++, Object Pascal) приходится явно различать переменные,
содержащие значения, и переменные-указатели. Как мы увидим в учебных
примерах на языке C++, которые будут представлены ниже, в реализации
объектно-ориентированных свойств языка указатели задействованы в явном виде.
В языке Objective-C значения, объявленные как id, на самом деле являются
указателями, но это в значительной степени скрыто от пользователя. Когда в
Objective-C объекты описываются как явно принадлежащие тому или иному
классу, программисту необходимо различать объекты и явные указатели на них.
4.2.4. Создание неизменяемого экземпляра объекта
В главе 3 мы описали класс Card и отметили одно свойство, желательное для
абстракции игральных карт, — а именно, чтобы значения масти и ранга
(достоинства) карты задавались бы лишь однажды и больше не менялись.
Переменные, подобные полям данных suit и rank (они не меняют своих значений во
время выполнения программы), называются переменными с однократным
присваиванием (single-assignment variables) или же неизменяемыми переменными
(immutable variables). Объект, у которого все переменные экземпляра являются
неизменяемыми, в свою очередь называется неизменяемым объектом.
Неизменяемые переменные следует отличать от констант, хотя в значительной
степени разница состоит только во времени связывания и области видимости.
Константа в большинстве языков программирования (например, в C и Паскаль)
должна быть известна на момент компилирования, иметь глобальную область
видимости и оставаться неизменной. Неизменяемой переменной можно присвоить
значение, но только единожды; таким образом, значение остается неопределенным
вплоть до момента выполнения программы (когда создается объект, содержащий
это значение).
Конечно, неизменяемые объекты могут конструироваться просто по соглашению.
Например, мы можем предусмотреть сообщение, задающее масть и ранг игральной
карты, и затем просто полагаться на то, что пользователь будет использовать это
средство лишь однажды при создании объекта, а не для последующего изменения
состояния объекта. Более предусмотрительные объектно-ориентированные
разработчики предпочитают не полагаться на добрую волю своих потребителей и
PDF created with pdfFactory Pro trial version www.pdffactory.com