Twisted: Protocol separation

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

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?
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
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

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.
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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Hazzard
User
Beiträge: 26
Registriert: Dienstag 4. Dezember 2007, 21:09

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.
Antworten