2012-02-17 5 views
8

एक लंबा शीर्षक की तरह, लेकिन यह आम तौर पर सवाल है।क्या आवेदन तर्क से रक्षात्मक जांच को हटाने के लिए पहलुओं का उपयोग करना एक अच्छा विचार है?

मुझे पता है कि यदि आप निम्न कार्य करने के लिए अपने एक अच्छा विचार लगता है चाहता हूँ।

public void buyItem(int itemId, int buyerId) { 
    if (itemId <= 0) { 

     throw new IlleglArgumentException("itemId must be positive"); 
    } 
    if (buyerId <= 0) { 

     throw new IlleglArgumentException("buyerId must be positive"); 
    } 
    // buy logic 
} 

मैं की तरह कुछ करना चाहते हैं:

बजाय

@Defensive("isPositive(#itemId, #buyerId)") 
public void buyItem(int itemId, int buyerId) { 
    // buy logic 
} 

क्या आपको लगता है यह अच्छा/भयानक/भी फैंसी/बहुत धीमी है? यदि आप वास्तव में अच्छा सोचते हैं तो मैं इसे लागू करने के लिए SpEL का उपयोग करने की सोच रहा था, क्या किसी के पास कुछ बेहतर/हल्का/तेज है?

धन्यवाद,

उत्तर

3

यह जरूरी एक बुरी बात है लेकिन अपने सरल मामले में अच्छी तरह से अपवाद बयान (rather than assertions जो मैं शुरू में उल्लेख किया है) के साथ हल किया जा सकता नहीं है।

यह आप एनोटेशन जो अपनी परियोजना में अन्य डेवलपर्स स्वीकार करते हैं और के लिए अनुकूल होना चाहिए की अपनी सेट शुरू कर रहे है। हालांकि, एक बार जब आप एनोटेशन पेश कर लेते हैं, तो ऐसा लगता है कि इस मुद्दे को हल करने के लिए नियमित Proxy दृष्टिकोण बेहतर उम्मीदवार होगा।

समेकित करने के लिए: आपके द्वारा वर्णित समस्या को मानक जावा विकल्प का उपयोग करके आसानी से हल किया जा सकता है, हालांकि अधिक जटिल मामले में इसे उचित ठहराया जा सकता है (उदाहरण के लिए, @Secured वसंत-सुरक्षा में), खासकर यदि आप अपना खुद का विकास कर रहे हैं ढांचा

+0

और यह एनोटेशन के अंदर किसी अन्य भाषा का परिचय । –

+0

असल में यह सवाल मेरे सिर में 'सुरक्षित' का उपयोग करने के दुष्प्रभाव के रूप में मिला। लेकिन चूंकि हम पहले से ही विधि स्तर सुरक्षा के लिए '@ सुरक्षित 'का उपयोग करते हैं, इसलिए यह आईएमओ को डिफेंसिव चेक के लिए उपयोग करने में भ्रमित होगा, इसलिए मैं इसे करने के विचारों के बारे में पूछ रहा हूं और चूंकि' सुरक्षित' और 'प्रीअधिकृत' का उपयोग SPEL I सोचा कि स्पष्ट पसंद है। – Simeon

+0

डाउनवोट क्यों? – Simeon

2

मुझे लगता है कि यह

  • overengineering
  • कैप्सूलीकरण तोड़ने (कि या वहाँ नहीं हो सकता है हो सकता है) वस्तु
  • भ्रमित की अपरिवर्तनशीलताओं बनाए रखने के लिए एक बाहरी पहलू पर भरोसा द्वारा, है
  • नहीं
  • कुशल
  • कोई मूल्य नहीं जोड़ना

मुझे ऐसे चेक के लिए Guava's Preconditions क्लास का उपयोग करना पसंद है। इसके अलावा, इस तरह के चेक व्यापार तर्क, आईएमएचओ का हिस्सा हैं।

+0

चाहे यह व्यावसायिक तर्क है या नहीं, व्यक्तिपरक है (शायद ... मुझे यकीन नहीं है कि कोई निर्णायक परिभाषा है), लेकिन फिर भी यह विधि के अंदर है :) और विधि के अंदर मैं बेहतर महसूस करता हूं (शायद यह सिर्फ मुझे है) मैं चेक की 10/20 लाइनें नहीं पढ़ता, जो सामान्य है यदि आप 100% सुरक्षित होने का प्रयास कर रहे हैं। – Simeon

+1

अमरूद की पूर्व शर्त लाइनों की संख्या को कम कर देगी, क्योंकि यह ब्लॉक अगर से बचाती है। यदि ये चेक इतने बड़े हैं कि वे परेशान हैं, तो उन्हें एक निजी विधि में रखें और इस निजी विधि को कॉल करें। इससे चेक केवल एक पंक्ति तक कम हो जाता है। और यदि आप 100% सुरक्षित होना चाहते हैं, तो दावे का उपयोग न करें (जिसे अक्षम किया जा सकता है - और डिफ़ॉल्ट आईआईआरसी द्वारा अक्षम कर दिया गया है), और किसी पहलू का उपयोग न करें, जिसे अक्षम किया जा सकता है, या गलत तरीके से स्थापित किया जा सकता है। –

+1

@downvoter: आप मेरे उत्तर से असहमत हो सकते हैं, लेकिन इससे यह उपयोगी नहीं होता है। डाउनवोट क्यों? –

0

मैं Java assertion प्रक्रिया अपनाते हैं।

  1. यह एक मानक दृष्टिकोण है इसलिए सभी (अधिकांश?) जावा प्रोग्रामर इसे समझेंगे। स्वचालित टूलिंग इत्यादि भी इसे पार्स करने में सक्षम होंगे।
  2. आपको अपने आप को कुछ भी विकसित नहीं करना है। मुझे पता है कि यह तुच्छ दिखता है, लेकिन इन चीजों में बढ़ने की आदत है।

जब तक आप यह प्रदर्शित नहीं कर सकते कि आपका दृष्टिकोण स्पष्ट रूप से बेहतर है या कुछ अलग कर रहा है, तो मैं टूलिंग और एपीआई का उपयोग करूंगा जो जावा मानक के रूप में प्रदान करता है।

+0

यह तब तक ठीक है जब तक आपको यकीन है कि यह चालू है [चालू] [http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html#enable-disable) जब आपको आवश्यकता हो यह होना था। – McDowell

1

यह सत्यापन तरह दिखता है।एफवाईआई, कई ढांचे पहले से मौजूद हैं, उदाहरण के लिए this question और OVal देखें।

मुझे प्रदर्शन के बारे में पता नहीं है, लेकिन मेरे लिए यह अतिसंवेदनशील नहीं है: आप केवल तर्क कोड रखते हैं। मुझे इसके साथ काम करना अच्छा लगता है।

2

मुझे लगता है कि आप एनोटेशन का मतलब है, पहलुओं नहीं। पहलू आम तौर पर उनके द्वारा सलाह के कोड के बाहर होते हैं। किसी भी मामले में, आप JSR 303 के साथ अपनी पोस्ट में हाइलाइट किए गए सत्यापनों को पूरा कर सकते हैं। बिंदु में मामला:

public void buyItem(@Min(value = 1) int itemId, @Min(value = 1) int buyerId) { 
    // buy logic 
} 

वर्तमान में JSR 303 के दो प्रसिद्ध कार्यान्वयन:

+0

मेरा मतलब पहलुओं का है। मैं गैर-एनोटेशन दृष्टिकोण सुझावों के लिए खुला हूं। – Simeon

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

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