2015-12-06 2 views
1

Je débute en programmation. J'ai une liste d'objets que je veux valider (pas court-circuiter, mais exécuter une liste de règles de validation par chacun). Au début, j'avais une énorme déclaration if/else, mais elle ne semblait pas très jolie. Je pense que quelque chose comme ça serait mieux:La meilleure façon de valider un objet en Java

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

Je ne sais pas comment créer les règles de validation. Je voudrais utiliser les prédicats Java 8 parce que j'entends que c'est ce que je devrais utiliser, mais je ne suis pas sûr de savoir comment s'y prendre. Je pense que je pourrais créer une interface avec les règles et ensuite une implémentation avec chaque règle définie et aussi la liste des règles. Cela semble-t-il un bon moyen de résoudre ce problème?

Merci!

Répondre

0

Votre boucle for est une très bonne idée. L'idée de prédicat dépend si c'est une manière utile de faire ce que vous voulez dire par validation. Je conseille généralement aux gens de ne pas s'enfermer dans un mode de pensée particulier «doit utiliser X» avant de commencer un problème. Prévoyez d'utiliser ce qui est le plus simple et/ou le plus efficace, mais en vous concentrant sur une caractéristique spécifique, vous obtenez une sorte de mentalité «essayant de visser avec un marteau». Les prédicats n'exigeraient pas de boucle, mais ne seraient pas, je pense, un bon choix pour les performances, car ils créeraient de nouvelles collections d'objets si vous les utilisiez pour filtrer, ce qui est une opération potentiellement coûteuse. Une règle simple qui est une méthode (comme le montre votre propre croquis) semble plus simple, à la fois conceptuellement et à maintenir en tant que code.

+0

Y a-t-il un meilleur moyen d'écrire cette boucle en utilisant la programmation fonctionnelle de Java 8? –

+0

Je suis un peu old school et l'expérience m'a appris que le code doit être clair et simple (le [principe KISS] (https://en.wikipedia.org/wiki/KISS_principle)). Cela facilite la maintenabilité et la correction des bogues. Donc, je pense que votre simple méthode de boucle et de règle est un meilleur choix. Je ne pense pas qu'une autre approche serait plus efficace non plus. – StephenG

+0

Super, je vais aller avec ça alors. Je vous remercie! –

0

Je pense que vous pouvez utiliser Predicate pour implémenter vos règles. Parce que Predicate est une méthode abstraite unique, un simple lambda peut être utilisé pour l'implémenter, et votre validateur peut être amorcé avec une liste de Predicate s.

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(); 
    } 
} 

Et vous pouvez initialiser la classe avec tout ce dont vous avez besoin en tant que lambdas.

La question est alors de savoir si vous voulez collecter des pannes à partir de plusieurs pannes, les rapporter toutes ensemble ou simplement arrêter la première panne. Il y a un certain nombre d'options en fonction de votre situation. Vous pouvez utiliser des exceptions ou transmettre une sorte de collecteur d'échec.

+0

Merci! Je souhaite signaler plusieurs échecs en les enregistrant puis en incrémentant le compteur pour cet échec. Y a-t-il une meilleure façon de faire cela qu'une autre? –

+0

Je vais aller avec le simple pour boucle car il semble qu'il fera ce que je veux et est agréable et lisible. Je rehausse ta réponse mais je n'ai pas encore assez de réputation! –

0

Je pensais utiliser des prédicats pour valider des objets dans mon projet et je suis tombé sur ce merveilleux lien https://gtrefs.github.io/code/combinator-pattern/. Essentiellement, Après avoir suivi le tutoriel de près, j'ai modifié beaucoup de parties du code que j'ai écrit. Principalement, l'utilisation appropriée des prédicats fait ressortir le SRP et c'est certainement le moyen d'aller de l'avant. J'ai écrit un simple validateur en utilisant des prédicats pour les objets et je l'ai publié à https://github.com/Raveesh/QuickProgramsForFun/tree/master/javaValidators peut-être qu'il vous sera utile