2012-03-06 14 views
2

私はRESTクライアントライブラリに取り組んでいます。最近、バッチメッセージを送信するためのサポートを追加する作業を開始しました。同じシグネチャのメソッドを含む2つのPythonクラスを統合するには?

しかし、私は現在のデザインが好きではありません。同一のメソッドシグネチャで大きなClientおよびRequestMessageクラスを維持する必要があります。

私は2つのクラスを統合する方法を探しています。

元Clientクラスのメソッドは、要求準備し、送信するために必要なすべてのコードを含んでいた:

class Client(object): 

    def __init__(self, config): 
     self.request = Request(config, "application/json") 

    def create_vertex(self, data): 
     path = "vertices" 
     params = remove_null_values(data) 
     self.request.post(path, params) 

バッチメッセージのサポートを追加するには、私は、各クライアントのメソッド内のコードの中身を取り出して、あなたは準備が整うまで、あなたが、それを送信せずにバッチにメッセージを追加することができるように個別の要求メッセージクラスにそれを置く:

class Client(object): 

    def __init__(self, config): 
     self.request = Request(config, "application/json") 
     self.message = RequestMessage(config) 

    def create_vertex(self, data): 
     message = self.message.create_vertex(data) 
     return self.request.send(message) 

    # ...more REST client methods... 

    def batch(self, messages): 
     path = "batch" 
     params = messages 
     return self.request.post(path, params)  

class RequestMessage(object): 

    def __init__(self, config): 
     self.config = config 

    def create_vertex(self, data): 
     path = "vertices" 
     params = remove_null_values(data) 
     return POST, path, params 

    # ...more REST client methods... 

しかし、今あなたがクライアントを維持する必要があるため、私はデザインが好きではありませんとRequestMessageクラス - 2つの大きなクラスsと同じ署名を持つ。

はここでバッチクラスは次のようになります。

class Batch(object): 

    def __init__(self, client): 
     self.client = client 
     self.messages = [] 

    def add(self, message): 
     self.messages.append(message) 

    def send(self): 
     return self.client.batch(self.messages) 

ここでは、サーバー上の頂点を作成するための使用例です:

>>> client = Client(config) 
>>> vertex = client.create_vertex({'name':'James'}) 

ここでは、サーバー上の頂点のバッチを作成するための使用例を示します:

>>> message1 = client.message.create_vertex({'name':'James'}) 
>>> message2 = client.message.create_vertex({'name':'Julie'}) 
>>> batch = Batch(client) 
>>> batch.add(message1) 
>>> batch.add(message2) 
>>> batch.send() 

バッチはクライアントよりも頻繁に使用されないので、 rmalクライアントインターフェイスを使用するのが最も簡単です。

ここに1つのアイデアですが、私はそれを達成するためにどのように非常にわからないか、何か他のものが良いだろうとします

>>> vertex = client.create_vertex(data) 
    >>> message = client.create_vertex(data).message() 

答えて

1

私の個人的な好みのようなAPIです:

client.create_vertex({'name':'James'}) # single 
client.create_vertex([{'name':'James'}, {'name':'Julie'}]) # batch 

ことあなたはまったく同じ機能を使いながら、もっとデータを与えているだけです。一般的な使用方法は、おそらくより次のようになります。

batch = [] 
batch.append({'name':'James'}) 
batch.append({'name':'Julie'}) 
client.create_vertex(batch) 
+0

こんにちはカール - バッチは、別のコマンドを含めることができる必要があります - create_vertex、create_edge、index_vertex。クライアントでバッチモードを設定する方法を見ていきます。 – espeed

+0

ええ、クライアントをサブクラス化してBatchClientを作成し、各リクエストをただちに送信するのではなく、バッチリストにコマンドを追加することができます。 – espeed

1

私はいくつかの変更

client.create_vertex({'name':'James'}) # single 
client.create_vertex({'name':'James'}, {'name':'Julie'}) # batch 

batch = [] 
batch.append({'name':'James'}) 
batch.append({'name':'Julie'}) 
client.create_vertex(*batch) 

で@Karlで、あなたの入力の種類を確認する必要はありません。そのように同意するだろう。簡単に書くことができ、使いやすくなっています。

関連する問題