2017-05-18 4 views
0

私はお互いに結合されたいくつかのクラスを持っており、その中に冗長性を最小限に抑える設計をしたいと思います。合成クラスを持つ結合クラスの冗長計算を保存する方法

デザインは以下の通りです。クラスは、D

  • Cである
  • AC、AD:(A、C)と(A、D)の組成物は全てのクラスが同じで初期化さ

各クラスはいくつかの計算を実行し、独自の結果を保存します。具体的には、ユーザーはA、AC、ADのインスタンスを作成しますが、CとDは作成しません。つまり、A、AC、ADは同様のもので統一されたインターフェイスを持ちます。ここで論理は、たとえば、Aの結果をAから除外しない限り、Cの結果は有用ではないということです。ユーザがAとAC(またはACおよびAD、または他の組み合わせ)のインスタンスを作成する場合、Aの計算が複数回行われ、現在の設計で

class A(object): 
    def __init__(self, data): 
     # some work 
    def postproc(self, *args): 
     # some real work 
     self.result = .. 

class AC(object): 
    def __init__(self, data): 
     self.a = A(data) 
     self.c = C(data) 
    def postproc(self, *args): 
     result_a = self.a.postproc(*args[:3]) 
     result_c = self.c.postproc(*args[3:]) 
     self.result = exclude_c_from_a(result_a, result_c) 

を次のようにいくつかのモックアップコードです。冗長な計算をしたくない、デザインをどのように変更する必要がありますか?

もう少し詳しく説明します。異なる初期データを持つAの複数のインスタンスもあります。したがって、Aインスタンスが1つしかないことを保証するためにシングルトンを使用することはできません。

+0

コードを投稿してください。 – James

+1

あなたが探しているように聞こえるのは、内部キャッシングメカニズムを備えたファンクタです –

答えて

1

最後に解決策としてメモを使用しました。

def memoize(func):                 
    """                    
    Decorator for memoization. Note the func arguments need to be hashable.   

    @type func: a callable               
    """                    
    memo = func.memo = {}                                    
    @wraps(func)                  
    def wrapper(*args):                
     if args not in memo:               
      memo[args] = func(*args)             
     return memo[args]               
    return wrapper 

そしてそれは、クラス定義

@memoize 
class A(object): 
    def __init__(self, arg1, arg2): 
     ... 

同じ入力引数のために、唯一のインスタンスが作成されるように飾ることができます。

0

デザインをどのように変更する必要がありますか?

  1. あなたは、コンストラクタでAとCをインスタンス化する必要がないようにするだけACのコンストラクタにAとCを渡します。
  2. データをAのコンストラクタに渡さないでください。代わりに、Aのコンストラクタに結果を渡してください。依存関係を設定する以外のコンストラクタでの作業は避けてください。
  3. 結果の計算のみを担当するクラスを作成します。
関連する問題