2013-09-10 30 views
2

我正在處理來自python中的串行端口的數據。第一個字節表示消息的開始,然後第二個字節表示它是什麼類型的消息。根據第二個字節,我們在消息中讀取的內容是不同的(爲了說明不同類型的消息,有些僅僅是其他字符串等數據)。關於在Python中殺死交換機

我現在有以下結構。我有一個通用的Message類,它包含每種類型消息的基本函數,然後包含表示不同類型消息(例如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]() 

現在我想簡化/改進這種類型的代碼。我已閱讀關於殺死交換機的消息,但我不喜歡它,我不得不創建最終不會使用的對象。有什麼建議可以改善這個特定問題?

謝謝

+0

您能提供一個「殺死開關」的想法的參考或鏈接?一些可能對你有用的switch語句的替代方法可以在[Python中的switch語句的替換?]中找到(http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python ?RQ = 1)。 – Simon

+0

你好,我實際上使用該鏈接來實現我的代碼。我遇到的問題是我不喜歡這個解決方案,並且應該有另一種更好的方式來處理我的問題。我認爲我的標題有點誤導,因爲我實際上正在尋找我當前的解決方案的替代品,這些替代品不那麼難看,也不需要創建任何對象。 – DanFritz

回答

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的實例只能撥打msg_string.read()?我的示例代碼爲每個消息讀取創建一個新的Message實例;這就是對象的用途。這實際上是面向對象編程的工作原理。

+0

例如,msg類型爲msg_object時,我不喜歡msg_data和msg_string的無用創建。 – DanFritz

+0

您需要提供更多關於您的類型結構的詳細信息,以獲得更好的答案。 – msw