कई तर्कों के साथ निर्माणकर्ताओं से बचना


10

इसलिए मेरे पास एक कारखाना है जो विभिन्न वर्गों की वस्तुओं का निर्माण करता है। संभावित कक्षाएं एक अमूर्त पूर्वज से ली गई हैं। फ़ैक्टरी में एक कॉन्फ़िगरेशन फ़ाइल (JSON सिंटैक्स) है और यह तय करता है कि उपयोगकर्ता के कॉन्फ़िगरेशन के आधार पर किस वर्ग को बनाना है।

इसे प्राप्त करने के लिए, कारखाना JSON- पार्सिंग के लिए बढ़ावा :: property_tree का उपयोग करता है। वह ptree के माध्यम से चलता है और यह तय करता है कि किस ठोस वस्तु को बनाना है।

हालाँकि, उत्पाद-ऑब्जेक्ट में कई फ़ील्ड (विशेषताएँ) हैं। कंक्रीट वर्ग के आधार पर, वस्तु में लगभग 5-10 विशेषताएं हैं, भविष्य में शायद और भी अधिक।

इसलिए मुझे यकीन नहीं है कि वस्तुओं के निर्माता को कैसा दिखना चाहिए। मैं दो समाधानों के बारे में सोच सकता हूं:

1) उत्पाद का निर्माता एक पैरामीटर के रूप में हर विशेषता की उम्मीद करता है, इस प्रकार, निर्माणकर्ता 10+ मापदंडों के साथ समाप्त हो जाएगा। यह बदसूरत होगा और लंबी, अपठनीय कोड लाइनों का नेतृत्व करेगा। हालांकि, लाभ यह है कि कारखाना JSON को पार्स कर सकता है और सही मापदंडों के साथ कंस्ट्रक्टर को आमंत्रित कर सकता है। उत्पाद वर्ग को यह जानने की आवश्यकता नहीं है कि यह JSON कॉन्फ़िगरेशन के कारण बनाया गया है। यह जानने की आवश्यकता नहीं है कि JSON या कॉन्फ़िगरेशन बिल्कुल शामिल है।

2) उत्पाद का निर्माता केवल एक तर्क की उम्मीद करता है, संपत्ति_ट्री ऑब्जेक्ट। तब यह आवश्यक जानकारी को पार्स कर सकता है। यदि कॉन्फ़िगरेशन में जानकारी अनुपलब्ध है या सीमा से बाहर है, तो प्रत्येक उत्पाद वर्ग ठीक से प्रतिक्रिया कर सकता है। कारखाने को यह जानने की आवश्यकता नहीं है कि कई उत्पादों द्वारा क्या तर्क दिए गए हैं। गलत कॉन्फ़िगरेशन की स्थिति में प्रतिक्रिया करने के लिए कारखाने को यह जानने की आवश्यकता नहीं है। और कंस्ट्रक्टर इंटरफ़ेस एकीकृत और छोटा है। लेकिन, एक नुकसान के रूप में, उत्पाद को JSON से आवश्यक जानकारी निकालने की आवश्यकता है, इस प्रकार, यह जानता है कि इसका निर्माण कैसे किया जाता है।

मैं समाधान 2 को प्राथमिकता देता हूं)। हालांकि, मुझे यकीन नहीं है कि यह अच्छा कारखाना पैटर्न है। यह किसी भी तरह गलत लगता है कि उत्पाद को पता है कि यह JSON कॉन्फ़िगरेशन के साथ बनाया गया है। दूसरी तरफ, नए उत्पादों को बहुत सरल रूप में पेश किया जा सकता है।

उस पर कोई राय?



1
मैंने आपके लिंक का अनुसरण किया। शाफ़्ट फ्रीक से टॉप-रेटेड उत्तर में एक उदाहरण है। लेकिन क्या यह मुद्दा "बिल्डर" -approach हल करता है? कोड-लाइन डेटाक्लास डेटा = बिल्डर है। लेकिन createResults () - विधि को अभी भी DataClass ऑब्जेक्ट में 10 पैरामीटर प्राप्त करना है। पर कैसे? ऐसा लगता है कि आपके पास अमूर्तता की एक और परत है, लेकिन डेटाक्लास का कंस्ट्रक्टर छोटा नहीं है।
lugge86 12

बिल्डर और प्रोटोटाइप पर एक नजर।
सिल्वियू बर्किया

सिलविउ बुर्सा, मैंने किया। हालांकि, बिल्डर का उपयोग करते समय, बिल्डर उत्पाद में पैरामीटर कैसे प्राप्त करता है? कहीं न कहीं एक मोटी इंटरफेस के साथ होना है। बिल्डर सिर्फ एक और परत है, लेकिन किसी तरह मापदंडों को उत्पाद वर्ग में अपना रास्ता खोजना होगा।
lugge86

1
यदि आपकी कक्षा बहुत बड़ी है, तो कंस्ट्रक्टर के तर्कों के आसपास शिफ्ट करना बहुत बड़ा नहीं है
तेलेस्टिन

जवाबों:


10

मैं विकल्प 2 नहीं करूंगा, क्योंकि तब आपने हमेशा अपने ऑब्जेक्ट के निर्माण को बढ़ावा दिया है ताकि प्रॉपर्टी ट्री पार्सिंग को बढ़ावा मिले। यदि आप एक ऐसे वर्ग के साथ सहज हैं, जिसे कई मापदंडों की आवश्यकता है, तो आपको एक ऐसे निर्माता के साथ सहज होना चाहिए, जिसे कई मापदंडों की आवश्यकता हो, जैसे कि जीवन!

यदि आपकी मुख्य चिंता कोड पठनीयता है, तो आप बिल्डर पैटर्न का उपयोग कर सकते हैं, यह मूल रूप से नामित तर्क की कमी के लिए सी ++ / जावा स्टॉपगैप है। आप इस तरह दिखने वाली चीजों को समाप्त करते हैं:

MyObject o = MyObject::Builder()
               .setParam1(val1)
               .setParam2(val2)
               .setParam3(val3)
             .build();

तो अब MyObject में एक प्राइवेट कंस्ट्रक्टर होगा, जिसे बिल्डर :: build में कहा जाता है। अच्छी बात यह है कि यह एकमात्र ऐसी जगह होगी जहां आपको 10 मापदंडों के साथ एक निर्माता को कॉल करना होगा। बूस्ट प्रॉपर्टी ट्री फैक्ट्री बिल्डर का उपयोग करेगा, और बाद में यदि आप सीधे या किसी अन्य स्रोत से MyObject का निर्माण करना चाहते हैं, तो आप बिल्डर के माध्यम से जाएंगे। और बिल्डर मूल रूप से आपको प्रत्येक पैरामीटर को स्पष्ट रूप से नाम देता है जैसा कि आप इसे पास करते हैं, इसलिए यह अधिक पठनीय है। यह स्पष्ट रूप से कुछ बॉयलरप्लेट जोड़ता है, इसलिए आपको यह तय करना होगा कि क्या यह सिर्फ गन्दा निर्माणकर्ता को कॉल करने की तुलना में है, या अपने कुछ मौजूदा मापदंडों को एक साथ ढाँकने आदि में, बस मेज पर एक और विकल्प फेंकना है।

https://en.wikipedia.org/wiki/Builder_pattern#C.2B.2B_Example


5

दूसरे दृष्टिकोण का उपयोग न करें।

यह निश्चित रूप से समाधान नहीं है और केवल आपके ऐप के हिस्से के बजाय आपके व्यावसायिक तर्क में कक्षाओं को त्वरित करने का नेतृत्व करेगा, जहां कारखाने हैं।

कोई एक:

  • कुछ मापदंडों को समूहित करने का प्रयास करें जो वस्तुओं में समान चीजों का प्रतिनिधित्व करते हैं
  • वर्तमान वर्ग को कई छोटी कक्षाओं में विभाजित करें (10 मापदंडों वाला सेवा वर्ग ऐसा लगता है जैसे कक्षा बहुत सारी चीजें करती है)
  • इसे वैसे ही छोड़ दें, यदि आपकी कक्षा वास्तव में एक सेवा नहीं है, बल्कि इसके बजाय एक मूल्य वस्तु है

जब तक आप जो ऑब्जेक्ट बना रहे हैं वह वास्तव में एक वर्ग है जो डेटा को रखने के लिए जिम्मेदार है, तो आपको कोड को फिर से भरने और बड़े वर्ग को छोटे लोगों में विभाजित करने का प्रयास करना चाहिए।


खैर, bsiness लॉजिक एक फैक्ट्री का उपयोग कर रहा है जो उत्पादों को लौटाता है, इस प्रकार, व्यापार तर्क JSON / ptree सामान नहीं देखता है। लेकिन मैं आपकी बात देखता हूं, कंस्ट्रक्टर में पार्सर कोड होने से गलत लगता है।
lugge86

वर्ग एम्बेडेड सिस्टम के लिए GUI में एक विजेट का प्रतिनिधित्व कर रहा है, इस प्रकार, 5+ विशेषताएँ मेरे लिए ठीक लगती हैं: x_coord, y_coord, backgroundcolor, फ्रेमाइज़, फ्रेमाकोलर, टेक्स्ट ...
lugge86

1
@ lugge86 भले ही आप JSON को पार्स करने के लिए किसी कारखाने का उपयोग कर रहे हों, और इस प्रकार newअपने व्यापारिक तर्क के अंदर वस्तुओं को कॉल करने या निर्माण करने से बचें , यह बहुत अच्छा डिज़ाइन नहीं है। चेक Do बातों के लिए नहीं लग रहे Misko Hevery से बात करते हैं , जो और अधिक गहराई में बताता है कि क्यों कारखाने दृष्टिकोण आप संकेत दिया दोनों परीक्षण और देखने के पढ़ने बिंदु से खराब है। साथ ही, आपकी कक्षा एक डेटा ऑब्जेक्ट लगती है, और उन लोगों के लिए जो सामान्य रूप से नियमित सेवा वर्ग की तुलना में अधिक मापदंडों के लिए ठीक हैं। मैं बहुत परेशान नहीं होता।
एंडी

मैं अपने कारखाने के दृष्टिकोण के साथ ठीक महसूस कर रहा हूं, लेकिन मैं आपके लिंक का पालन करूंगा और इसके बारे में सोचूंगा। हालांकि, कारखाना इस विषय में सवाल में नहीं है। सवाल अभी भी है कि उत्पादों को कैसे स्थापित किया जाए ...
lugge86

"10 मापदंडों वाला एक सेवा वर्ग ऐसा लगता है जैसे कक्षा बहुत सारी चीजें करता है" मशीन सीखने में नहीं। किसी भी एमएल एल्गोरिथ्म में ट्यून करने योग्य मापदंडों के टन होंगे। मुझे आश्चर्य है कि जब कोडिंग एमएल से निपटने का सही तरीका क्या है।
सियुआन रेन

0

विकल्प 2 लगभग सही है।

एक बेहतर विकल्प 2

एक "फ्रंट फेसिंग" क्लास बनाएं जो उस जॉन्सन-स्ट्रक्चर ऑब्जेक्ट को ले और बिट्स को बाहर निकाले और फैक्ट्री कंस्ट्रक्टर (ओं) को कॉल करें। यह लेता है कि कारखाना क्या बनाता है और ग्राहक को देता है।

  • फैक्ट्री को इस बात का बिल्कुल भी अंदाजा नहीं है कि इस तरह की JSON चीज भी मौजूद है।
  • ग्राहक को यह जानने की जरूरत नहीं है कि कारखाने को किन विशिष्ट बिट्स की आवश्यकता है।

मूल रूप से "सामने अंत" करने के लिए कह रहा है 2 बॉब्स: "मैं से निपटने के संशोधित ग्राहकों के लिए मैं लोगों को कौशल है तो इंजीनियरों की जरूरत नहीं है!" गरीब टॉम। यदि वह केवल यह कहता है कि "मैं ग्राहक को निर्माण से अलग करता हूं। यह परिणाम एक अत्यधिक सामंजस्यपूर्ण कारखाना है"; हो सकता है उसने अपनी नौकरी रख ली हो।

बहुत ज़्यादा बहस?

क्लाइंट के लिए नहीं - फ्रंट एंड कम्युनिकेशन।

मोर्चा अंत - कारखाना? यदि 10 पैरामीटर नहीं हैं, तो आप जो सबसे अच्छा कर सकते हैं, उसे अनपैकिंग से हटा दिया जाता है, यदि मूल JSON बात नहीं है तो कुछ DTO। क्या यह JSON को कारखाने में पास करने से बेहतर है? एक ही अंतर मैं कहता हूं।

मैं व्यक्तिगत मापदंडों को पारित करने पर दृढ़ता से विचार करूंगा। एक साफ, चिपकने वाले कारखाने के लक्ष्य के लिए छड़ी। @DavidPacker उत्तर की चिंताओं से बचें

"बहुत तर्क वितर्क" करना

  • फैक्ट्री या क्लास कंस्ट्रक्टर

    • विशिष्ट वर्ग / वस्तु निर्माण के लिए केवल तर्क देना।
    • डिफ़ॉल्ट पैरामीटर
    • वैकल्पिक पैरामीटर
    • तर्कों का नाम
  • फ्रंट एंड तर्क समूहन

    • ऊपर दिए गए कंस्ट्रक्टर हस्ताक्षर द्वारा निर्देशित तर्क मान, मूल्यांकन, सत्यापन, सेट आदि की जांच करते हैं।

"फैक्ट्री को इस बात का बिलकुल भी अंदाजा नहीं है कि इस तरह की JSON चीज भी मौजूद है" - ठीक है, फिर फैक्ट्री किस लिए है ?? यह उत्पाद, उत्पाद और उपभोक्ता दोनों से उत्पाद निर्माण का विवरण छिपाता है। अन्य वर्ग को अभी तक क्यों मदद करनी चाहिए? मैं JSON बोलने वाले कारखाने के साथ ठीक हूं। XML को पार्स करने के लिए कोई दूसरा कारखाना लगा सकता है और भविष्य में "एब्सट्रैक्ट फैक्ट्री" लागू कर सकता है ...
lugge86

श्री फैक्टरी: "आप क्या वस्तु चाहते हैं? ... वह क्या है? बस मुझे बताएं कि किस वर्ग-वस्तु का निर्माण करना है।" कॉन्फ़िगरेशन फ़ाइल JSON डेटा स्रोत है, जैसा कि अंकल बॉब कहते हैं "यह एक कार्यान्वयन विवरण है।" यह दूसरे स्रोत और / या दूसरे रूप में हो सकता है। आम तौर पर हम विशिष्ट डेटा स्रोत विवरण से अलग करना चाहते हैं। स्रोत या रूप बदलना चाहिए, कारखाना नहीं होगा। एक स्रोत + पार्सर, और एक कारखाने के रूप में डिकोड किए गए मॉड्यूल को देखते हुए दोनों पुन: प्रयोज्य बनाता है।
राडारबॉब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.