1
假设你有这样的代码:是什么使静态初始化函数好,坏或其他?
_READERS = None
_WRITERS = None
def Init(num_readers, reader_params, num_writers, writer_params, ...args...):
...logic...
_READERS = new ReaderPool(num_readers, reader_params)
_WRITERS = new WriterPool(num_writers, writer_params)
...more logic...
class Doer:
def __init__(...args...):
...
def Read(self, ...args...):
c = _READERS.get()
try:
...work with conn
finally:
_READERS.put(c)
def Writer(...):
...similar to Read()...
对我来说,这是一个糟糕的模式可循,一些缺点:
Doer
S可没有它的前提条件被满足- 的创建代码不容易测试,因为ConnPool不能直接模拟出来。
Init
必须第一次被调用。如果它改变了,所以它可以被多次调用,额外的逻辑必须被添加来检查变量是否已经定义,并且大量的NULL值必须被传递以跳过重新初始化。- 在线程的情况下,上述变通过添加锁定
- 全局没有被用于传送状态更复杂(这是不严格坏,但一个代码气味)
在另一方面,一些优点:
- 其非常方便的调用
Init(5, "user/pass", 2, "user/pass")
- 它简单, “干净”
我个人认为利弊大于专业人士,也就是说,可测试性和可靠的先决条件大于简单性和便利性。
Thanks!这证实了我对自己的想法。 – 2010-04-09 18:26:21