上古時期的程序員, 肯定都知道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.