वर्षों तक फॉर्म भरने और इंतज़ार करने के बाद, आपको अपना बैंकिंग लाइसेंस मिल ही गया। इसका मतलब है कि अब आप आधिकारिक रूप से अपना बैंक खोल सकते हैं, वाह!
आपकी पहली प्राथमिकता आईटी सिस्टम को काम करने लायक बनाना है। एक दिन की मेहनत के बाद, आप अब खाते खोल और बंद कर सकते हैं, और निकासी तथा जमा भी संभाल सकते हैं।
चूँकि आप टेस्ट लिखने की मेहनत नहीं करना चाहते थे, आप कुछ दोस्तों को सिस्टम परखने में मदद के लिए बुलाते हैं। लेकिन सिर्फ पाँच मिनट बाद, आपके एक दोस्त का दावा है कि उसका पैसा गायब हो गया है! हालाँकि आपको पूरा भरोसा है कि आपके कोड में कोई बग नहीं है, फिर भी आप जाँच करने के लिए लॉग देखने लगते हैं।
आह, हाँ, जैसा आपको संदेह था, गलती आपके दोस्त की ही है! उसने अपने टेस्ट क्रेडेंशियल किसी और दोस्त के साथ साझा किए, और दोनों ने मिलकर एक ही खाते से समानांतर में जमा और निकासी करने की चाल चली। ऐसा भला कौन करेगा?
जब आप यह तर्क करते हैं कि किसी के लिए अपने खाते को समानांतर में एक्सेस करना भौतिक रूप से असंभव है, तो आपका दोस्त आत्मसंतुष्ट होकर आपको बताता है कि बैंकिंग नियम आपको इसे सपोर्ट करने के लिए बाध्य करते हैं। इसलिए, समानांतर बैंकिंग सपोर्ट नहीं, तो लाइव होने का संकेत भी नहीं। आह भरते हुए, आप मन में लिख लेते हैं कि कल इस पर काम करना है। इससे आपकी लॉन्च तारीख कम से कम एक दिन और पीछे चली जाएगी, लेकिन जो भी हो...
आपको ऐसे बैंक खाते बनाने हैं जिन्हें खोला और बंद किया जा सके, और जिनमें पैसा जमा किया जा सके तथा निकाला जा सके।
बैंक खातों तक कई अलग-अलग तरीकों से पहुँचा जा सकता है (इंटरनेट, मोबाइल फोन, ऑटोमैटिक चार्ज), इसलिए आपके बैंक सॉफ्टवेयर को यह सुविधा देनी चाहिए कि एक ही समय में कई थ्रेड या प्रोसेस (यह शब्द आपकी प्रोग्रामिंग भाषा पर निर्भर करता है) खातों तक सुरक्षित रूप से पहुँच सकें। उदाहरण के लिए, एक साथ बहुत सारी जमा और निकासी हो सकती हैं; आपको यह सुनिश्चित करना है कि खाते का बैलेंस पढ़ने और नया बैलेंस सेट करने के बीच कोई रेस कंडीशन न हो।
खाता बंद करना भी संभव होना चाहिए। बंद खाते पर की जाने वाली हर कार्रवाई विफल होनी चाहिए।
Python में ग्लोबल इंटरप्रेटर लॉक की वजह से "असली" कंकरेंसी का समर्थन नहीं है। Python में फ्री-थ्रेडिंग का समर्थन जोड़ने पर काम चल रहा है, लेकिन यह अभी भी प्रयोगात्मक है। मौजूदा स्टैंडर्ड लाइब्रेरी के तरीके, जैसे मल्टीप्रोसेसिंग और थ्रेडिंग, मौजूदा ट्रैक टूलिंग के साथ लागू करना मुश्किल है।
इसलिए इस अभ्यास में कंकरेंसी की आवश्यकता फिलहाल हटा दी गई है। अकाउंट के सारे काम एक ही थ्रेड पर एक के बाद एक होते हैं, और कंकरेंसी या "रेस कंडीशन" से जुड़ा कोई टेस्ट नहीं चलाया जाता।
अगर आप फ्री-थ्रेडिंग या कंकरेंसी टेस्ट के साथ प्रयोग करना चाहें, तो हमारा अनुरोध है कि आप यह लोकल रूप से कीजिए। लोकल रूप से अभ्यास डाउनलोड करने और उन पर काम करने में मदद के लिए, हम Exercism CLI का सुझाव देते हैं।
कभी-कभी एक्सेप्शन उठाना ज़रूरी हो जाता है। ऐसा करते समय आपको हमेशा एक अर्थपूर्ण एरर संदेश देना चाहिए, जिससे पता चले कि एरर का स्रोत क्या है। इससे आपका कोड पढ़ने में आसान हो जाता है और डिबगिंग में काफी मदद मिलती है। जहाँ आपको पता हो कि एरर का स्रोत एक खास टाइप का ही होगा, वहाँ आप अंतर्निहित एरर टाइप में से कोई एक उठाना चुन सकते हैं, लेकिन तब भी एक अर्थपूर्ण संदेश ज़रूर देना चाहिए।
इस अभ्यास में आपको raise स्टेटमेंट का इस्तेमाल करके ValueError "फेंकना" है, तब जब अकाउंट खुला हो या खुला न हो, या जब निकासी या जमा की रकम गलत हो। टेस्ट तभी पास होंगे जब आप exception को raise भी करेंगे और उसके साथ एक संदेश भी देंगे।
संदेश के साथ ValueError उठाने के लिए, संदेश को exception टाइप के आर्गुमेंट के रूप में लिखिए:
# account is not open
raise ValueError('account not open')
# account is already open
raise ValueError('account already open')
# incorrect withdrawal/deposit amount
raise ValueError('amount must be greater than 0')
# withdrawal is too big
raise ValueError('amount must be less than balance')
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।