__CA__.py
7 years ago
RAII 並不完美,有很多問題,但可惜的是它是目前我看過較好的解法
latest #11
__CA__.py
7 years ago
其次是 Python 的 context manager (雖然最近對它不是很滿意)
__CA__.py
7 years ago
再其次是 try-finally
debɐnchery
7 years ago
我覺得 python 的 context manager 比 RAII 好些 XD
立即下載
__CA__.py
7 years ago
我說明一下我為什麼覺得 context manager 不好用,又為什麼覺得 RAII 好一點,不然有人可能覺得我亂噴 XD
__CA__.py
7 years ago
1. interface propagation 問題:
context manager 仰賴用戶主動使用 with-statement(如果只需要在一個 scope 使用),或是實作 enter/exit
__CA__.py
7 years ago
如果內部實作增加了一個新的 member 需要 context manager,這下可麻煩了,你要一路把 enter/exit 實作上去,而且用戶如果沒發覺這件事就一點用也沒有
__CA__.py
7 years ago
RAII 的 interface 是一致的,所有物件一定有定義 constructor/destructor,離開 scope 一定會呼叫 destructor。library 實作怎麼改不會影響用戶的使用方式
__CA__.py
7 years ago
2. enter 如果發生 exception 的話 exit 不會被呼叫,所以要真正做到安全還是要在 enter 裡使用 try-finally。另外因為 exit 需要 exception 和 traceback 當參數,你要自己從 sys 拿
__CA__.py
7 years ago
RAII 如果小心一點的話,在 constructor 途中建立的 member 還是會呼叫自己的 destructor 的
__CA__.py
7 years ago
大 guy 4 john
debɐnchery
7 years ago
interface propagation 跟 exception propagation 都很麻煩阿阿阿阿
back to top