2011-02-07 11 views
4

私はメッセージキューとして書いた単純なpub/subモジュールを使用するコンポーネントを持っています。私はRabbitMQのような他の実装を試してみたいと思います。しかし、このバックエンドの変更を構成可能にしたいので、実装とサードパーティのモジュールをクリーンアップとテストの間で切り替えることができます。Pythonアプリケーションでコンポーネントを混ぜ合わせる最も良い方法

明白な答えは、にあるように思わ:

  1. は、configファイル
  2. を読む修正設定が遅延し、指定の実装をロードするために、ターゲット・コンポーネントを変更/ dictの
  3. オブジェクトを作成します。

のようなもの:

# component.py 
from test.queues import Queue 

class Component: 

    def __init__(self, Queue=Queue): 
     self.queue = Queue() 

    def publish(self, message): 
     self.queue.publish(message) 

# queues.py 
import test.settings as settings 

def Queue(*args, **kwargs): 
    klass = settings.get('queue') 
    return klass(*args, **kwargs) 

ないinitはキュークラスに取る必要がある場合、私はそれが簡単にテストしながら、使用されるキューを指定する際に役立つだろう把握確認を。

私が持っていた別の考えは、http://www.voidspace.org.uk/python/mock/patch.htmlのようなものでしたが、それは乱雑になるようです。アップサイドは、スワップコンポーネントをサポートするためにコードを変更する必要がないということです。

他のアイデアや逸話はご了承ください。

EDIT:インデントを修正しました。

+0

コードのインデントを修正してください。 – unholysampler

答えて

2

私が前にしたことの1つは、それぞれの特定の実装が継承する共通クラスを作成することです。その後、簡単に実行できる仕様があります。各実装では、すべてのコードを繰り返すことを避けることができます。

これは悪い例ですが、セーバーオブジェクトに指定されたクラスを使用させることができ、残りのコードは気にしません。

class SaverTemplate(object): 
    def __init__(self, name, obj): 
     self.name = name 
     self.obj = obj 

    def save(self): 
     raise NotImplementedError 


import json 
class JsonSaver(SaverTemplate): 
    def save(self): 
     file = open(self.name + '.json', 'wb') 
     json.dump(self.object, file) 
     file.close() 

import cPickle 
class PickleSaver(SaverTemplate): 
    def save(self): 
     file = open(self.name + '.pickle', 'wb') 
     cPickle.dump(self.object, file, protocol=cPickle.HIGHEST_PROTOCOL) 
     file.close() 

import yaml 
class PickleSaver(SaverTemplate): 
    def save(self): 
     file = open(self.name + '.yaml', 'wb') 
     yaml.dump(self.object, file) 
     file.close() 


saver = PickleSaver('whatever', foo) 
saver.save() 
+0

私はあなたが言っていることを得る。 Saverをコンポーネントに追加し、Json、PickleSaver、およびYamlSaverの間で交換したい場合はどうなりますか? –

関連する問題