2016-07-04 7 views
6

मेरे पास मेरे आवेदन में सत्यापन की दो परतें हैं। सबसे पहले बीन सत्यापन API (उदाहरण के लिए आवश्यक फ़ील्ड) द्वारा निष्पादित इकाई सत्यापन है। दूसरा स्तर व्यापार तर्क सत्यापन है। उदाहरण के लिए, उपयोगकर्ता के पास एक पोस्ट है। केवल अगर वह इस पोस्ट और पोस्ट रेटिंग < 50. तो मैं इस तरह कुछ करने के लिए के एक निर्माता है उपयोगकर्ता एक पोस्ट हटा सकते हैं:व्यापार तर्क सत्यापन पैटर्न और सलाह

if (post.getCreator().equals(session.getUser())) { 
    if (post.getRating() < 50) { 
    postRepository.delete(post); 
    } else errors.add(400, "Cant delete post with rating 50 or higher") 
} else errors add (400, "You should be owner of the post") 

मैं इस तरह से पसंद नहीं है के रूप में इस सशर्त, पुन: उपयोग कर रहे हैं और मैं कोड डुप्लिकेट करना है। इसके अलावा, यदि सशर्त संख्या 5 से अधिक है या तो कोड को पढ़ने और समझने के लिए यह अवास्तविक हो जाता है।

इसके अलावा, मानक स्प्रिंग सत्यापनकर्ता के रूप में मैं विभिन्न कार्यों पर एक इकाई के लिए निर्माता अलग सत्यापन करने के लिए है (हटा सकते हैं और उदाहरण के लिए अद्यतन)

तो मैं यह करने के लिए एक तरह से तलाश कर रहा हूँ बहुत उपयोगी साबित नहीं होगा एक बेहतर तरीके से (शायद पैटर्न) और अगर कोई मुझे संकेत दे तो मैं बहुत आभारी रहूंगा।

अग्रिम धन्यवाद!

उत्तर

5

आप the strategy pattern का उपयोग कर सकते हैं। उदाहरण के लिए

@FunctionalInterface 
public interface ValidationCondition { 

    Optional<String> validate(final Post post, final Session session); 
} 

तो:

Post -> PostContext -> Optional<String> 

आप एक इंटरफेस के साथ इस का प्रतिनिधित्व कर सकते हैं:

प्रत्येक शर्त एक समारोह है कि एक पोस्ट और एक सत्र लेता है और एक त्रुटि वापस कर सकती है के रूप में तैयार किया जा सकता :

public class CreatorValidation implements ValidationCondition { 

    public Optional<String> validate(final Post post, final Session session) { 
     if (post.getCreator().equals(session.getUser()) { 
      return Optional.empty(); 
     } 
     return Optional.of("You should be owner of the post"); 
    } 
} 

फिर आप सूची में प्रत्येक सत्यापन को स्टोर कर सकते हैं:

final List<ValidationCondition> conditions = new ArrayList<>(); 

conditions.add(new CreatorValidation()); 
conditions.add(new ScoreValidation()); 
// etc. 

सूची का उपयोग करना, सत्यापन थोक में लागू किया जा सकता:

final List<String> errors = new ArrayList<>(); 

for (final ValidationCondition condition : conditions) { 
    final Optional<String> error = condition.validate(post, session); 
    if (error.isPresent()) { 
     errors.add(error.get()); 
    } 
} 

जावा 8 lambdas का उपयोग करना, आप इन इनलाइन की घोषणा कर सकता है:

final ValidationCondition condition = (post, session) -> { 
    // Custom logic 
}); 
2

रणनीति पैटर्न में समाधान है मेरी राय। मैं आपको एक बहुत ही सरल उदाहरण दूंगा। आइए कहें कि हमारे पास दो प्रकार के क्रेडिट कार्ड, वीज़ा और मास्टरकार्ड हैं। भुगतान संचालन करने का तर्क दोनों कार्डों के लिए समान है, लेकिन कार्ड नंबर सत्यापन अलग है। इसलिए, वर्कफ़्लो के माध्यम से VisaStrategy ऑब्जेक्ट को पास करके, वही तर्क और संचालन करता है जैसे हम मास्टरकार्डस्ट्रेटी पास करेंगे, एक चीज़ को छोड़कर - कार्ड नंबर सत्यापन, जो प्रत्येक परिभाषित रणनीति वर्ग के अंदर किया जाता है, इसलिए आपके पास कोई "अगर नहीं" सामान नहीं है आपका कोड बिल्कुल प्रत्येक रणनीति वर्ग अब एक और केवल एक प्रकार के कार्ड सत्यापन के लिए ज़िम्मेदार है। यदि आप कोड संरचना को बनाए रखने के लिए लचीला और आसान लग रहे हैं - रणनीति डिजाइन पैटर्न का उपयोग करें।

+0

क्या होगा अगर सत्यापन विधि के पैरामीटर शर्त से भिन्न होते हैं? आइए कहें वीजा कार्डनंबर एक पूर्णांक है और इसमें 4 अंकों का कोड भी है, लेकिन मास्टर कार्ड नंबर एक 16 अंकों का नंबर है? – ahmet

संबंधित मुद्दे