2012-04-06 7 views
2

ここに状況があります。私はそれを必要とするか、または私は単にエージェントのコンストラクタにTransportオブジェクトを渡すべきである方法のためのエージェント方法に私のトランスポート・オブジェクトを渡すべきである -オブジェクトをメソッドやコンストラクタ経由で他のオブジェクトに渡す?

class Agent: 
    def __init__(self): 
     self.blah = whatever 
     self.boo = thingy 

    def doA(self, transport): 
     res = transport.doX(self.blah) 

    def doB(self, transport): 
     res = transport.doY(self.boo) 

class Transport: 
    def __init__(self): 
     self.bah = weee 

    def doX(self, item): 
     #.. do some other stuff here 

    def doY(self, item): 
     #.. do some more stuff here 

は、私の質問は:私は、以下の疑似クラスを持っていますメソッド内から呼び出すことができますか?すなわち

transport = Transport() 
agent = Agent(transport) 
class Agent: 
    def __init__(self, transport): 
     self.blah = whatever 
     self.transport = transport 

    def doA(self): 
     res = self.transport.doX(self.blah) 

私はそれ自身のクラスへの輸送を行う移動の理由は次のとおりです。

1)エージェント・インスタンスが同じトランスポート・オブジェクトを共有することができます - すなわち:私は唯一のエージェントのセットに対して1つのトランスポート・オブジェクトが必要です。私は複数のトランスポートを持つことができます(agentsA..Nの場合は1つ、agentsO..Zの場合は別)。

2)トランスポートには、エージェントのリストを引数として取るメソッドが含まれています。例えば、エージェントオブジェクトのリストが与えられている場合、エージェントに対して同時通信テストを実行することができます。

しかし、エージェント自体には、エージェントクラスに属していると分かりやすいメソッド(リモートでエージェントを再起動するなど)のトランスポート(SSL証明書の場所など)に設定されている属性が必要なことがあります。

エージェントのリストを必要とするメソッドを、トランスポートのクラスメソッドに移動し、トランスポートインスタンスを含むエージェントオブジェクトで属性を作成する必要がありますか。私がやっていることを続けて、Transportオブジェクトを特定のAgentオブジェクトメソッドに渡すように要求するだけですか?私はこれを何らかの方法でリファクタリングして、私が見ていないのだろうか?

ご意見、ご協力をお待ちしております。

+0

あなたは壊すために別の層の結合があるように思えます。 –

+0

1)同じエージェントが複数の異なる輸送手段で動作することはありますか? 2)エージェントは、輸送手段が接続される前に有用な何かをすることができますか? 3)輸送機関は、エージェントが接続される前に有用な何かをすることができますか? – max

+0

イグナシオ、私は同意する - しかし、私はそれらをどのように分離するのか分からないので、私はこれを求めている。 – sjmh

答えて

3

エージェントのコンストラクタにトランスポートを引数として追加することも考えているので、1つのエージェントが複数のトランスポートで動作しないと仮定します。

トランスポートインスタンスは、エージェントが接続されていない状態で便利なことができると想定しています(逆も同様です)。

私の仮定が正しいならば、私はこれを提案する:あなたがオブジェクトを削除することを計画している場合、あなたは交通機関にどちらかのエージェントからの弱い参照を使用して、または他の方向にガベージコレクタを支援する必要があるかもしれません

class System: 
    def associate_transport_and_agent(transport, *agents): 
    for agent in agents: 
     transport.add_agents(*agents) 
     agent.set_transport(transport) 

class Transport: 
    def __init__(self): 
    self.bah = weee 
    self.agents = set() 
    def add_agents(self, *agents): 
    self.agents.update(agents) 
    def remove_agent(self, agent): 
    self.agents.remove(agent) 
    def doX(self, item): 
    # ... 


class Agent: 
    def __init__(self): 
    self.blah = whatever 
    self.transport = None 
    def set_transport(self, transport): 
    if self.transport == transport: 
     return 
    if self.transport is not None: 
     self.transport.remove_agent(self) 
    self.transport = transport 

    def doA(self): 
    res = self.transport.doX(self.blah) 

(実際には、あなたのケースでは双方向で、おそらく他の場所への強い参照を含んでいるため)。

EDIT:

エージェントが自分のトランスポート変更される可能性があることを反映するために更新:チェックするAgent.set_transportをTransport.remove_agent

  • 追加、変更
  • エージェントのセットに薬の

    • 変更されたリストを前に既に設定されていた場合
  • +0

    エージェントは1つのトランスポートでしか動作できませんが、トランスポートは切り替えられます。これは実際には大規模なサーバー/クライアントアーキテクチャのAPIなので、いいえと言います。私は便利な何かをするためにエージェントに連絡するために輸送手段を使わなければなりません。私が輸送を移動させた唯一の理由は、同時にいくつかのエージェントにまたがって動作していた方法のためでした。そのようなロジックをエージェント内に保つこと(つまり、あるエージェント内のメソッドを使用して、それ自身や他のエージェントに影響を与える)という考え方は本当に間違っていたようです。私は上記のようなものを試してみます。 – sjmh

    +0

    これを反映するようにコードを更新しました。 – max

    0

    「エージェントは、あなたは__init__に(オプションの)パラメータを持ち、トランスポートを設定し、エージェントのトランスポート属性をパブリックにすることをお勧めします。代入時にコードを実行する必要がある場合は、プロパティを作成します。

    関連する問題