2016-07-27 1 views
0

j'ai un cas d'utilisation où il y aura trois types de donnéeslevel design de classe pour le moteur de validation avec 2 entités indépendantes

  1. Business_Enrollment_Program (permet de les représenter avec BEP_1, BEP_2 ...)
  2. Validation_Rule (permet de les noter avec R1, R2 ...)
  3. Transaction_Type (notons-les TT_1, TT_2 ...). C'est une classe d'entité ayant des attributs. Sur ces entités, Validation_Rule doit être exécutée.

entités TRANSACTION_TYPE ressemblera à quelque chose comme

public TT_1 { 
private Business_Enrollment_Program; 
private COMMON_FIELD_1; 
private COMMON_FIELD_2; 
private TT_1_SPECIFIC_FIELD; 
} 

public TT_2 { 
private Business_Enrollment_Program; 
private COMMON_FIELD_1; 
private COMMON_FIELD_2; 
private TT_2_SPECIFIC_FIELD; 
} 

Maintenant, j'ai 2 exigence lors de l'exécution des règles de validation:

  1. Jeu de Validation_Rule qui doivent être exécutés dépend de la TRANSACTION_TYPE et il est Business_Enrollment_Program. Cela signifie que pour TT_1 inscrit sous BEP_1, nous pourrions avoir besoin d'exécuter des règles (R1, R2), mais pour TT_1 inscrit sous BEP_2, nous pourrions avoir besoin d'exécuter des règles (R1, R3).

  2. Le comportement de la règle dépend de Transaction_Type et de Business_Enrollment_Program. Cela signifie que pour TT_1 inscrit dans le comportement BEP_1 de la règle R1 peut être différent par rapport à TT_1 inscrit sous BEP_2

Pour connaître les règles que je peux créer une structure comme ci-dessous:

Et je peux exécuter les règles comme ci-dessous

public processTransaction(T transactioType) { 
    private boolean result = true; 
    if(t instanceof TT_1) { 
     result = result && R1_For_TT_1.execute(t); 
    } 
    else if (t instanceof TT_2) { 
     result = result && R1_For_TT_1.execute(t); 
     result = result && R2_For_TT_1.execute(t); 
    } 

    if(result) { 
    // Do something 
    } 
    else { 
    // Do something else 
    } 
} 

problème avec cette approche est que je ne suis pas rencontrer mon 2ème exigence où je voulais le comportement de la règle à dépendre TRANSACTION_TYPE et il est Business_Enrollment_Progr un m.

Une idée comment puis-je organiser mes classes et entités afin que mes deux exigences soient remplies avec élégance?

+0

Vos 2 exigences sont les mêmes. Pouvez-vous montrer un peu plus de l'image? Je ne vois pas où ce retourné 'boolean' est utilisé. – 4castle

+0

@ 4castle Dans la première exigence, je veux décider quelles règles doivent être exécutées. Mais en deuxième exigence, le comportement de la même règle doit être modifié. Pour prendre en charge la deuxième exigence, vous pouvez penser à une règle validateTotalAmount. Maintenant, dans le cas d'une entité TT_1 liée à BEP_1 logique pour valider, totalAmount peut être différent de l'entité TT_1 associée à BEP_2 –

+0

Est-il possible que n'importe quel type de transaction soit exécuté sur un programme métier? – 4castle

Répondre

0

Je donnerais chaque BusinessEnrollmentProgram un Map<TransactionType, List<Rule>> comme champ, de sorte que vous puissiez organiser ce que les objets Rule vont avec chaque TransactionType. Il sera facile de rechercher quels Rule doivent être exécutés.

Il ressemblerait à quelque chose comme ceci:

BusinessEnrollmentProgram.java

public class BusinessEnrollmentProgram { 

    private Map<TransactionType, List<Rule>> transactions = new HashMap<>(); 

    public void processTransaction(TransactionType t) { 
     List<Rule> rules = transactions.get(t); 
     boolean result = true; 
     for (Rule rule : rules) { 
      if (!rule.execute(t)) { 
       result = false; 
       break; 
      } 
     } 
     if (result) { 
      // do something 
     } else { 
      // do something else 
     } 
    } 
} 

TransactionType.java

public class TransactionType { 
    private COMMON_FIELD_1; 
    private COMMON_FIELD_2; 

    // override hashCode() & equals() here so it can be used as a HashMap key 
} 

Ensuite, faire tous vos types de transactions extend TransactionType et autorisez votre Map à st toutes les relations pour lesquelles Rule est à haute voix avec laquelle TransactionType. Chaque BusinessEnrollmentProgram doit avoir un jeu de règles distinct à partir duquel il peut être tiré.

Si vous trouvez qu'il y a trop de classes qui s'étendent Rule, utilisez anonymous classes ou lambda expressions à la place.