2

Pythonでシリアルポートからのデータを処理しています。最初のバイトはメッセージの開始を示し、2 番目のバイトはメッセージのタイプを示します。その 2 番目のバイトに応じて、メッセージの読み取り方が異なります (さまざまなタイプのメッセージを説明するために、一部はデータのみで、他は文字列などです)。

私は今、次の構造を持っていました。メッセージのすべてのタイプの基本的な関数を含む一般的な 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]()

今、私はこのタイプのコードを簡素化/改善したいと考えています。スイッチを強制終了することについて読んだことがありますが、最終的に使用しないオブジェクトを作成する必要があるのは好きではありません。この特定の問題を改善するための提案はありますか?

ありがとう

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()

オブジェクトを本来の使用方法で使用しています。の 1 つのインスタンスがmsg_stringを呼び出すためだけに存在することに気付きましたmsg_string.read()か? サンプル コードでは、メッセージが読み取られるたびに新しい Message インスタンスが作成されます。それがオブジェクトの目的です。それが実際にオブジェクト指向プログラミングがどのように機能するかです。

于 2013-09-10T21:03:32.207 に答える