2009-09-15 5 views
5

previous questionDr. Herbieからのコメントの1つは、私の方法が2つの責任を果たしているということでした。データを変更してデータを保存することでした。このコードの懸念事項を分ける最も良い方法は何ですか?

私が把握しようとしているのは、私の状況でこれらの懸念を分ける最善の方法です。

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 

//method in PolicyManager which has data access and update responsibility 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
    Update(policy); 
} 

の場合:次のようにNHibernateのを介して検索されたポリシーオブジェクトを持つことの私の例で上のキャリング

....

私は現在、非アクティブにポリシーを設定しています方法です私はデータアクセスとデータ更新の責任を分離することが最善の方法であろうか?

は、それが良い(DAOへのゲートウェイとして機能)のPolicyManagerポリシーオブジェクトの状態を管理することです:

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 
policyManager.Update(policy); 

//method in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
} 

またはポリシーオブジェクトを使用し、それは自身の状態だ維持し、持っているがデータベースに情報を保存するマネージャークラス:

私はどうなるのか
Policy policy = new Policy(); 
policy.Status = Active; 

policy.Inactivate(); 

policyManager.Update(policy); 

//method in Policy 
public void Inactivate() 
{ 
    this.Status = Inactive; 
} 

答えて

1

あらかじめ指定されたシーケンスを実行するためにファサード・メソッドを追加しながら:) ... 現在、あなたの最善の策は、第三の選択肢ですが、物事はより複雑に取得する場合、あなたは、第二に行くことができます:

Policy policy = new Policy(); 

policy.Status = Active; 

policyManager.InactivateAndUpdate(policy); 


//methods in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    // possibly complex checks and validations might be put there in the future? ... 
    policy.Status = Inactive; 
} 

public void InactivateAndUpdate(Policy policy) 
{ 
    Inactivate(policy); 
    Update(policy); 
} 

まだ実際の作業を行う方法は、別の問題(破損の種類メソッドのための単一の責任であることを可能にしながらInactivateAndUpdateは、呼び出し元のコードはほとんど滑らかな印象にするためにそこにあるファサード方法の一種でありますしかし、時にはあなたは実用的でなければなりません!)。私は意図的にX Yというスタイルでそのようなメソッドの名前をつけて、2つのことをするように目立たせます。

InactivateAndUpdateメソッドを使用すると、戦略パターンの実装を開始したり、動的処理のためのコマンドオブジェクトとして実際の実装メソッドを分割したり、将来可能になる可能性のあるその他のアーキテクチャを分割することができます。

3

  • ポリシーを保存および取得するリポジトリを作成します。 (PolicyRepository)

  • ポリシーをアクティブ/非アクティブにするために実行する必要がある複雑なロジックがある場合は、そのためのサービスを作成できます。そのサービスがデータベースにアクセスする必要がある場合は、必要に応じてPolicyRepositoryを渡すことができます。 複雑なロジックがなく、ポリシーのアクティブ化/非アクティブ化がフラグをfalseまたはtrueに設定するだけの場合、またはポリシークラスのメンバーのみが関与する場合、なぜアクティブ化されたのが単純なプロパティではないのですか? false/trueに設定できるポリシークラス? 他のオブジェクトが関与している場合、またはポリシーを有効または無効にするためにDBアクセスが必要な場合にのみ、サービスを作成します。

0

ステータスがPolicyクラスの状態の一部である場合、PolicyInactivateメソッドを持っている必要があります - それはちょうど基本的なカプセル化です。 1つの責任の中で複数のクラスをエンタングルすることは、少なくとも1つのクラスに複数の責任を与えることと同じくらい悪いことです。

また、ステータスがないPolicyではなくPolicyManagerに属する、Policyに関するメタデータと考えられます。しかし、その場合、Policyは自分のステータスを全く知ってはいけません。

1

私は間違いなくあなたが述べた理由のための第三のオプションとなるだろう:ポリシーオブジェクトは、それが自分の 状態だ維持し、その後 データベース

に情報を保存するためにマネージャークラス を使用

Repository Patternもご覧ください。 PolicyManagerの代わりに使用される可能性があります。私の元のコメントの続きとして

関連する問題