正確理解Handle對象

上古時期的程序員, 肯定都知道Handle對象, 一般中文翻譯成句柄. 一般的Handle在實現上, 都是一個整數, 而這個整數可以理解爲一個指針, 指針指向的地址呢, 又保存了另外一個指針. 之所以這麼搞, 是因爲這樣搞可以讓真實的對象可以挪動.

考慮一個一個對象A, 保存在Handle裏面, 由於某種原因, 我需要把這個對象A從原來的位置移走, 那麼移走之後的對象叫對象B, 那我只需要修改一下Handle裏面的指針, 就可以保證正確性, 然後在用戶看來, 還是同一個對象, 因爲Handle沒有改變.

正是因爲Handle這種特性, 所以可以基於Handle做一個GC系統. miloyip翻譯的那本遊戲編程的書裏面也講過, 之前在主機上有人用Handle來管理內存.

而我這篇文章想說的是, Handle這種特性其實還可以用在跟UI有關係的系統裏面. 試想一個遊戲客戶端和服務器要頻繁打交道, 然後C#這種引用語意的語言中, 很多程序員都會在UI層保存一個Entity對象, 由於一些原因, 會導致整個系統內部會出現兩個Entity對象, 其ID一樣.

你可以說這是由於程序員的編碼不正確, 我也確信這一點. 但是我們要從根本層面上解決這個問題, 而不是把這個問題推卸給人.

由於我們知道Handle可以讓我們把對象挪動, 那麼我們也只需要在C#造這樣一個東西就行了. 這樣在使用的時候, 只讓程序員用Handle<T>來操作T這個類型的Entity對象. 那麼系統內部, 就只會有一個Entity.

PS:

一般比如文件描述符/文件都是一個Handle, 跟OS打交道的硬件資源, 一般都是Handle.

Linux下, 一個thread_t也是句柄~~

再比如, Sun以前實現的JVM, 一個reference也是一個Handle.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章