如果两个程序都这样做会怎样?

jopen 10年前

本文作者介绍

Raymond Chen
如果两个程序都这样做会怎样?

Raymond Chen是微软Windows Shell开发团队中的知名程序员,从1992年加入微软开始,他参与过OS/2,Windows 95,DirectX已经以后版本的Windows的开发。他的关于Windows的发展以及Win32编程个人博客“The Old New Thing”是微软MSDN上最著名的个人博客之一。著有同名书籍《The Old New Thing》,中文译名为《Windows编程启示录》。Raymond还为Microsoft TechNet撰写专栏文章。

</div>

在脑子里“设想如果可以这样”,这种方法能帮助你理解Windows是否会允许让你做这种或那种事情。如果这种设想会明显的导致一种自相矛盾的情 况,或跟人们已经接受的原则体系相冲突,那你可以明确的得出Windows不会支持这种行为的结论。(当然,如果没有明显的矛盾或冲突,也不能证明 Windows就一定会支持这种操作。但用这种方法你可以排除一些明显的不正确的想法。)

问“如果两个程序都这样做会怎样?”也是一种非常有用的甄别一个功能特征或设计想法是否合理的好方法。配合“设想如果可以这样”,它们能成为一个漂亮的组合拳。下面是几个例子:

“我怎么才能创建一个窗口,让它永远不会被其它窗口覆盖,即使那些最上层的窗口也不行?”

假设这样如果是可以的,加上如果有两个程序都这样做。程序A创建了一个“最上层”的窗口,程序B也这样做了。现在用户拖动这两个窗口,让它们重叠,会发生什么?你给自己创造了一个逻辑冲突。这两个窗口必须有一个在上,一个在下,推翻了假想的“超级最上层”设计想法。

“如何突出我的进程,让它成为在系统关机时第一个/最后一个接到通知?我想在系统关机时在所有其它程序退出之前/之后做一些事情。”

假设如果这样可能,假设两个程序都这样做。你现在有了两个程序都希望做第一/最后。但你不可能有两个第一或两个最后。其中有一个必须要放弃。(这个可以推广到其他的人们想要第一或最后的事情上。)

“如何能保证当用户双击.XYZ文件时总是我的关联程序会启动运行?”

假设这是可能的,假设两个程序都想这样。当用户点击.XYZ文件时,哪个程序运行?

这种情况下的一种解决方案是用户来选择文件的关联程序;但一旦用户决定让另外一个程序来执行.XYZ文件,那你不得不接受这样的事实。

对于很多这种“我想成为这最X”类型的问题,程序员通常会想出一些伎俩,比如运行一个定时器周期性的检查自己是否仍是最X,如果不是,就重新把它推到X位。不久,你就会开始停下来思考,“如果两个程序都这样做会怎样?”,于是认识到这是一个糟糕的想法。

就算是我这样解释了,很多人仍然不得要领。我让他们去想想“如果两个程序都这样做会怎样?它们会打架,”而我得到的回复是,“我可以让第二个程序检查第一个程序是否在运行。”他们不明白第二个程序不是他们写的。

当出现两个程序这样“互殴”时,我们无法预料哪一个会赢,但我们可以确定的、100%的预料的谁会输:用户。

我还清楚的记得有一回同事让我看有两个非常流利的商业软件都想成为当用户点击.XYZ文档时被调用的程序。因为这是没法保证的,于是软件里就提供了定时检查的程序试图解决这个问题。

你安装了第一个程序,它把自己设置成.XYZ文件的关联程序,这看起来很正常。然后你安装了第二个程序,它也把自己设置成.XYZ文件的关联程序, 这样第一个程序就跳出来说,“不,.XYZ应该是由我来处理的”,并且把文件关联改了回去。而第二个程序也说,“没门,我才是处理.XYZ文件的程序”, 并且把自己重置回去。

这种小孩斗气式的游戏进行的时候,用户只能无助的坐在那里发愣的看着.XYZ文件的图标在两个程序间换来换去。这两个程序都坚持认为让自己来处理.XYZ文件是在为用户着想。

来自: 外刊IT评论 http://www.aqee.net/