Seite 1 von 1

Twisted: Protocol separation

Verfasst: Montag 5. September 2016, 06:10
von Hazzard
Ich habe ein kompliziertes Twisted protocol (A) das auf einem anderen (B) aufbaut (von diesem erbt, wie halt bei twisted protocols so üblich).
Jetzt will ich aber B austauschbar machen (so dass mein protocol auch über zb. websocket (C) läuft).

Bsp.

Code: Alles auswählen

class ProtoB(Protocol):
    def dataReceived(self, data):
        self.recv(data)

    def send(self, data):
        self.transport.write(data)

class EchoA(ProtoB):
    def recv(self, data):
        self.send(data)
Natürlich kann ich ProtoB in der Vererbung einfach austauschen. Aber das geht ja nicht per Parameter und somit müsste ich sachen copy und pasten.
Man kann auch das eine Objekt an das andere übergeben, aber so richtig schön ist das wegen der gegenseitigen Abhängigkeit auch nicht.
A la:

Code: Alles auswählen

class EchoA:
    def recv(self, data):
        self.send(data)

class ProtoB(Protocol):
    def __init__(self, proto=EchoA()):
        self.proto = proto
        self.proto.send = self.send

    def dataReceived(self, data):
        self.proto.recv(data)

    def send(self, data):
        self.transport.write(data)
Und noch dazu ist die Reihenfolge verkehrt rum, aber ich brauch ja am Schluss ein Protokoll was von twisted.Protocol erbt.

Da gibt's doch sicher bei Twisted irgendein standard Pattern wie man das ordentlich macht. Kann mir da jemand helfen?

Re: Twisted: Protocol separation

Verfasst: Montag 5. September 2016, 10:18
von BlackJack
@Hazzard: Mixin-Klassen‽

Code: Alles auswählen

class ProtoB(Protocol):

    def dataReceived(self, data):
        self.recv(data)
 
    def send(self, data):
        self.transport.write(data)


class EchoA(object):

    def recv(self, data):
        self.send(data)


class EchoAOverProtoB(EchoA, ProtoB):
    pass


class EchoAOverProtoC(EchoA, ProtoC):
    pass

Re: Twisted: Protocol separation

Verfasst: Montag 5. September 2016, 14:37
von Hazzard
Danke, das ist wohl eine gute Möglichkeit. Ich fühle mich nur immer ein bisschen unsicher bei multiple inheritance ähnlichen Sachen. Aber bei Python scheint das ja im Gegensatz zu C++ etwas weniger fehleranfällig zu sein.

Re: Twisted: Protocol separation

Verfasst: Montag 5. September 2016, 14:56
von BlackJack
@Hazzard: Ich weiss nicht was bei Twisted so üblich ist, aber ich würde das gar nicht über Vererbung lösen, denn soweit ich das sehe *ist* ein `EchoA` kein `ProtocolB` sondern es *benutzt* das Protokoll. Das sieht mir eher nach Komposition aus. Die Du genau falsch herum gemacht hast.

Re: Twisted: Protocol separation

Verfasst: Montag 5. September 2016, 16:12
von DasIch
Vererbung für so etwas ist bei Twisted schon OK. Man implementiert dann halt ein Protocol MyProtocol welches dataReceived implementiert und selbst Methoden wie z.B. messageReceived oder so aufruft.

Genauso würde ich es hier auch machen wobei B und C sich eine API teilen müssen, die von A genutzt werden kann.

Re: Twisted: Protocol separation

Verfasst: Dienstag 6. September 2016, 03:44
von Hazzard
Ich hätte es auch lieber über Komposition gemacht, aber das ist aufgrund der Abhängigkeiten und callbacks von twisted nicht sehr schön. Mixins sind bisher die sauberste Variante finde ich. Ich hab ein noch ein bisschen rumgesucht und "Autobahn" (Websocket implementierung in Twisted) macht das auch über Mixins.