пятница, 11 июня 2010 г.

Что если две программы сделают это?

Это перевод What if two programs did this? Автор: Реймонд Чен.

Мысленный эксперимент "представьте, если бы это было возможным" является полезным, когда вы думаете, может ли Windows делать то или это (частным случаем этого эксперимента является "Когда люди просят дыры безопасности в качестве новых возможностей ОС"). Если эта возможность приводит к очевидным противоречиям или нарушениям общепринятых правил метафизики, то можете быть уверены, что Windows не поддерживает эту возможность (конечно же, отсутствие противоречий ещё не доказывает, что Windows поддерживает возможность. Но вы можете использовать это правило для отбраковывания очевидных плохих идей).

Вопрос "Что если две программы сделают это?" также является полезным инструментом в оценке возможности или решения дизайна. Соединение его с "представьте, если бы это было возможным" приводит к впечатляющим результатам. Вот несколько примеров:
"Как я могу создать окно, которое никогда не будет перекрыто другими окнами, даже теми, которые topmost, т.е. поверх-всех?"
Представьте, если бы это было возможным, и если бы две программы сделали это. Программа А создаёт окно, которое "супер-повер-всех". Также поступает и программа Б. Теперь пользователь перетаскивает окна так, что они пересекаются. Что должно произойти? Вы только создали себе логическое противоречие. Одно из этих окон обязано быть поверх другого, но это противоречит возможности "супер-повер-всех".
"Как я могу пометить мой процесс, чтобы он всегда был первым/последним для получения уведомления о завершении работы? Я хочу сделать что-то до/после завершения всех программ."
Представьте, если бы это было возможным, и если бы две программы сделали это. Теперь у вас есть две программы, которые хотят быть первыми/последними. Но у вас не может быть две первых или две последних программы. Одна из них должна уступить (конечно же, этот пример - просто обобщение других вещей, которые люди хотят делать самыми первыми или самыми последними).
"Как я могу сделать так, чтобы файлы .XYZ всегда открывала только моя программа?"
Представьте, если бы это было возможным, и если бы две программы сделали это. Пользователь щёлкает на файл .XYZ. Чья программа должна быть запущена?

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

Мой коллега Zeke, кто ответственен, среди прочих вещей, за то, как работают файловые ассоциации в Проводнике, добавил несколько альтернатив:
Вот точка входа в MSDN для документации по файловым ассоциациям в Проводнике.

Для многих вопросов рода "Я хочу быть самым X-тым", вы часто можете придумать какой-то хак, типа запуска таймера, который периодически проверяет, являетесь ли вы X-тым, и, если это не так, делает вас таковым. Но тогда, если вы притормозите и подумаете: "Но что если две программы сделают это?", то осознаете, что это не такая уж хорошая идея. По крайней мере, я надеюсь на это.

Даже после этого объяснения, некоторые люди не понимают этого. Я призываю их рассмотреть: "что если две программы будут так делать? Они будут сражаться друг с другом", но они говорят: "тогда я сделаю так, чтобы вторая программа проверяла, не запущена ли первая". Они не осознают, что не они пишут вторую программу.

Когда две программы начинают борьбу такого рода, вы не можете предсказать, кто победит, но зато вы можете предсказать, что проиграет на 100%: пользователь.

Я хорошо помню, когда один из моих коллег позвал меня в свой офис, чтобы показать мне две очень известные коммерческие программы, которые хотели гарантировать, что они будут программами, которые запустятся, когда пользователь щёлкнет по файлу .XYZ. Поскольку такой гарантии дать нельзя, обе программы использовали хак с таймером.

Вы устанавливали одну программу, она регистрировала себя обработчиком фалов .XYZ - и пока всё шло нормально. Потом вы устанавливали вторую программу, и она тоже регистрировала себя новым обработчиком файлов .XYZ. Первая программа замечала это и говорила: "Неа. Я - программа, которая обрабатывает файлы .XYZ" и меняла настройки назад. Теперь вторая программа говорила: "Не может быть! Я - программа, которая открывает .XYZ" и меняла настройки снова!

Эта детская игра "ты не прав/нет, ты не прав" продолжалась, пока пользователь сидел перед машиной чувствуя себя идиотом, беспомощно глядя на бесконечную смену значков у .XYZ файлов в драке между двумя программами, каждая из которых эгоистично считала, что именно она оказывает пользователю "услугу", настаивая на том, что именно она открывает файлы .XYZ.

Читать далее: практический экзамен.

4 комментария:

  1. История с таймером - забавная. И сама мысль "а что будет" - очень здравая, да. Жаль не всегда она вовремя приходит в голову.

    ОтветитьУдалить
  2. Анонимный21 июня 2010 г., 21:54

    ...Бог, по-определению, всемогущ. Может ли тогда Бог создать камень, который сам же не поднимет?..

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

    ОтветитьУдалить

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

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

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

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

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