2

我正在处理来自 python 串行端口的数据。第一个字节表示消息的开始,然后第二个字节表示它是什么类型的消息。根据我们在消息中读取的第二个字节的不同(为了说明不同类型的消息,有些只是数据,有些是字符串等等)。

我现在有以下结构。我有一个通用的消息类,它包含每种消息类型的基本函数,然后是代表不同类型消息的派生类(例如 DataMessage 或 StringMessage)。这些都有自己特定的读取和打印功能。

在我的 read_value_from_serial 中,我读入了所有字节。现在我使用以下代码(这很糟糕)来确定消息是 DataMessage 还是 StringMessage(大约有 6 种不同类型的消息,但我简化了一点)。

msg_type = serial_port.read(size=1).encode("hex").upper()
msg_string = StringMessage()
msg_data = StringData()

processread = {"01" : msg_string.read, "02" : msg_data.read}
result = processread[msg_type]()

现在我想简化/改进这种类型的代码。我读过关于杀死开关的文章,但我不喜欢我必须创建最终不会使用的对象。有什么改善这个特定问题的建议吗?

谢谢

4

1 回答 1

2

这与您所拥有的非常接近,我认为它没有任何问题。

class Message(object):
    def print(self):
        pass

class StringMessage(Message):
    def __init__(self, port):
        self.message = 'get a string from port'

def MessageFactory(port):
    readers = {'01': StringMessage, … }
    msg_type = serial_port.read(size=1).encode("hex").upper()
    return readers[msg_type](port)

你说“我不喜欢我必须创建最终不会使用的对象”。你怎么不使用这些对象?如果我有一个 StringMessage msg,那么

msg.print()

正在使用一个对象,它应该是如何使用的。msg_string你的一个实例只存在于 call ,这让你感到困扰msg_string.read()吗?我的示例代码为每条读取的消息创建一个新的 Message 实例;这就是对象的用途。这实际上就是面向对象编程的工作原理。

于 2013-09-10T21:03:32.207 回答