From the daily archives: "Tuesday, October 18, 2011"

В нашем мире есть такой замечательный режисер, звать которого Кристофер Нолан. Именно его… кхм… перу принадлежат такие шедевры кинематографа (презрительно плюнем здесь в фанатов арт-хауса и прочего концептуального кино) как “Темный Рыцарь” и “Внедрение” (в русском переводе шедшее как “Начало”). Однако, посмотрев последний и впечатлившись – фильм действительно крайне хорошо сделан на мой непритязательный взгляд, я, до этого с фильмами Нолана не знакомый, решил все-таки посмотреть и другие его творения, благо что Темного Рыцаря не хвалил только немой. Он был первым на очереди, затем шел фильм Престиж. Именно этот фильм натолкнул меня на мысль, которая станет темой сегодняшней беседы.

Сюжет в моем пересказе скорее всего будет выглядеть перепевкой Бочелли Рабиновичем (а потому, лучше не портить себе настроение, а просто посмотреть этот фильм, если вы еще не сделали это), но вкратце – суть конфликта. Новое время, фокусник, его ассистент и жена фокусника, показывают трюк с утоплением. Жена успешно тонет, потому что ассистент завязал слишком сложный узел, а разбить бак вовремя не смогли. Друзья становятся врагами, ассистент – фокусником, на одном из трюков лишается двух пальцев из-за подставы первого, и так далее. История вражды. В моем пересказе – совершеннейшая банальность, ввиду того, что я, естественно, не могу выразить в двух строчках все ньюансы и переплетения сюжета.

Ближе к концу фильма для фокуса с перемещением человека, первый фокусник едет к Тесле, чтобы тот сделал ему машину. Машина действительно в конце концов появляется, но работает крайне странно – вместо того, чтобы телепортировать человека, она делает абсолютную его копию в новом месте. Магия? Нет, чистая наука, хотя фильм, конечно же, сразу становится фантастическим.

В результате, фокус с перемещением человека превращается в триумф антигуманизма. Так как после каждой транспортировки из одного фокусника получается два, то он сам себе делает ловушку – под сценой ставит бак с водой (такой же, в котором утонула его жена), и, фактически топит одну свою копию каждый раз, когда вторая выходит с другого конца зала, чтобы поклониться публике. Утонувшая копия в баке накрывается тканью и вывозится слепыми служащими, абсолютная секретность.

И уже в самом конце (развязку не буду портить, за спойлеры убивают) этот самый фокусник произносит слова, которые будут лейтмотивом нашей беседы – “ты не знаешь, где окажешься, в баке с водой или за сценой”. То есть, перенесется твое сознание, или же останется и ты, войдя в телепортатор, вынужден будешь захлебнуться в баке.

Конечно же, он лукавил. Он прекрасно понимал, чем приходится платить за этот трюк – смертью. И смертью не копии, к которой он имеет довольно посредственное отношение (одну из копий он лично пристрелил в самом начале испытаний), а самого себя. И все для того, чтобы копия могла жить.

Еще раз прошу, посмотрите фильм – он того стоит. А пока мы все-таки поговорим о телепортации.

Читать статью полностью →

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

Естественно, сделать этого напрямую нельзя, так как структуры языка С несовместимы с типом id, но это довольно просто обойти. Для этого следует воспользоваться типом NSValue.

Тип NSValue хорош тем, что в него можно положить произвольную структуру и достать ее оттуда, причем этот тип поддерживает типобезопасность за нас.

Допустим, у нас есть структура

С помощью категории, расширим класс NSValue парой методов

Тепреь можно работать с этими объектами в принятой в Objective C стилистике и не бояться за типобезопасность.

Как известно, в Objective C управлять видимостью методов, в отличие от видимости переменных, нельзя – все методы являются публичными. Насколько я понимаю, такое поведение имеет корни в модели “отправки сообщений”, которая тянется из Smalltalk. Любой объект отвечает на любое сообщение, которое он способен распознать и обработать. Технически, вызов метода представляет собой вызов функции objc_msgSend, принимающей указатель на объект, селектор и дополнительные параметры метода, и нет никакой возможности для среды выполнения определить, в каком контексте находится метод, кроме затратных, вроде передвижения по стеку и анализа лежащего в регистре self.

Ладно, нет так нет, нам от технической возможности или невозможности особо ни горячо ни холодно. Но ведь хочется! Хочется сделать нормальную инкапсуляцию, выстраивая грамотные иерархии наследования для исключения дублирования и возможности расширения, и чтобы не было соблазна ползать по внутренним методам, дергая за кишочки объектов. Ведь все ошибки в программах – это вина исключительно программистов.

Да, областей видимости действительно нет, но их можно имитировать, и я хочу показать, как.

Читать статью полностью →

Что-то мне подсказывает, что в лице Android мы все-таки получили еще один Windows.

PageLines