मैं जावा में लिखित एक वितरित प्रणाली परियोजना में हूं जहां हमारे पास कुछ कक्षाएं हैं जो बहुत जटिल वास्तविक-विश्व-व्यापार वस्तुओं से मेल खाती हैं। इन ऑब्जेक्ट्स में क्रियाओं के अनुरूप बहुत सी विधियाँ हैं जो उपयोगकर्ता (या कुछ अन्य एजेंट) उस ऑब्जेक्ट पर लागू हो सकती हैं। परिणामस्वरूप, ये वर्ग बहुत जटिल हो गए।
सिस्टम जनरल आर्किटेक्चर दृष्टिकोण में कुछ वर्गों और बहुत से संभावित इंटरैक्शन परिदृश्यों पर केंद्रित व्यवहार का एक बहुत कुछ है।
एक उदाहरण के रूप में और चीजों को आसान और स्पष्ट रखने के लिए, मान लें कि रोबोट और कार मेरी परियोजना में कक्षाएं थीं।
तो, रोबोट क्लास में मेरे पास निम्न पैटर्न में बहुत सारे तरीके होंगे:
- नींद (); isSleepAvaliable ();
- जाग(); isAwakeAvaliable ();
- (दिशा) चलना; isWalkAvaliable ();
- शूट (दिशा); isShootAvaliable ();
- turnOnAlert (); isTurnOnAlertAvailable ();
- turnOffAlert (); isTurnOffAlertAvailable ();
- पुनर्भरण (); isRechargeAvailable ();
- बिजली बंद(); isPowerOffAvailable ();
- stepInCar (कार); isStepInCarAvailable ();
- stepOutCar (कार); isStepOutCarAvailable ();
- आत्म विनाश(); isSelfDestructAvailable ();
- मरने (); isDieAvailable ();
- जिंदा है(); जगा हुआ(); isAlertOn (); getBatteryLevel (); getCurrentRidingCar (); getAmmo ();
- ...
कार वर्ग में, यह समान होगा:
- चालू करो(); isTurnOnAvaliable ();
- बंद करें(); isTurnOffAvaliable ();
- (दिशा) चलना; isWalkAvaliable ();
- फिर से ईधन (); isRefuelAvailable ();
- आत्म विनाश(); isSelfDestructAvailable ();
- दुर्घटना(); isCrashAvailable ();
- isOperational (); ison (); getFuelLevel (); getCurrentPassenger ();
- ...
इनमें से प्रत्येक (रोबोट और कार) एक राज्य मशीन के रूप में कार्यान्वित किया जाता है, जहां कुछ राज्यों में कुछ क्रियाएं संभव हैं और कुछ में नहीं हैं। क्रियाएँ वस्तु की स्थिति को बदल देती हैं। IllegalStateException
किसी अमान्य स्थिति में कॉल करने पर क्रिया विधियाँ फेंकता है और isXXXAvailable()
विधियाँ बताती हैं कि क्या कार्रवाई संभव है। हालांकि कुछ राज्य से आसानी से काटे जा सकते हैं (जैसे, नींद की स्थिति में, जागना उपलब्ध है), कुछ नहीं हैं (शूट करने के लिए, इसे जागृत होना चाहिए, जीवित होना, बारूद होना और कार की सवारी नहीं करना)।
इसके अलावा, वस्तुओं के बीच बातचीत भी जटिल है। जैसे, कार केवल एक रोबोट यात्री को पकड़ सकती है, इसलिए यदि कोई दूसरा प्रवेश करने की कोशिश करता है, तो एक अपवाद फेंक दिया जाना चाहिए; यदि कार दुर्घटनाग्रस्त हो जाती है, तो यात्री को मर जाना चाहिए; यदि रोबोट एक वाहन के अंदर मर चुका है, तो वह बाहर कदम नहीं रख सकता है, भले ही कार खुद ठीक हो; यदि रोबोट एक कार के अंदर है, तो वह बाहर निकलने से पहले एक दूसरे में प्रवेश नहीं कर सकता है; आदि।
इसका परिणाम, जैसा कि मैंने पहले ही कहा है, ये कक्षाएं वास्तव में जटिल हो गईं। चीजों को बदतर बनाने के लिए, सैकड़ों संभावित परिदृश्य हैं जब रोबोट और कार बातचीत करते हैं। इसके अलावा, उस तर्क के अधिकांश को अन्य प्रणालियों में दूरस्थ डेटा तक पहुंचने की आवश्यकता होती है। परिणाम यह है कि यूनिट-परीक्षण यह बहुत कठिन हो गया है और हमारे पास बहुत सारी परीक्षण समस्याएं हैं, एक दूसरे को एक दुष्चक्र के कारण:
- Testcases setups बहुत जटिल हैं, क्योंकि उन्हें व्यायाम करने के लिए एक महत्वपूर्ण जटिल दुनिया बनाने की आवश्यकता है।
- परीक्षणों की संख्या बहुत बड़ी है।
- परीक्षण सूट को चलाने में कुछ घंटे लगते हैं।
- हमारा परीक्षण कवरेज बहुत कम है।
- परीक्षण कोड उस सप्ताह की तुलना में हफ्तों या महीनों के बाद लिखा जाता है जिसे वे परीक्षण करते हैं, या कभी भी नहीं।
- बहुत सारे परीक्षण भी टूट गए हैं, मुख्यतः क्योंकि परीक्षण कोड की आवश्यकताएं बदल गईं।
- कुछ परिदृश्य इतने जटिल होते हैं, कि वे सेटअप के दौरान टाइमआउट पर विफल हो जाते हैं (हमने प्रत्येक परीक्षा में एक टाइमआउट कॉन्फ़िगर किया, सबसे खराब स्थिति में 2 मिनट लंबा और यहां तक कि इस बार जब तक वे टाइमआउट करते हैं, हमने यह सुनिश्चित किया कि यह एक अनंत लूप नहीं है)।
- कीड़े नियमित रूप से उत्पादन वातावरण में फिसल जाते हैं।
वह रोबोट और कार परिदृश्य वास्तव में हमारे पास जो कुछ भी है, उस पर अत्यधिक सरलीकरण है। स्पष्ट रूप से, यह स्थिति प्रबंधनीय नहीं है। इसलिए, मैं मदद और सुझाव मांग रहा हूं: 1, कक्षाओं की जटिलता को कम करें; 2. मेरी वस्तुओं के बीच बातचीत परिदृश्यों को सरल बनाएं; 3. परीक्षण का समय और कोड का परीक्षण किया जाना कम करें।
EDIT:
मुझे लगता है कि मैं राज्य मशीनों के बारे में स्पष्ट नहीं था। रोबोट स्वयं एक राज्य मशीन है, जिसमें "स्लीपिंग", "जाग", "रिचार्जिंग", "डेड" आदि राज्य शामिल हैं। कार एक अन्य राज्य मशीन है।
EDIT 2: इस मामले में कि आप उत्सुक हैं कि मेरा सिस्टम वास्तव में क्या है, बातचीत करने वाली कक्षाएं सर्वर, IPAddress, डिस्क, बैकअप, उपयोगकर्ता, SoftwareLicense, आदि जैसी चीजें हैं। रोबोट और कार का परिदृश्य सिर्फ एक ऐसा मामला है जो मुझे मिला है। मेरी समस्या को समझाने के लिए यह काफी सरल होगा।