2012-04-24 14 views
10

रॉबर्ट सी द्वारा साफ कोड के अनुसार मार्टिन विधियों के पास एक छोटा हस्ताक्षर होना चाहिए। सबसे अच्छा मामला कोई तरीका नहीं होगा जिसमें कोई पैरामीटर नहीं है। इसके बजाय राज्य चर का उपयोग करने की सिफारिश की जाती है। यह वास्तव में उपयोगी है। लेकिन स्टेटलेस सत्र सेम के बारे में क्या?स्वच्छ कोड, स्टेटलेस सत्र सेम और निजी राज्य

नाम भ्रमित करने वाला है क्योंकि एसएलएसबी के पास राज्य हो सकता है। आपको बस अपना हाउसकीपिंग करना है ताकि आप पिछले ईजेबी कॉल से राज्य का उपयोग न करें।

कोड साफ़ करने के लिए वापस प्राप्त करना: मुझे एसएलएसबी में भी इंस्टेंस चर का उपयोग करना अच्छा लगेगा। यह ठीक काम करता है और यदि आप पर्याप्त सावधान हैं तो आपको राज्य विसंगतियों के साथ कोई परेशानी नहीं है क्योंकि राज्य प्रत्येक सार्वजनिक विधि कॉल पर अधिलेखित है।

अभी तक इतना अच्छा है। लेकिन क्या होता है यदि एक प्रयोग किया हुआ बीन पूल में वापस जाता है? यह इसके साथ अपने राज्य लेता है। राज्य के आकार के आधार पर यह वास्तविक स्मृति रिसाव हो सकता है। जेबॉस बीन्स के साथ बहुत उदार है और उनमें से कुछ गुच्छा पैदा करता है जिससे कुछ गंभीर स्मृति खपत होती है - कुछ भी नहीं।

तो बीन विधि मौजूद होने से पहले राज्य को साफ करना एक तरीका होगा और बीन पूल में वापस आ जाएगा। लेकिन यह मुझे बेकार कोड की तरह लगता है जिसे टालना चाहिए।

क्या इस समस्या से निपटने का कोई सही तरीका है? इस स्थिति में सबसे अच्छा अभ्यास क्या है?

+0

कुछ DIY विधि द्वारा बनाए गए किसी भी राज्य को क्लस्टरिंग के मामले में असफल हो जाएगा, इसलिए यह जेईई के लिए स्वागत नहीं है। और प्रत्येक बीन के लिए उस राज्य की एक प्रति बनाए रखना भी मेरे लिए गलत लगता है। –

उत्तर

0

जीवन को सरल रखें, बस पैरामीटर में पास करें। भले ही आप अन्यथा कर सकते हैं, यह एक स्टेटलेस ईजेबी के इरादे से स्पष्ट है कि नहीं होना चाहिए।

शून्य पैरामीटर के लक्ष्य के लिए लक्ष्य रखने वाला FWIW मुझे मूर्खतापूर्ण लगता है। कुछ के लिए लक्ष्य, हां, लेकिन इसके लिए शून्य के लिए प्रयास करना सिर्फ दाढ़ी है।

+0

असल में मैं शून्य पैरामीटर विधियों के बारे में बहुत डरावना नोट कर रहा हूं। लेकिन मुझे अधिकतम 2 पैरामीटर का उपयोग करना पसंद है। मुझे पढ़ने के लिए और बनाए रखने के लिए कठिन दो पैरामीटर के साथ विधियां मिलती हैं। और ओओ-मॉडल से अगर समेकन उच्च होता है तो यह राज्य चर का उपयोग करने के लिए पूरी तरह से समझ में आता है। –

+1

यह सब ठीक है और अच्छा है, लेकिन एक कदम पीछे लेते हुए, आइए मान लें कि आप * राज्य जोड़ना * के खिलाफ व्यक्तिगत कॉस्मेटिक वरीयता डालने के बारे में बात कर रहे हैं जो वास्तव में स्पष्ट रूप से एक * स्टेटलेस बीन * है। आपको इसके साथ ओओ सिद्धांतों को संतुलित करने की जरूरत है, न केवल उन्हें अंधाधुंध पक्षपात करें। – Brian

+0

बीटीडब्ल्यू एक वास्तविक विचार के जवाब में एक डाउनवोट कठोर लगता है जो केवल उस दिशा से सहमत नहीं होता है जिसे आप अपनी बीन लेना चाहते हैं? – Brian

0

रॉबर्ट सी मार्टिन विधियों द्वारा साफ कोड के अनुसार छोटे हस्ताक्षर होना चाहिए।

आमतौर पर मैं तर्क के रूप में (स्थानांतरण वस्तुओं) को पास करना पसंद करूंगा, इस तरह मैं विधि हस्ताक्षर को प्रभावित किए बिना जो भी पास करता हूं उसे बदल सकता हूं।

इसके अलावा, मैं वास्तविक आधार वर्ग की बजाय एक इंटरफेस में गुजरना पसंद करूंगा।

public void doSomething(IMyTransferObject arg){ 
... 
} 

कहाँ IMyTransferObject एक अंतरफलक

interface IMyTransferObject { 
    ... 
} 

class TransferObject implements IMyTransferObject{ 
    private String name; 
    private String game; 
    ... accessor/mutator 
} 

सबसे अच्छा मामले में कोई भी मानकों के साथ एक तरीका होगा है। इसकी बजाय को राज्य चर का उपयोग करने की अनुशंसा की जाती है। यह वास्तव में उपयोगी है। लेकिन स्टेटलेस सत्र बीन्स के बारे में क्या?

इसे धार्मिक रूप से पालन नहीं किया जा सकता है, और वास्तव में ऐसा करने का कोई कारण नहीं है।

+0

यह आंतरिक निजी तरीकों के लिए बहुत सी कोड है :) असल में मैं एसएलएसबी के अंदर निजी तरीकों के बारे में बात कर रहा था। –

0
http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html से

:

स्टेटलेस सत्र बीन्स

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

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

मुझे लगता है कि आप है सुनिश्चित करें कि हर नई विधि कॉल के साथ, उदाहरण के क्षेत्रों में नए डेटा के साथ अद्यतन कर रहे हैं बनाने के लिए, और मुझे लगता है कि आप सुनिश्चित करें कि आप संदर्भों को निकाल रहे हैं बनाना चाहिए के बाद विधि समाप्त हो गया है यह सुनिश्चित करने के लिए कि आप पुरानी वस्तुओं के कचरे के संग्रह को अवरुद्ध नहीं करते हैं क्योंकि उन्हें कुछ "पुराने" बीन में संदर्भित किया जाता है जो अभी भी कुछ पूल में रखा जाता है।

मुझे लगता है कि जैसे एक पैटर्न सुझाव है:

public class MyBean{ 

    private SomeClass firstObject; 
    private SomeOtherClass anotherObject; 
    private AndAnotherClass thirdObject; 

    public void theMethod(firstObject, anotherObject, thirdObject){ 
    try { 
     this.firstObject = firstObject; 
     this.anotherObject = anotherObject; 
     this.third = thirdObject; 

     startProcessing(); 

    }finally { 
     this.firstObject = null; 
     this.anotherObject = null; 
     this.third = null; 
    } 
    } 

    private void startProcessing() { 
    doStep1(); 
    doStep2(); 
    doStep3(); 
    } 

    [...] 
} 

फिर भी कोड का एक बहुत - लेकिन अगर आपको लगता है कि शैली के लिए लगातार छड़ी, आप स्वचालित रूप से "theMethod" भाग छोड़ सकते हैं और "startProcessing" पर आगे पढ़ने से जहां आपके पास सबकुछ साफ और पैरामीटर के बिना है।

0

एसएलएसबी में इंस्टेंस चर रखने के लिए यह संभव है, क्योंकि आप प्रॉक्सी का उपयोग विधियों के बीच कॉल करने के लिए नहीं करते हैं। उदाहरण के लिए:

@Stateless 
public class MyEJB { 
    private String var; 

    public void receiveVar(String var) { 
     this.var = var; 
     useVar(); 
    } 

    private void useVar() { 
     // do something with var 
    } 
} 

बिंदु है: जब आप किसी अन्य रूप में इस SLSB इंजेक्षन, किसी भी विधि कॉल वास्तविक EJB प्राप्त करने के लिए प्रॉक्सी के माध्यम से पारित होगा। इसलिए, इस बात पर विचार करते हुए कि वास्तविक उदाहरण को प्रॉक्सी इंस्टेंस पर विधि कहा जाता है, पूल से पुनर्प्राप्त किया जाता है, इस बात की कोई गारंटी नहीं है कि प्रॉक्सी दो या दो से अधिक कॉल के बीच एक ही पूल किए गए उदाहरण का उपयोग करेगी। इसलिए किसी घोषित वर्ग विशेषता का मूल्य सुनिश्चित करना संभव नहीं है।

जब एसएलएसबी पूल में बैक करता है, तो यह स्वयं प्रत्येक निर्धारित मूल्य लेता है (मुझे लगता है कि यह विक्रेता के अनुसार बदल सकता है, मुझे सच में यकीन नहीं है)। लेकिन, यह पूरी तरह से संभव (और स्वीकार्य) है कि एक पूल किए गए एसएलएसबी उदाहरण में पहले से पहले कॉन्फ़िगर किया गया विशेषता मान है। अब तक तो अच्छा

:

मैं अपनी बात यहाँ समझ में नहीं आया। लेकिन क्या होता है यदि एक प्रयोग किया हुआ बीन पूल में वापस जाता है? यह इसके साथ अपने राज्य लेता है। राज्य के आकार के आधार पर यह वास्तविक स्मृति रिसाव हो सकता है।जेबॉस बीन्स के साथ बहुत उदार है और उनमें से कुछ गुच्छा उत्पन्न करता है जिससे कुछ गंभीर स्मृति खपत होती है - कुछ भी नहीं।

क्या आपके पास एसएलएसबी में "बड़े राज्य" का कोई उदाहरण हो सकता है?

और अंत में:

मैं सबसे अच्छा तरीका हमेशा आप इस्तेमाल करेंगे कि राज्य चर संभाल रहा है मानों का प्रबंधन कैसे लगता है। उपयोग के बाद पहले और सफाई। और सबसे अच्छा अभ्यास इस तरह की भ्रमित स्थिति से बचने के लिए है।

उम्मीद है कि यह मदद करता है।

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