Что использует Smalltalk в «становятся:»?

12

become:Сообщение в Smalltalk вызывает один объект изменения в другой, влияя на все ссылки на него.

Что использует эта языковая функция? Это используется в реальном коде? Это просто любопытство? Считается ли это хорошей / плохой практикой?

ДПК
источник

Ответы:

11

Гилад Брача говорит become:довольно подробно:

Одна из самых уникальных и мощных функций Smalltalk также является одной из наименее известных за пределами сообщества Smalltalk. Это маленький метод с именем становиться:.

Что становится: делает, это меняет личность своего получателя и его аргумент. То есть после

стать: б

все ссылки на объект, обозначенный перед точкой вызова, ссылаются на объект, обозначенный буквой b, и наоборот.

Потратьте минуту, чтобы усвоить это; Вы могли бы неправильно понять это как что-то тривиальное. Речь идет не об обмене двумя переменными, а буквально о том, что один объект становится другим. Я не знаю ни одного другого языка, который имеет эту функцию. Это особенность огромной силы - и опасности.

Рассмотрим задачу расширения вашего языка для поддержки постоянных объектов. Скажем, вы хотите загрузить объект с диска, но не хотите загружать все объекты, на которые он ссылается, транзитивно (в противном случае это просто десериализация простого объекта). Таким образом, вы загружаете сам объект, но вместо загрузки его прямых ссылок вы заменяете их объектами шелухи.

Шелуха заменяет реальные данные на вторичном хранилище. Эти данные загружаются лениво. Когда вам действительно нужно вызвать метод на шелухе, его doesNotUnderstand: метод загружает соответствующий объект данных с диска (но опять же, не транзитивно).

Затем он выполняет функцию::, заменяя все ссылки на шелуху ссылками на вновь загруженный объект, и повторяет вызов.

Некоторые механизмы персистенции делали подобные вещи десятилетиями, но обычно полагались на низкий уровень доступа к представлению. Стать: позволяет вам делать это на уровне исходного кода.

Теперь иди делай это на Java. Или даже на другом динамическом языке. Вы поймете, что таким образом вы можете создать общую форму будущего, а значит, и лени. Все без привилегированного доступа к работе реализации. Это также полезно для эволюции схемы - например, когда вы добавляете переменную экземпляра в класс. Вы можете «изменить» все экземпляры по мере необходимости.

Конечно, вы не должны использовать становиться случайно. Это обходится дорого, что может быть непозволительно во многих реализациях. В раннем Smalltalks стало: было дешево, потому что на все объекты ссылались косвенно с помощью таблицы объектов. При отсутствии таблицы объектов, становитесь: пересекает кучу способом, подобным сборщику мусора. Чем больше у вас памяти, тем дороже становится: становится.

Наличие таблицы объектов занимает память и замедляет доступ; но это дает вам большую гибкость. Аппаратная поддержка может снизить производительность. Преимущество состоит в том, что многие сложные проблемы становятся вполне решаемыми, если вы готовы оплатить стоимость косвенного обращения через таблицу объектов заранее. Помните: любая проблема в информатике может быть решена с помощью дополнительных уровней косвенности. Например, у Алекса Уорта есть очень интересная работа, которая вписывается в эту категорию.

Стать: имеет несколько вариантов - одним из способов становится: изменение идентичности объекта A на идентичность другого объекта B, так что ссылки на A теперь указывают на B; ссылки на B остаются без изменений. Часто бывает полезно стать: навалом - преобразование идентификаторов всех объектов в массиве (однонаправленно или двунаправленно). Группа становится: что делает это волшебно атомно, отлично подходит для реализации рефлексивных обновлений в системе, например. Вы можете изменить целый набор классов и их экземпляров за один раз.

Вы можете даже думать о типе safe стать:. Двумя путями становится: безопасен только тип, если тип A идентичен типу B, но единственный способ становится: требуется только, чтобы новый объект был подтипом старого.

Возможно, пришло время пересмотреть вопрос о том, является ли наличие таблицы объектов действительно хорошей вещью.

По сути, вы получаете ленивую загрузку через метапрограммирование. Как указывает Брача, это может быть очень полезно, но также и опасно, поскольку может оказать серьезное влияние на производительность.

Мировой инженер
источник
Я бы больше беспокоился о том, как becomeэто повлияет на мое здоровье, чем на эффективность моей программы ...
Бенджамин Ходжсон,
Hardware support could ease the performance penalty.Из всех мест, где я это слышал, сообщество Smalltalk было самым выдающимся. Зачем нам «тратить» аппаратные усовершенствования на включение идеалистических парадигм программирования, если вместо этого это может привести к повышению производительности, снижению энергопотребления или расширению возможностей.
Александр - Восстановить Монику
2

Это не используется много. В открытом образе Pharo 5 есть 9 отправителей #become:, 7 из которых находятся в модульных тестах. Он используется в компиляторе при генерации кода и в библиотеке сериализации Fuel для замены прокси их содержимым.

Стефан Эггермонт
источник
Интересный. Для чего используются юнит-тесты?
дпк
чтобы увидеть, работает ли это ...
Стефан Эггермонт