вторник, 8 сентября 2009 г.

Обратная совместимость ограничивает даже ваш внутренний код

Это перевод The compatibility constraints of even your internal bookkeeping. Автор: Реймонд Чен.

Элемент управления ListView, будучи в режиме отчёта (report), имеет дочерний элемент управления заголовков (header control), который показывает заголовки колонок. Этот элемент управления является собственностью ListView, но ListView достаточно добр, чтобы позволить вам получить описатель (handle) этого элемента.

И некоторые программы злоупотребляют этой добротой.

Так получилось, что оригинальный элемент управления ListView ни для чего не использует lParam элементов в элементе управления заголовками. Поэтому некоторые программы сказали: "ну, раз ты его не используешь, тогда я буду использовать!", и стали хранить в нём свои внутренние данные.

Когда следующая версия ListView решила: "чёрт возьми, у меня тут есть куча данных для каждого элемента в заголовке, за которыми надо следить. К счастью у меня есть мой элемент управления заголовками, я могу сохранить мои данные в lParam элементов заголовков".

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

После последующего разбора полётов, команда разработки ListView поняла, что произошло, и прокляла эту программу, вросшую во внутренние структуры, из-за которой им пришлось искать обходной путь. Вспомогательные данные теперь хранятся в менее удобном месте, так что все эти бажные программы могут продолжать работать без вылета.

Мораль истории: даже если вы изменяете что-то, что никто не должен использовать, есть шанс, что кто-то всё же использует это.

(Я уверен, что сейчас будет обычных хор людей, говорящих: "вам следовало просто забить на них". Что если я скажу вам, что одна из программ, которая это делала - широко используемая утилита системного администрирования (хотя я не могу озвучить её имя)? Эх, полагаю, это всё равно не изменит ваше мнение).

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

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

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

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

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

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

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