0

検証マップを注入する必要があるさまざまな StudentValidator クラス インスタンスを (指定されたパラメーターに基づいて) 作成することが想定されている抽象ファクトリ クラス StudentValidatorFactory があります (以下のコードを参照)。

public class StudentValidatorFactory{
    public static final int JUNIOR_STUDENT_TYPE = 1;

    public static final int SENIOR_STUDENT_TYPE = 2;

    public StudentValidator createStudentValidator(int studentType) throws StudentValidatorCreationException{
            Map<String,ValidationBean> validationMap = readValiationMapFromPersistentOrCachedStorage(studentType);
            switch (studentType){
                  case JUNIOR_STUDENT:
                      return new JuniorStudentValidator(validationMap);
                  case SENIOR_STUDENT:
                      return new SeniorStudentValidator(validationMap);
            }  
    }
}

public interface StudentValidator{
      void validate(Student student) throws StudentValidationException;
}


public class JuniorStudentValidator{
     private Map<String, ValidationBean> validationMap;           

     public JuniorStudentValidator(Map<String,ValidationBean> validationMap){
         this.validationMap = validationMap;
     }

     public void validate(Student student) throws StudentValidationException{
         // make use of validation map for apply junior student related validations on the student
     } 

}


public class SeniorStudentValidator{
     private Map<String, ValidationBean> validationMap;           

     public SeniorStudentValidator(Map<String,ValidationBean> validationMap){
         this.validationMap = validationMap;
     }


     public void validate(Student student) throws StudentValidationException{
         // make use of validation map for apply senior student related validations on the student
     } 

}

私の質問は、StudentValidatorFactory.createStudentValidator(int studentType)メソッドについて、永続ストレージからの検証マップの読み取り (学生タイプに基づく) を create メソッド内で行う必要があるかどうかです。そうでなければ、ファクトリはそのような実装の詳細について認識/依存する必要がありますか?

学生バリデータを作成するときに switch(studentType) ステートメントを回避する解決策があれば幸いです。私の頭の上のアイデアは、内部で管理されたマップを持ち、リフレクションを介して StudentValidator 具象クラスのインスタンス化を実行することです。

このような手法を使用する利点は、バリデーターのテストが (依存性注入によって) はるかに簡単になることです。

4

1 に答える 1

0

readValiationMapFromPersistentOrCachedStorage(studentType)分離されたサービスインターフェイスでを抽出し、プロパティまたはコンストラクター引数を使用しStudentValidatorServiceてサービスのインスタンスを挿入します。StudentValidatorFactory

public interface StudentValidatorService {
    Map<String,ValidationBean> getValidationMap(int studentType);
}

public class StudentValidatorFactory{
    public static final int JUNIOR_STUDENT_TYPE = 1;

    public static final int SENIOR_STUDENT_TYPE = 2;

    public StudentValidatorFactory(StudentValidatorService studentValidatorService) {
        this.studentValidatorService = studentValidatorService;
    }

    public StudentValidator createStudentValidator(int studentType) throws StudentValidatorCreationException{
            Map<String,ValidationBean> validationMap = studentValidatorService.getValidationMap(studentType);
            switch (studentType){
                  case JUNIOR_STUDENT:
                      return new JuniorStudentValidator(validationMap);
                  case SENIOR_STUDENT:
                      return new SeniorStudentValidator(validationMap);
            }  
    }
}

StudentValidatorServiceこれで、データベースに裏打ちされた実装を作成できます。または、テスト用のモック実装を作成することもできます。これで、実装は使用法から切り離されました。


switch-caseを削除するには、列挙型を使用してスイッチケースを反転します。

public enum StudentType {
    JUNIOR_STUDENT {
        public StudentValidator getValidator(Map<String,ValidationBean> validationMap) {
            return new JuniorStudentValidator(validationMap);
        }
    },
    SENIOR_STUDENT {
        public StudentValidator getValidator(Map<String,ValidationBean> validationMap) {
            return new SeniorStudentValidator(validationMap);
        }
    };

    public abstract StudentValidator getValidator(Map<String,ValidationBean> validationMap);
}

public class StudentValidatorFactory{

    public StudentValidatorFactory(StudentValidatorService studentValidatorService) {
        this.studentValidatorService = studentValidatorService;
    }

    public StudentValidator createStudentValidator(StudentType studentType) throws StudentValidatorCreationException{
            Map<String,ValidationBean> validationMap = studentValidatorService.getValidationMap(studentType);
            return studentType.getValidator(validationMap);
    }
}
于 2011-12-20T12:45:44.173 に答える