2015-12-06 8 views
1

Я новичок в программировании. У меня есть список объектов, которые я хочу проверить (а не короткое замыкание, но каждый из них выполняет список правил проверки).Лучший способ проверить объект в java

Первоначально у меня было огромное выражение if/else, но оно выглядело не очень красиво. Я думаю, что-то вроде этого было бы лучше:

foreach (object: objects) { 
    foreach (rule: validationRules) { 
    try { 
     rule.validate(object) 
    } catch { 
     // Write to log 
     // Increment counter for rule 
    } 
    } 
} 

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

Спасибо!

ответ

0

Ваш цикл - отличная идея.

Идея предиката зависит от того, является ли это полезным способом сделать то, что вы подразумеваете под проверкой. Я вообще советую людям не зацикливаться на конкретном способе мышления «должен использовать X», прежде чем начинать проблему. Планируйте использовать все, что является самым простым и/или наиболее эффективным, но сосредоточение внимания на конкретной функции приводит к своего рода «попыткам с помощью молотка».

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

+0

есть ли лучший способ написать этот цикл, используя функциональное программирование на Java 8? –

+0

Я немного старая школа и опыт, я научил меня, что код должен быть прост и понятен (принцип [KISS] (https://en.wikipedia.org/wiki/KISS_principle)). Это помогает ремонтопригодности и исправлению ошибок. Поэтому я считаю, что ваш простой метод цикла и правил - лучший выбор. Я не думаю, что любой другой подход был бы более эффективным. – StephenG

+0

Отлично, тогда я пойду с этим. Спасибо! –

0

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

public final class Validator { 
    private final List<Predicate<MyObject>> rules; 
    public final Validator(List<Predicate<MyObject>> rules) { 
     this.rules = rules; 
    } 

    public final validate(MyObject object) { 
     return rules.stream() 
        .map(Predicate::test) 
        .findAny(Boolean.FALSE).isPresent(); 
    } 
} 

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

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

+0

Спасибо! Я хотел бы сообщить о нескольких сбоях, зарегистрировав их, а затем увеличив счетчик на этот сбой. Есть ли лучший способ сделать это, чем другой? –

+0

Я собираюсь пойти с простой петлей, поскольку кажется, что она будет делать то, что я хочу, и красива и понятна. Я бы поднял ваш ответ, но у меня пока нет достаточной репутации! –

0

Я думал об использовании предикатов для проверки объектов в моем проекте, и я наткнулся на эту замечательную ссылку https://gtrefs.github.io/code/combinator-pattern/. По существу, После тщательного изучения учебника я переписал множество частей кода, который я написал. Прежде всего, правильное использование предикатов делает SRP выделяющимся, и это определенно способ продвижения вперед. Я написал простой валидатор с использованием предикатов для объектов и опубликовал его на https://github.com/Raveesh/QuickProgramsForFun/tree/master/javaValidators perhhaps вам будет полезно