Свойство, привлекающее внимание в приведенном методе, — это использование
локальной переменной (называемой временной переменной в языке Smalltalk).
Программист может описывать временные переменные, просто перечисляя их
имена внутри вертикальных черточек между заголовком метода и его телом. Это
справедливо как для класс-методов, так и для обычных методов. Область
видимости (существования) временных переменных включает в себя только метод,
в котором они описаны.
Язык Smalltalk не обеспечивает прямого механизма инициализации неизменяемых
полей. Часто методы, подобные suit:rank:, имеют пометку private. Это
предполагает, что такие методы не должны вызываться пользователями напрямую.
Однако такое ограничение выполняется только в силу соглашения, а не
вынуждается собственно языком программирования.
Другая техника инициализации объектов в языке Smalltalk — это каскад
сообщений. Его применяют, если несколько сообщений должны быть посланы
одному и тому же получателю (как это часто бывает при инициализации). Для
каскадирования сообщений вслед за получателем записывают список сообщений,
разделяемых точками с запятой. Например, следующее сообщение создает новое
множество Set и инициализирует его значениями 1, 2, 3. Результат, который
присваивается переменной aSet, — это новое проинициализированное множество.
Использование каскадов часто позволяет отказаться от временных переменных:
aSet := Set new add: 1; add: 2; add: 3.
Упражнения
1. Напишите метод copy для класса Card из главы 3. Метод должен возвращать
новый экземпляр класса Card с полями масти и ранга,
инициализированными такими же значениями, что и у получателя
сообщения copy.
2. Как бы вы разработали программное средство обнаружения
несанкционированного доступа для языка программирования, не
обеспечивающего прямой поддержки неизменяемых переменных
экземпляра? (Подсказка: спрячьте соответствующие директивы в
комментарии. Программное средство должно будет их анализировать и
использовать.)
3. Мы видели два стиля вызова методов. Подход, используемый в C++,
аналогичен традиционному вызову функции. Стиль, принятый в языках
Smalltalk и Objective-C, разделяет аргументы ключевыми словами. Что по
вашему мнению читается легче? Что более информативно? Какой подход
лучше защищен от ошибок? Обоснуйте вашу точку зрения.
4. Как бы вы разработали программное средство для детектирования
описанных в разделе 4.2.2 проблем, связанных с выделением и
освобождением памяти?
5. А. Аппель [Appel 1987] настаивает, что при определенных обстоятельствах
выделение памяти из «кучи» может быть более эффективным, чем
использование стека. Прочтите его статью и суммируйте ключевые
положения Аппеля. Насколько вероятно, что ситуации, для которых это
утверждение справедливо, встретятся на практике?
6. Напишите короткое (два-три абзаца) эссе за или против автоматической
«сборки мусора».
PDF created with pdfFactory Pro trial version www.pdffactory.com