суббота, 23 октября 2010 г.

Вы не можете отдать что-то, что не ваше

Это перевод You can't give away something that isn't yours. Автор: Реймонд Чен.

Это правило из обычной жизни применимо и к коду. Если что-то не принадлежит вам, то вы не можете это отдать.

Например, функции типа SetCliboardData и SetWindowRgn забирают себе передаваемые им ресурсы. В случае SetClipboardData передаваемый вами блок памяти становится свойством буфера обмена. В случае SetWindowRgn параметр hRgn переходит во владение оконного менеджера. В обоих случаях вы отдаёте контроль над объектом другому компоненту - но чтобы вы могли так сделать, этот объект должен принадлежать вам.

Это утверждение может быть очевидным, но на удивление много людей не понимают его следствий. К примеру, вы не можете сделать так:
// Проверка на ошибки убрана для улучшения читабельности
SetClipboardData(CF_TEXT, hMem);
// Этот код неверен:
SetClipboardData(RegisterClipboardData(CFSTR_SHELLURL), hMem);
Когда вы вызвали SetClipboardData в первый раз, память уже принадлежит буферу обмена. Она не ваша. Когда вы вызываете SetClipboardData во второй раз - вы отдаёте её снова, но во второй раз она вам не принадлежит.

Другими словами: после первого вызова SetClipboardData память принадлежит буферу обмена. Второй вызов пытается отдать что-то, что больше не ваше.

Это напомнило мне одну историю в новостях, которую я когда-то читал. В Соединённых Штатах победителю большой лотереи часто предлагают выбор между серией выплат в течение нескольких лет или всю сумму сразу. Кто-то выиграл лотерею и согласился продать ежегодные выплаты какой-то компании взамен на сумму целиком (предположительно, эта компании предложила итоговую сумму выше, чем организаторы лотереи). И когда затем его спросили, хочет ли он выигрыш в виде выплат или всей суммы сразу, победитель попросил всю сумму. Парень, ты не можешь взять всю сумму. Потому что ты уже продал входящий поток выплат другой компании. Это уже не твои деньги.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.