Вопрос о дизайне - Java - что лучший способ к выполнению этого?

В Selenium для получения URL-адреса активной вкладки попробуйте

from selenium import webdriver

driver = webdriver.Firefox()
print driver.current_url # This will print the URL of the Active link

Отправив сигнал на изменение вкладки

driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)

и снова используйте

print driver.current_url

Я здесь просто предоставляю вам псевдокод.

Вы можете поместить это в цикл и создать свой собственный поток.

Я новичок в Stackoverflow, поэтому все еще учусь писать правильные ответы.

7
задан Jay 5 June 2009 в 08:59
поделиться

7 ответов

Вы думали об использовании аннотаций для отметки полей, которые вы хотите проверить в своем компоненте?

Если у вас есть 10 различных проверок, вы можете указать 10 аннотаций. Затем отметьте поля с помощью аннотаций:

@ValideStringIsCapitalCase
private String myString;

@ValidateIsNegative
private int myInt;

С помощью API отражения переберите все поля и посмотрите, помечены ли они, примерно так:

public static <T> validateBean(T myBean) throws IllegalAccessException {
    Field[] fields = myBean.getClass().getDeclaredFields();
    // This does not take fields of superclass into account
    if (fields != null) {
        for (Field field : allFields) {
            if (field.isAnnotationPresent(ValideStringIsCapitalCase.class)) {
                field.setAccessible(true);
                Object value = field.get(existingEntity);
                // Validate
                field.setAccessible(false);
            }
        }
    }
}

Можно пометить весь класс валидатором, который вы хотите использовать.

РЕДАКТИРОВАТЬ: не забудьте включить аннотацию:

@Retention(RetentionPolicy.RUNTIME)

для вашего интерфейса аннотаций.

РЕДАКТИРОВАТЬ2: пожалуйста, не изменяйте поля напрямую (как в примере выше).

8
ответ дан 6 December 2019 в 10:52
поделиться

Я, вероятно, неправильно понял вопрос, но мне бы хватило чего-то вроде этого:

public class ValidationMappings {
    private Map<Class, Class<Validation>[]> mappings = new HashMap<Class, Class<Validation>[]>();

    public ValidationMappings() {
            mappings.put(A.class, new Class[]{XYZValidation.class, ABCValidation.class});
            mappings.put(B.class, new Class[]{ABCValidation.class, PPPValidation.class});
    }

    public Class[] getValidators(Class cls) {
            if (!mappings.containsKey(cls)) return new Class[]{};
            return mappings.get(cls);
    }
}

Когда вы хотите получить список валидаторов для определенного класса, вы должны затем вызвать getValidators (Class cls) и перебрать каждый валидатор и создать экземпляр каждого и вызовите свой метод проверки.

3
ответ дан 6 December 2019 в 10:52
поделиться

Если вы просто хотите, чтобы он работал с любым объектом, то ваш интерфейс будет объектом

public boolean check (Object o);

Если вы не хотите использовать какой-либо интерфейс маркера для маркировки классов, подходящих для проверки

2
ответ дан 6 December 2019 в 10:52
поделиться

может быть что-то вроде этого?

interface Validation {
   public boolean check(Validatable x);
}

interface Validatable {
}


class A implements Validatable {
  ...
}

class Validator {
   public boolean validateObject(Validatable x){
      boolean validated = true;
      ... //read config file, check which validation classes to call
      //for each validation class v in the config file:
          if(!v.check(x)) validated = false;
      return validated;
   }
}
3
ответ дан 6 December 2019 в 10:52
поделиться

Возможно, вы имели в виду:

public interface Validation<T> {
    boolean check(T object)
}
2
ответ дан 6 December 2019 в 10:52
поделиться

Прежде всего, я бы использовал следующий интерфейс

interface Validator {
    boolean isValid(Object object);
}

, чтобы неявно задокументировать, что на самом деле означает возвращаемое значение.

Во-вторых, я бы предложил задокументировать в интерфейсе, какое поведение ожидается, если Валидатор не знает, как обрабатывать данный экземпляр.

interface Validator {
    /**
     * @return false if this validator detects that the given instance is invalid, true if the given object is valid or this Validator can't validate it.
     */
    boolean isValid(Object object);
}

Таким образом, у вас будет просто Список Валидаторов, в которые вы можете использовать свои объекты.

Влияние несовместимых Валидаторов на производительность должно быть незначительно, если они реализованы правильно, например, с ранним instanceof.

Кстати, я бы использовал список валидаторов вместо набора, чтобы вы могли упорядочить их по сложности. Поместите дешевые (с точки зрения производительности) валидаторы в начале списка для оптимизации.

Затем вы можете использовать общий фрагмент кода для проверки, например

public class Validators {
    public static boolean isValid(Object o, Collection<Validator> validators) {
        for(Validator current : validators) {
            if(!current.isValid()) return false;
        }
        return true;
    }
}

В зависимости от вашего варианта использования было бы неплохо вернуть в интерфейс что-то отличное от логического. Если вам нужна информация о , что неверно, например, чтобы отобразить его, вам нужно вместо этого вернуть эту информацию.

В этом случае было бы неплохо оставить цикл выше, чтобы вы будут получать все ошибки проверки, а не только первую.

0
ответ дан 6 December 2019 в 10:52
поделиться

Паттерн посетитель решит эту проблему

Вызов валидатора посетителя, можно получить следующее:


public interface Validatable {
  public boolean validate(Validator v);

}

public interface Validator {
  public boolean validate(A a);
  public boolean validate(B b);
}

public class A implements Validatable {

  public boolean validate(Validator v){
    return v.validate(this);
  }

}

public class B implements Validatable {

  public void validate(Validator v) {
    return v.validate(this);
  }

}

// Default validator just doesn't know how to 
// validate neither A's, nor B's
public class GenericValidator implements Validator {

  public boolean validate(A a) {
    throw new UnsupportedOperationException("Cannot validate A");
  }

  public boolean validate(B b) {
    throw new UnsupportedOperationException("Cannot validate B");
  }
}

// since XYZValidation is supposed to run only on A's
// it only overrides A validation
public class XYZValidation extends GenericValidator {
  public boolean validate(A a) {
     // validate a
     return isVAlid(a);
  }
}

// since ABCValidation is supposed to run on A's and B's
// it overrides A and B validation
public class ABCValidation extends GenericValidator {
  public boolean validate(A a) {
     // validate a
     return isVAlid(a);
  }

  public boolean validate(B b) {
     // validate b
     return isVAlid(b);
  }
}


// since ABCValidation is supposed to run only on B's
// it overrides A only B validation
public class PPPValidation extends GenericValidator {
  public boolean validate(B b) {
     // validate b
     return isVAlid(b);
  }
}
 
0
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: