6

前の質問で、受け入れられた回答に対するDr. Herbieからのコメントの 1 つは、私の方法は、データの変更とデータの保存という 2 つの責任を実行していたというものでした。

私が理解しようとしているのは、私の状況でこれらの懸念を分離する最良の方法です。

NHibernate を介して取得される Policy オブジェクトを持つ私の例を続けます....

現在、ポリシーを非アクティブに設定している方法は次のとおりです。

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);
}

データ アクセスとデータ更新の責任を分離するとしたら、どのように実行するのが最善でしょうか?

PolicyManager (dao へのゲートウェイとして機能する) で Policy オブジェクトの状態を管理する方がよいでしょうか。

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 オブジェクトに独自の状態を維持させてから、manager クラスを使用して情報をデータベースに保存するには:

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

policy.Inactivate();

policyManager.Update(policy);

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

4 に答える 4

3

私がすること:

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

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

于 2009-09-15T07:41:47.680 に答える
1

私の元のコメントの続きとして:) ...現在、最善の策は3番目のオプションですが、物事がより複雑になる場合は、事前に指定されたシーケンスを実行するファサードメソッドを追加しながら、2番目のオプションを使用できます。

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 メソッドを使用すると、戦略パターンの実装を開始したり、実際の実装メソッドを動的処理用のコマンド オブジェクトとして分割したり、将来的に実現可能になる可能性のある他のアーキテクチャを作成したりできます。

于 2009-09-15T08:38:51.670 に答える
1

あなたが言及した理由から、私は間違いなく3番目のオプションを使用します。

Policy オブジェクトは独自の状態を維持し、マネージャ クラスを使用して情報をデータベースに保存します。

リポジトリ パターンも参照してください。それはあなたの代わりになるかもしれませんPolicyManager

于 2009-09-15T07:50:50.033 に答える
0

Policyステータスがクラスの状態の一部である場合、 にPolicyInactivateメソッドが必要です。これは単なる基本的なカプセル化です。複数のクラスを 1 つの責任に巻き込むことは、少なくとも 1 つのクラスに複数の責任を与えるのと同じくらい悪いことです。

または、ステータスは、 ではなく に属する、 に関するメタデータと見なすこともできます。ただし、その場合、 は自身のステータスをまったく認識してはなりません。PolicyPolicyPolicyManagerPolicy

于 2009-09-15T07:49:44.420 に答える