0

私はアプリケーション移行プロジェクトに携わっています。このアプリケーションは、現在のユーザー ロールに基づいていくつかのロジックを実行することになっているため、このようなスニペットはコードのいたるところにあります。

if ("Role1".equals(user.getUserRole())){
    operationVersionForRole1();
} else if ("Role2".equals(user.getRole())){
    operationVersionForRole2();  
} else if ("Role3".equals(user.getRole())){
    operationVersionForRole3();
}

約 5 つのロールとほぼ 50 の操作があり、一部のロールでは一部の操作が非常に複雑 (ほぼ 1000 行のコード) であるため、プログラミング スタイルによってソース コードが乱雑になり、理解が困難になります。そのような状況でソース コードを整理するのに役立つ既知の設計パターンはありますか? ネストされた「if-else」は、正しくありません。

4

3 に答える 3

3

具象クラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供するのは、 Abstract Factoryではありませんか? 指定されたロールは、具体的な実装を作成するための引数になります。また、インターフェースoperationVersionForRoleXの異なる実装または戦略として設計することもできIOperationます。

interface IOperation  
{ 
    void Execute();
}

class OperationVersionForRoleX : IOperation
{
    public void Execute()
    {
        // …
    }
}

string role = "roleX";
IOperation operation = operationFactory.Create(role);
operation.Execute();
于 2012-07-29T17:10:38.957 に答える
1

カサブランカが答えたものと同様です。

  • 私は通常、列挙型内のビジネス ロジックを避けます。列挙型の仕事は一意性にすぎず、他のすべてのクラスよりもほとんど劣っているためです。

    public enum Role {

    ROLE1 { public Actions getActions(){ return new Role1Actions() } },
    ROLE2 { public Actions getActions(){ return new Role2Actions() } },
    ROLE3 { public Actions getActions(){ return new Role3Actions() } };
    

    }

  • ロールごとに実行できる操作の種類と同じ数のメソッドを使用して Actions インターフェイスを作成します

パブリック インターフェイス アクション {

void action1();
// useful when there are more than 1 different actions per role
// even if only 1 now, there will be more in the future
vpod action2();
}
  • 次に、ロールから取得できるアクションを使用するだけです

    user.getUserRole().action1();

    user.getUserRole().action2();

于 2012-07-29T17:27:20.950 に答える
0

Operationすべての操作がスーパークラスを拡張しRole、文字列ではなく実際のオブジェクトである場合、次のようなことができます。

public abstract class Operation {
  public void execute(User user) {
    user.getRole().apply(this);
  }

  public abstract void operationForRole1();
  public abstract void operationForRole2();
  public abstract void operationForRole3();
}

public enum Role {
  ROLE1 { public void apply(Operation op) { op.operationForRole1(); } },
  ROLE2 { public void apply(Operation op) { op.operationForRole2(); } },
  ROLE3 { public void apply(Operation op) { op.operationForRole3(); } };

  public abstract void apply(Operation op);
}

次に、それぞれOperationがさまざまな役割のロジックを実装し、クライアントは単純に を呼び出しますoperation.execute(user)if-elseどこにもありません。

于 2012-07-29T17:07:44.567 に答える