अगर यह मौजूद नहीं है, तो क्या किसी चीज में कुछ बनाने के लिए बुरा कोडिंग अभ्यास है?


18

इसलिए मेरे पास एक webservice है जिसमें कुछ ऐसा है getAccountजहां यह खाते के लिए एक पहचानकर्ता लौटाएगा यदि यह मिल गया, तो अपवाद छोड़ दें। क्लाइंट हमेशा एक खाता बनाना चाहेगा, यदि एक अपवाद को उसी सूचना के साथ फेंका जाए, जो उसके साथ किया जाता है।

मैं ग्राहकों के लिए एक सुविधा पुस्तकालय का निर्माण कर रहा हूँ जो कि सभी वेबसर्विस कॉल को अंदर से हैंडल करेगा ताकि उन्हें यह जानने की आवश्यकता न हो कि कॉल स्वयं कैसे करें।

मैं जो सोच रहा हूं वह इस लाइब्रेरी में है अगर मैं इसे बनाऊं getAccount(accountName)तो वह खाता होगा, अगर यह मौजूद है, और यदि यह नहीं है, तो इसे बनाएं और जानकारी वापस न करें, क्या यह करना गलत है? क्या मुझे इसे अपवाद को संभालने के लिए क्लाइंट पर छोड़ देना चाहिए या बस इसे कुछ नाम देना चाहिए जैसे कि GetOrCreateAccount? फर्क पड़ता है क्या?

क्या किसी ऑपरेशन में कुछ बनाना बुरा है?


9
बहुत कम से कम, मैं इसे getOrCreateAccountया इसी तरह का नाम दूंगा।
तेलस्टिन

4
यह आलसी आरंभीकरण के संदर्भ में मान्य लगता है। हालाँकि, यह निर्भर करता है कि आपको अपने पुस्तकालय में उस पैटर्न का उपयोग करने की आवश्यकता है या नहीं।
क्रिस सी

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

2
"ग्राहक हमेशा एक खाता बनाना चाहेगा" - जो अत्यधिक असामान्य लगता है। यदि मुझे खाता नहीं मिल सकता है क्योंकि उपयोगकर्ता ने अपने उपयोगकर्ता नाम को गलत बताया है, तो मैं निश्चित रूप से गलत नाम के साथ खाता नहीं बनाना चाहता।
gnasher729

Javabean कल्पना के अनुसार oracle.com/technetwork/articles/javaee/spec-136004.html गेटर्स के getSomething()लिए है, और बसने वालों के setSomething()लिए है। इमो कुछ भी है कि अधिक बौद्धिक कुछ करता है कुछ और ही बुलाया जाना चाहिए, यानी fetchSomething, obtainSomething, computeSomething, या doSomethingElseआदि
ccpizza

जवाबों:


31

हाँ, यह मायने रखता है। मेरी राय में, यह आम तौर पर एक ऐसी प्रक्रिया में कुछ बनाने के लिए एक बुरा अभ्यास है जो सृजन की शक्तियों के रूप में प्रलेखित नहीं है। या तो प्रक्रिया को नाम दें getOrCreate...या एक अलग create...प्रक्रिया है और फिर यदि आप वास्तव में चाहते हैं, तो getOrCreate...पहले प्रयास करें get..., और यदि वह विफल हो जाता है, create...तो कॉल करें और फिर कॉल करें get...

लाइब्रेरी का उपयोगकर्ता संभवतः get...प्रक्रिया के निर्माण की उम्मीद नहीं करेगा अगर गेट ऑपरेशन विफल हो जाता है। यदि उन्हें अचानक पता चलता है कि उनके परीक्षण get...ने पूरे टन डेटा बनाने के लिए कॉल किया , तो वे शायद आश्चर्यचकित होंगे। और वे इसे कैसे साफ करते हैं? क्या होगा अगर वे यह सोचते हुए कोड लिखते हैं कि get...असफल होने पर उन्हें एक त्रुटि मिलेगी और वे अपने तरीके को संभालना चाहते हैं ?


धन्यवाद, क्रिएट वास्तव में आईडी देता है कि गेट भी वापस आ जाएगा इसलिए मुझे get... create... get...सिर्फ पहले दो नहीं करना होगा । मैं क्लाइंट से इस बारे में बात करूंगा कि क्या उन्हें कभी भी getबिना किसी कॉल के केवल बनाने की क्षमता की आवश्यकता होगी
माइक

6
@ माइक: मुझे अभी भी लगता है कि यह createनाम में होना चाहिए , जो हो रहा है उसके बारे में सिर्फ 100% स्पष्ट होना चाहिए।
FrustratedWithFormsDesigner

हां मैं सहमत हूं, मैं इसे getOrCreate की तर्ज पर कुछ बनाने की योजना बना रहा था क्योंकि मेरा मूल विचार बस करने के लिए था, लेकिन मैंने महसूस किया कि यह तुरंत स्पष्ट नहीं है कि यह पृष्ठभूमि में भी कुछ बना रहा है
माइक

1
यह सुपर लेट है, लेकिन getOrCreateएक लोकप्रिय वेब फ्रेमवर्क में पूर्वता है: docs.djangoproject.com/en/1.10/ref/models/querysets/…
tex

18

नहीं, यह 'बुरा व्यवहार' नहीं है। तो जब तक आप और अन्य डेवलपर्स सहमत हैं कि आप कैसे काम करना चाहते हैं, तो यह ठीक है। आखिरकार, यह एक खाता वापस करना होगा, जो आप चाहते हैं। यह खाता 'हुड के नीचे' बनाया गया है, जो कॉल करने वाले के लिए अप्रासंगिक है।


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

9
मैं असहमत हूँ, यहां तक ​​कि एक सार्वजनिक एपीआई के लिए भी ठीक है - जब तक कि एपीआई जो करना चाहिए, उसके संदर्भ में यह समझ में आता है। एपीआई में कई प्रविष्टियाँ बनाने का कोई मतलब नहीं है जब कोई एक ही चाल करेगा।
ग्रैंडमास्टरबी

रिकॉर्ड के लिए यह पूरी तरह से आंतरिक पुस्तकालय है और मेरे पास इसका उपयोग करने वाली टीम को यह बताने की क्षमता है कि यह कैसे काम करता है
माइक

1
@ jmort253: यदि ग्राहक को कोई साइड इफेक्ट दिखाई नहीं देता है तो एक सेवा अशक्त है । सर्वर जैसा चाहे वैसा कर सकता है।
केविन क्लाइन

1
@kevincline, मुझे लगता है कि मैं इसके बारे में सोच रहा था, चलो, मेरे क्रेडिट कार्ड को चार्ज करते हैं। यदि सर्वर GET अनुरोध के आधार पर मेरा कार्ड चार्ज करता है, लेकिन फिर भी मुझे हर बार इसे चलाने पर "अस्वीकृत" जैसा परिणाम देता है, तो ऐसा लगता है कि यह GET की भावना के विरुद्ध है। इसके साथ ही कहा, मैं आपकी बात देख रहा हूं। सर्वर GET अनुरोधों की संख्या की गणना कर सकता है और मुझे 3 प्रश्नों के बाद लॉक कर सकता है, जिससे मुझे सीमित किया जा सकता है, लेकिन मेरे खाते के किसी भी विवरण को बदले बिना। मुझे लगता है कि यह एक महत्वपूर्ण अंतर है जब कोई कहता है कि सर्वर स्थिति संशोधित नहीं है। शायद मुझे इसके बजाय "सर्वर पर क्लाइंट स्टेट" कहना चाहिए
jmort253

10

यदि getAccount()आप हमेशा किसी खाते को वापस कर सकते हैं, तो कॉलर के दृष्टिकोण से, खाता मौजूद है, और हमेशा अस्तित्व में है। के लिए करने के लिए कोई जरूरत नहीं है getAccount()'बनाने' के लिए कुछ भी करने के लिए। डिफ़ॉल्ट खाते से अलग होने तक खाते को कहीं भी संग्रहीत नहीं करना पड़ता है।


+1 आम तौर पर, GetOrCreateगलत अर्थ है, लेकिन एक वस्तु प्राप्त करना जो "तार्किक रूप से" मौजूद हो सकता है या नहीं, चाहे वह मौजूद है या नहीं। एक उदाहरण के रूप में, उत्परिवर्तित वस्तुओं के एक विरल सरणी में तत्व 1,841,533 के लिए आवंटित कोई भंडारण नहीं हो सकता है, लेकिन फिर भी उस तत्व को एक नई वस्तु बनाकर, उसे संग्रहीत करते हुए, और एक संदर्भ वापस करके "पुनर्प्राप्त" करने की अनुमति दें।
सुपरकैट

4

यह 3 तरीके बनाने के लिए सबसे अधिक समझ में आता है:

getAccount -> जो सिर्फ खाता है।

createAccount -> एक खाता बनाता है।

getAccountAndCreateIfNeeded -> अपना नामकरण चुनें;)

अलग क्यों करें: आपके पास प्राप्त करने और बनाने की एक सरल विधि है। यह दोनों के लिए एक स्पष्ट परीक्षण योग्य विधि है। GetAccount के लिए यह खाता नहीं ढूंढने के लिए एक अपवाद नहीं है । तो बस झूठा या ऐसा कुछ वापस करें, यह अपेक्षित है।

फिर आप अपने समूहीकृत फ़ंक्शन में उस वापसी मान का उपयोग कर सकते हैं: getAccountAndCreateIfNeeded जो अब परीक्षण योग्य है, इसे हमेशा एक खाता वापस करना चाहिए। तुम जो भी पूछते हो।

ये सभी 3 विधियां स्पष्ट हैं, यह बिल्कुल स्पष्ट है कि वे क्या करते हैं और क्या करते हैं। अब आप अपनी टीम के साथ समझौते कर सकते हैं लेकिन लंबे समय तक इस तरह के अपवाद भयानक हैं। बस उन्हें बहुत स्पष्ट करें और आपके पास कोई मुद्दा नहीं होगा।


साथ ही, क्लीन कोड से: "यदि आपका तरीका यह नहीं कर सकता है कि उसका नाम क्या है, तो एक अपवाद फेंकें।" मुझे 'GetOrCreateIfneeded' के अंदर एक ट्राइ / कैच ब्लॉक मिलेगा जो एक असफल GET पर फेंकता है और उसके बाद थ्रो के अंदर 'createAccount' जो भी अपवाद प्रकार के लिए विफल हो जाता है।
ग्राहम

मैं एक चौथा तरीका सुझा सकता हूं: getAccountIfExistsजो या तो एक खाता प्राप्त करेगा या यह संकेत देगा कि यह नया बनाने के बिना मौजूद नहीं है। getAccountविधि ही मानना चाहिए कि खाता मौजूद है, और एक अपवाद नहीं तो फेंक देते हैं।
सुपरकैट

2

यह परिस्थितियों पर निर्भर करता है।

उदाहरण के लिए, आप इसका उपयोग आलसी लोडिंग / इंस्टेंटेशन करने के लिए कर सकते हैं, डेटा की लोडिंग या किसी इंस्टेंस के निर्माण को स्थगित कर सकते हैं जब तक कि वास्तव में इसकी आवश्यकता न हो। यह सामान्य रूप से समझदार है क्योंकि यह उन संसाधनों को बचाता है जिनकी आपको आवश्यकता नहीं हो सकती है (यदि वर्ग / डेटा की कभी आवश्यकता नहीं है तो यह कभी भी लोड नहीं होता है)।

हालाँकि, इस विशेष मामले में, मैं कहूँगा कि getAccount नामक एक विधि है जो एक नया खाता बनाएगी यदि यह मौजूद नहीं था तो यह अच्छा अभ्यास नहीं होगा। यदि उपयोगकर्ता ने किसी विशेष खाते की पहचान करने के लिए कुछ क्रेडेंशियल्स दिए हैं और वह खाता नहीं मिल सका है, तो इसका मतलब यह है कि उपयोगकर्ता अभी तक ग्राहक नहीं है और उनके लिए एक खाता बनाया जाना चाहिए, या इसका मतलब यह है कि क्रेडेंशियल्स का गलत मूल्यांकन किया गया था और उपयोगकर्ता को यह सत्यापित करने के लिए कहा जाना चाहिए कि वे दर्ज किए गए हैं जो वे दर्ज करने का मतलब है?

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.