Как написать собственные проверки / валидации для игровой платформы

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

Я пытаюсь написать чеки для play-framework и вижу две разные возможности. Я описал оба и хочу знать, правильно ли я понимаю (так что это больше учебник, чем вопрос, особенно потому, что я не получил никакого ответа, что я что-то пропустил).

Я пытаюсь написать чеки для play-framework и вижу две разные возможности. Я описал оба и хочу знать, правильно ли я понимаю (так что это больше учебник, чем вопрос, особенно потому, что я не получил никакого ответа, что я что-то пропустил). Итак, какие возможности существуют.

  1. Простой способ: расширение класса Проверить :
    Преимущества: легче писать, легче читать
    Недостатки: невозможно параметризовать проверку, можно только определить сообщение.
  2. Расширенный способ: написание проверки на основе OVal AbstractAnnotationCheck .
    Преимущества: вы можете параметризовать проверку и получить более простую в использовании аннотацию
    Недостатки: немного сложнее.

Прежде чем мы рассмотрим реализацию, я хочу объяснить сообщения. Вы всегда можете установить сообщение напрямую или использовать ключ для ссылки на сообщение в свойствах сообщения. Последний - более чистый и рекомендуемый способ. Каждая проверка получает как минимум 1 параметр: имя недействительного свойства. Таким образом, для проверки или проверки конкретных параметров всегда используется % i $ s , где i> 1. Формат строки сообщения должен соответствовать правилам Formatter , но я не уверен, все ли функции поддерживаются. Насколько мне известно, только% s,% d и% f поддерживаются вместе с позиционированием. Итак, % [аргумент_индекс $] [флаги] преобразование , где преобразование может быть только s, d или f.

Давайте посмотрим на два примера: Простой способ, который я использовал в своем модуле для оптимистической блокировки:

/**
 * Check with proof if the version of the current edited object is lesser
 * than the version in db.
 * Messagecode: optimisticLocking.modelHasChanged
 * Parameter: 1 the request URL.
 * Example-Message: The object was changed. Reload and do your changes again.
 *
 */
static class OptimisticLockingCheck extends Check {

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isSatisfied(Object model, Object optimisiticLockingViolatedValue) {
        //The comparision of version was made in the setter. Here
        //we only have to check the flag.
        if (((VersionedModel) model).optimisiticLockingViolated) {
            final Request request = Request.current();
            //The following doesn't work in 1.0 but in 1.1 see https://bugs.launchpad.net/play/+bug/634719
            //http://play.lighthouseapp.com/projects/57987-play-framework/tickets/116
            //setMessage(checkWithCheck.getMessage(), request != null ? request.url : "");
            setMessage("optimisticLocking.modelHasChanged", request != null ? request.url : ""); 

        }
        return !((VersionedModel) model).optimisiticLockingViolated;
    }
}

Вы используете эту проверку с аннотацией @CheckWith (value = OptimisticLockingCheck.class, message = "optimisticLocking.modelHasChanged")

Итак, давайте поближе посмотрите как это работает. Единственное, что нам нужно сделать, это расширить класс play.data.validation.Check и перезаписать метод isSatisfied. Там вы получите вашу модель и стоимость свойств. Все, что вам нужно сделать, это вернуть true, если все в порядке, или false в противном случае. В нашем случае мы хотим установить текущий URL-адрес в качестве параметра. это можно легко сделать, вызвав setMessage (). Мы даем сообщение или ключ сообщения, который определяется в свойствах и параметрах сообщения. Помните, что мы даем только 1 параметр, но он упоминается как% 2 $ s, потому что первым параметром всегда является имя свойства.

Теперь сложный способ, основанный на проверке диапазона воспроизведения: Сначала нам нужно определить Annotation

/**
 * This field must be lower than and greater than.
 * Message key: validation.range
 * $1: field name
 * $2: min reference value
 * $3: max reference value
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(checkWith = RangeCheck.class)
public @interface Range {

    String message() default RangeCheck.mes;
    double min() default Double.MIN_VALUE;
    double max() default Double.MAX_VALUE;
}

, а затем Check

@SuppressWarnings("serial")
public class RangeCheck extends AbstractAnnotationCheck {

    final static String mes = "validation.range";

    double min;
    double max;

    @Override
    public void configure(Range range) {
        this.min = range.min();
        this.max = range.max();
        setMessage(range.message());
    }

    public boolean isSatisfied(Object validatedObject, Object value, OValContext context, Validator validator) {
        requireMessageVariablesRecreation();
        if (value == null) {
            return true;
        }
        if (value instanceof String) {
            try {
                double v = Double.parseDouble(value.toString());
                return v >= min && v <= max;
            } catch (Exception e) {
                return false;
            }
        }
        if (value instanceof Number) {
            try {
                return ((Number) value).doubleValue() >= min && ((Number) value).doubleValue() <= max;
            } catch (Exception e) {
                return false;
            }
        }
        return false;
    }

    @Override
    public Map createMessageVariables() {
        Map messageVariables = new TreeMap();
        messageVariables.put("2-min", Double.toString(min));
        messageVariables.put("3-max", Double.toString(max));
        return messageVariables;
    }

}

OK. Я думаю, что аннотацию не нужно объяснять. Давайте посмотрим на чек. В этом случае он расширяет net.sf.oval.configuration.annotation.AbstractAnnotationCheck . Нам нужно написать метод конфигурации, в котором мы получаем аннотацию и можем копировать параметры. Затем мы должны определить нашу проверку. Что аналогично реализации другой проверки. Таким образом, мы пишем только наше условие и возвращаем true или false, кроме одной специальной строки! Если мы использовали параметризованное сообщение, мы должны вызвать requireMessageVariablesRecreation (); в нашем методе. По крайней мере, мы должны переопределить метод createMessageVariables . Здесь мы должны получить небольшое игровое знание (все остальное описано здесь ). Вы помещаете свои сообщения на карту с ключом и значением, но play принимает только значения (см. ValidCheck.java в коде фреймворка). Таким образом, на него будет ссылаться позиция. По этой причине я изменил реализацию RangeCheck , используя TreeMap вместо HashMap . Кроме того, я позволил ключам начинаться с индекса, на который они могут ссылаться.

Так что я надеюсь, что это проясняет, как писать собственные проверки / проверки для игры. Надеюсь описание верное. $ list = explode ("*", $ dataList); эхо "

"; print_r ($ список); эхо "

"; который выводит:> Массив ( > [0] =>> [1] => ...

У меня есть это:

$dataList = "*one*two*three*";
$list = explode("*", $dataList);
echo"
";print_r($list);echo"
";

, который выводит:

> Array (
>     [0] => 
>     [1] => one
>     [2] => two
>     [3] => three
>     [4] =>  )

Как снять первый и последний * в строке перед взрывом?

23
задан NikiC 11 September 2010 в 09:58
поделиться