如果兩個程式都這樣做會怎樣?

發表於2013-11-06

本文作者介紹: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撰寫專欄文章。

Raymond-Chen

在腦子裡“設想如果可以這樣”,這種方法能幫助你理解Windows是否會允許讓你做這種或那種事情。如果這種設想會明顯的導致一種自相矛盾的情況,或跟人們已經接受的原則體系相沖突,那你可以明確的得出Windows不會支援這種行為的結論。(當然,如果沒有明顯的矛盾或衝突,也不能證明Windows就一定會支援這種操作。但用這種方法你可以排除一些明顯的不正確的想法。)

問“如果兩個程式都這樣做會怎樣?”也是一種非常有用的甄別一個功能特徵或設計想法是否合理的好方法。配合“設想如果可以這樣”,它們能成為一個漂亮的組合拳。下面是幾個例子:

“我怎麼才能建立一個視窗,讓它永遠不會被其它視窗覆蓋,即使那些最上層的視窗也不行?”

假設這樣如果是可以的,加上如果有兩個程式都這樣做。程式A建立了一個“最上層”的視窗,程式B也這樣做了。現在使用者拖動這兩個視窗,讓它們重疊,會發生什麼?你給自己創造了一個邏輯衝突。這兩個視窗必須有一個在上,一個在下,推翻了假想的“超級最上層”設計想法。

“如何突出我的程式,讓它成為在系統關機時第一個/最後一個接到通知?我想在系統關機時在所有其它程式退出之前/之後做一些事情。”

假設如果這樣可能,假設兩個程式都這樣做。你現在有了兩個程式都希望做第一/最後。但你不可能有兩個第一或兩個最後。其中有一個必須要放棄。(這個可以推廣到其他的人們想要第一或最後的事情上。)

“如何能保證當使用者雙擊.XYZ檔案時總是我的關聯程式會啟動執行?”

假設這是可能的,假設兩個程式都想這樣。當使用者點選.XYZ檔案時,哪個程式執行?

這種情況下的一種解決方案是使用者來選擇檔案的關聯程式;但一旦使用者決定讓另外一個程式來執行.XYZ檔案,那你不得不接受這樣的事實。

對於很多這種“我想成為這最X”型別的問題,程式設計師通常會想出一些伎倆,比如執行一個定時器週期性的檢查自己是否仍是最X,如果不是,就重新把它推到X位。不久,你就會開始停下來思考,“如果兩個程式都這樣做會怎樣?”,於是認識到這是一個糟糕的想法。

就算是我這樣解釋了,很多人仍然不得要領。我讓他們去想想“如果兩個程式都這樣做會怎樣?它們會打架,”而我得到的回覆是,“我可以讓第二個程式檢查第一個程式是否在執行。”他們不明白第二個程式不是他們寫的。

當出現兩個程式這樣“互毆”時,我們無法預料哪一個會贏,但我們可以確定的、100%的預料的誰會輸:使用者。

我還清楚的記得有一回同事讓我看有兩個非常流利的商業軟體都想成為當使用者點選.XYZ文件時被呼叫的程式。因為這是沒法保證的,於是軟體裡就提供了定時檢查的程式試圖解決這個問題。

你安裝了第一個程式,它把自己設定成.XYZ檔案的關聯程式,這看起來很正常。然後你安裝了第二個程式,它也把自己設定成.XYZ檔案的關聯程式,這樣第一個程式就跳出來說,“不,.XYZ應該是由我來處理的”,並且把檔案關聯改了回去。而第二個程式也說,“沒門,我才是處理.XYZ檔案的程式”,並且把自己重置回去。

這種小孩鬥氣式的遊戲進行的時候,使用者只能無助的坐在那裡發愣的看著.XYZ檔案的圖示在兩個程式間換來換去。這兩個程式都堅持認為讓自己來處理.XYZ檔案是在為使用者著想。

相關文章