我应该直接访问这些属性还是使用代理方法?

时间:2014-06-29 19:47:48

标签: python oop design-patterns encapsulation proxy-classes

我的客户端API封装了存储ServerConnection对的类asyncio.StreamReader/-Writer中与服务器的连接。 (为简单起见,我不会在下面的代码中使用yield from或任何其他异步技术,因为它与我的问题无关。)

现在,我想知道将两个流作为ServerConnection的公共接口的一部分公开,而不是将read()/ write()方法引入ServerConnection,以便将调用转发到相应的流方法。例如:

class ServerConnection:
    def __init__(self, reader, writer):
        self.reader = reader
        self.writer = writer

VS

class ServerConnection:
    def __init__(self, reader, writer):
        self._reader = reader
        self._writer = writer

    def read(self, size):
        return self._reader.read(size)

    def readline(self):
        return self._reader.readline()

    def write(self, data):
        return self._writer.write(data)

    def close(self):
        return self._writer.close()

    # …further proxy methods…

到目前为止我所知道的优点/缺点:

优点: ServerConnection绝对是某种双向流,因此让它从StreamRWPair继承是有意义的。此外,使用server_conn.read()server_conn.reader.read()更方便。

缺点:我需要定义一大堆代理方法。 (在我的例子中,我实际上使用了某种缓冲读取器,它有其他方法,如peek()等等。)所以我考虑创建一个类似于Python StreamRWPair的基类io.BufferedRWPair我的ServerConnection可以继承。但是,io模块的Python实现在评论中说明了以下BufferedRWPair

  

XXX这是有用的(与拥有两个独立的IO相比   对象)是值得怀疑的。

最重要的是,我的ServerConnection类还有其他几种方法,我担心,通过代理,我会混淆其属性命名空间并使其使用不那么明显。

0 个答案:

没有答案