Проверка лямбда-выражения Java 8 - PullRequest
0 голосов
/ 23 октября 2018

Я читал статью о проверке с использованием предикатов здесь .Я пытаюсь реализовать это в среде Spring Boot, где у меня есть некоторые вопросы.

В коде:

public class LamdaPersonValidator implements PersonValidator {

   public void validate(Person person) {
     notNull.and(between(2, 12)).test(person.getFirstName()).throwIfInvalid("firstname");
     notNull.and(between(4, 30)).test(person.getLastName()).throwIfInvalid("secondname");
     notNull.and(between(3, 50)).and(contains("@")).test(person.getEmail()).throwIfInvalid("email");
     intBetween(0, 110).test(person.getAge()).throwIfInvalid("age");
   }

 }

не упоминается, что может быть стандартным способом проверки, является ли объект person в методе validate сам по себе нулевым,Можно ли просто поставить нулевую проверку, например if(persone != null) { // notNull.and..}, или может быть лучший способ выполнить нулевую проверку.

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

Итак, что может быть лучшим подходом для использования этого при выполнении проверки из базы данных?

1 Ответ

0 голосов
/ 23 октября 2018

Мы не являемся судьями кодекса святой инквизиции, поэтому мы не обязаны сообщать вам, «нормально ли это просто поставить нулевую проверку».

Конечно, можно написатькак обычный оператор if, как мы это делали последние 25 лет, точно так же, как можно изобрести многословную структуру, инкапсулирующую проверку null и вводящую в нее термин «лямбда».Единственный оставшийся вопрос будет, если вы действительно намереваетесь написать if(person != null) { /* do the checks */ }, другими словами, разрешить null человеку пройти тест.

В случае, если вы хотите отказатьсяnull человек (что было бы более разумно), уже есть возможность написать это без явного теста, Objects.requireNonNull, начиная с Java 7, которая демонстрирует, что вам не нужно «вселучше с лямбдами »для достижения этой цели.Как правило, вы можете написать проверочный код разумно с помощью обычного кода, вопреки примеру статьи, используя простые инструменты, такие как оператор &&, и вставляя общий код в методы:

public void validate(Person person) {
    Objects.requireNonNull(person, "person is null");
    checkString(person.getFirstName(), "first name", 2, 12);
    checkString(person.getLastName(), "last name", 4, 30);
    checkString(person.getEmail(), "email", 3, 50);
    if(!person.getEmail().contains("@"))
        throw new IllegalArgumentException("invalid email format");
    checkBounds(person.getAge(), "age", 0, 110);
}
private void checkString(String nameValue, String nameType, int min, int max) {
    Objects.requireNonNull(nameValue, () -> nameType+" is null");
    checkBounds(nameValue.length(), nameType, min, max);
}
private void checkBounds(int value, String valueType, int min, int max) {
    if(value < min || value > max)
        throw new IllegalArgumentException(valueType+" is not within ["+min+" "+max+']');
}

Это так же, как ваш кодбез какой-либо структуры с «лямбда-выражением» в названии, все еще имея читаемый код проверки и позволяющий повторно использовать проверочный код.При этом вместо имени класса LamdaPersonValidator, которое отражает то, как вы его реализовали, вы должны использовать имена классов, отражающие обязанности класса.Понятно, что валидатор, отвечающий за проверку некоторых свойств объекта, не должен смешиваться с валидатором, проверяющим наличие сущности в базе данных.Последняя сама по себе является совершенно другой темой, и ее также следует задать самому себе.

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

Почему предполагается, что человек должен иметь имя и фамилию, и почему он предполагает, что имя должно содержать не менее двух и не более двенадцати символов, а фамилиядолжно быть от четырех до тридцати символов?

На самом деле это даже не символы, так как связь между char единицами и действительными символами не равна 1: 1.

Должно читаться для каждого программиста, думающегоо реализации проверки имен, это Falsehoods Программисты верят в имена (с примерами) .

Аналогично, Список проверенных пожилых людей из Википедии перечисляет сотню людей в возрастевыше 110.

И нет никаких оснований предполагать, что адрес электронной почты не может иметь большечем пятьдесят символов. истинная проверка правильности шаблона электронной почты может оказаться тем, что намеренно опущено ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...