क्या संपत्तियों के संबंधित सेट को अपनी संरचना / वर्ग में लपेटना अच्छा है?


10

स्विफ्ट में उपयोगकर्ता ऑब्जेक्ट लिखना, हालांकि मेरा प्रश्न किसी भी दृढ़ता से टाइप की गई भाषा से संबंधित है। एक उपयोगकर्ता लिंक का एक गुच्छा (FacebookProfile, InstagramProfile, आदि) हो सकता है। इसके आसपास कुछ सवाल।

  1. क्या अपनी वस्तु में लिंक लपेटना अच्छा है?
    संरचना उपयोगकर्ता {
       var पहला नाम: स्ट्रिंग
       var अंतिम नाम: स्ट्रिंग
       var ईमेल: स्ट्रिंग
       var लिंक: लिंक
    }
    संरचना लिंक {
       var facebook: स्ट्रिंग
       var इंस्टाग्राम: स्ट्रिंग
       var twitter: स्ट्रिंग 
    }

या उन्हें ढीला होना चाहिए? मैं तकनीकी रूप से जानता हूं कि दोनों ही तरीके ठीक हैं, लेकिन अगर कोई अनुशंसित तरीका है, तो सामान्य तौर पर - पठनीयता के लिए सोच रहा था।

struct User { 
   var firstName: string
   var lastName: string
   var email: string
   var facebookLink: string
   var twitterLink: string
   var instagramLink: string
}
  1. इस तरह से एक परिदृश्य में, लिंक एक संग्रह / सूची होनी चाहिए? मुझे लगा कि यह एक सूची नहीं होनी चाहिए क्योंकि लिंक विकल्पों की एक निश्चित संख्या उपलब्ध है, और बढ़ती संख्या नहीं है। क्या मेरी सोच सही है?

  2. क्या उपयोगकर्ता ऑब्जेक्ट के अंदर मेरे नेटवर्किंग तरीकों को रखना अच्छा है, जैसे गेटअप्स, गेटयूजर, अपडेटयूजर?

मुझे पता है कि ये व्यक्तिपरक हो सकते हैं, लेकिन मैं यह समझने की कोशिश कर रहा हूं कि समान स्थितियों के आसपास सबसे अच्छा अभ्यास क्या है। किसी भी संकेत की सराहना करेंगे।

जवाबों:


30

आपको या तो आवश्यकता होगी

  • किसी चीज़ का शून्य,
  • एक बात, या
  • बात का एक मनमाना संख्या।

मैं हैरान हूँ कि आपका डिज़ाइन भविष्यवाणी करता है कि आवश्यक लिंक की संख्या हमेशा तीन होगी और आपको पता है कि उनके नाम हमेशा के लिए क्या हैं।

मैं जो प्रचार कर रहा हूं उसे शून्य वन इन्फिनिटी नियम कहा जाता है । यह पहली बार में स्पष्ट नहीं हो सकता है, लेकिन यह मुझे बताता है कि आपका डिज़ाइन भविष्य के प्रति सहनशील नहीं है।

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

इसलिए मैं ईमेल स्ट्रिंग से परेशान नहीं हूं। मुझे पता है कि एक अलग तरीके से उपयोग किया जाता है तो लिंक।

इसलिए जब तक मुझे इन लिंक का उपयोग करने का कोई कारण नहीं दिखता है, मैं लिंक संग्रह के पक्ष में हूं।


4
FacebookProfile, InstagramProfile, ...मुझे लगता है कि ओपी ने पहले ही सवाल का जवाब दिया। इसकी भाषा हमें बता रही है कि उपयोगकर्ताओं के पास सामाजिक नेटवर्क्स से संबंधित कोई भी या कई प्रोफ़ाइल नहीं हो सकती हैं । लेकिन उसके अंदर के प्रोग्रामर ने इस तत्व को मात्र कड़ियों में बदल दिया। का संग्रह क्यों नहीं Profiles? मैं CandiedOrange से सहमत हूं। आप भविष्य के बारे में बहुत कुछ मान रहे हैं। नए सामाजिक नेटवर्क दिखाई दे सकते हैं। वास्तविक लोग गायब हो सकते हैं। उपयोगकर्ता एक नेटवर्क से दूसरे नेटवर्क पर जा और आ सकते हैं।
Laiv

यह एक अनुमान है। कहते हैं कि आप सामाजिक प्रोफ़ाइल के लिए इन प्रोफाइल का उपयोग करना चाहते हैं। घटक प्रोफ़ाइल के बाद, हमारे पास प्रारंभ करने के लिए कहाँ है। जहां इन प्रोफाइल के साथ प्रमाणीकरण और वर्तमान सत्र के बारे में जानकारी संलग्न करना है। इसे YAGNI या ओवर-इंजीनियरिंग माना जा सकता है, लेकिन इसके बारे में सोचने के लिए कुछ भी नहीं है, देखें कि क्या इन सुविधाओं का अनुरोध किया जा सकता है या क्या वे हमारे आवेदन को मूल्य प्रदान कर सकते हैं। यदि नहीं, तो उन्हें त्याग दें।
Laiv

1
@ प्रभु इस पर निर्भर करते हैं कि आप इसे क्यों सीमित कर रहे हैं। मेरा अनुमान केवल जीयूआई में बहुत फिट है। जो ठीक है। लेकिन जीयूआई के कारण डेटा संरचना को सीमित न करें। GUI एक सनकी पर बदलते हैं। डेटा संरचनाओं को बदलना महंगा है। यह वास्तव में उन्हें पहली बार सही पाने के लिए भुगतान करता है।
कैंडिड_ऑरेंज

2
यही तो बात है। बस उन संरचनाओं को अपनाएं जो भविष्य में संभावित परिवर्तनों को कम दर्दनाक बना देंगे। न आधिक न कम। हम, कैंडिड और मैं ऐसा इसलिए कहते हैं क्योंकि हम (मैं विश्वासी) अक्सर इसी तरह की परिस्थितियों का सामना कर चुके हैं और हम संभावित विशेषताओं को बदलने या विकसित करने के लिए अतिसंवेदनशील हैं। अंत में, आप इस परियोजना और इसके भविष्य की संभावना के करीब हैं।
Laiv

1
@ प्रभु: ध्यान दें कि आपने अच्छे अभ्यास के बारे में एक प्रश्न पूछा था , न कि यह आपके विशिष्ट परिदृश्य के लिए सबसे संक्षिप्त दृष्टिकोण है। मैं आमतौर पर ओवर-इंजीनियरिंग से बचने के पक्ष में हूं, लेकिन भविष्य के रखरखाव की लागत (लिंक जोड़ने / हटाने, इकाई वर्ग की परिभाषाओं को अपडेट करने, ...) लिंक के संग्रह को लागू करने की लागत से बहुत अधिक है। यदि आप अपने कॉलम कहते हैं link1, तो link2, link3संग्रह की आवश्यकता अधिक स्पष्ट होती। हालाँकि, इस तथ्य को कि आपने कॉलम को अधिक सार्थक नाम दिया है, इस तथ्य को नहीं बदलता है कि यह दोहरावदार डेटा का संग्रह है।
13

6

आप "मैं एक तकनीकी संभावना देखता हूं" जाल में गिरने की कगार पर हूं।

सिर्फ इसलिए कि आप वस्तुओं के बीच एक सामान्य विशेषता देखते हैं इसका मतलब यह नहीं है कि उन पर कुछ एकत्रीकरण लागू करने के लिए समझ में आता है। एकत्रीकरण का मतलब कुछ होना चाहिए। तकनीकी स्तर पर नहीं बल्कि आपकी समस्या डोमेन में।

वे सभी लिंक ठीक हैं, लेकिन उपयोगकर्ता वर्ग के संदर्भ में, क्या इसका कोई मतलब है? नहीं। यह "स्ट्रिंग्स" और "संख्या" नामक कक्षाओं का उपयोग करके उप-समूह के रूप में अर्थहीन होगा।

इस तरह की बात से परेशानी होती है कि यह आपके मॉडल को दोष देता है। यह डोमेन की पूरी समझ रखने से पहले, कोड रीडर को अर्थहीन से अर्थ को अलग करने के लिए मजबूर करता है।

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


वास्तव में मेरा संदेह क्या था जिसने मुझे यह सवाल पूछने के लिए प्रेरित किया। विभिन्न लिंक के बीच एकमात्र संबंध यह है कि वे संभवतः UI में एक साथ प्रदर्शित होंगे। तो, इस मामले में, आप उन्हें एक अलग ऑब्जेक्ट के अधिकार में नहीं रखने का सुझाव देंगे, बल्कि उन्हें सीधे उपयोगकर्ता ऑब्जेक्ट के अंतर्गत रखेंगे?
प्रभु

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

मैं आम तौर पर अधिक इंजीनियरिंग से बचने की तरह है, लेकिन मैं आश्चर्य करते हैं: आप एक ही बात कहा है अगर ओपी अपने खेतों नाम दिया था होगा link1, link2, link3? डेटा संरचना का डिज़ाइन फ़ील्ड के नाम से स्वतंत्र है, इसलिए मेरा उदाहरण कार्यात्मक रूप से समतुल्य है। यह भविष्य की बात है। YAGNI आम तौर पर लागू होता है, लेकिन अगर कुछ भी हो, तो सोशल मीडिया ने खुद को वायरल लोकप्रियता और परिवर्तनों के लिए अतिसंवेदनशील साबित कर दिया है। हर नए लोकप्रिय सोशल मीडिया साइट के लिए पुनर्विकास से बचना वांछनीय लगता है। अन्यथा, आप "एक और क्षेत्र क्या है?" जाल, जो भारी कर्ज पैदा कर सकता है।
14

1

सामान्य तौर पर, मुझे लगता है कि structयदि आप उनमें से प्रत्येक पर समान संचालन लागू करने की संभावना रखते हैं, और यदि आप हमेशा उन सभी पर समान कार्य करते हैं, तो लिंक का अपने आप में होना उचित होगा । यदि वे आपके आवेदन में असंबंधित उद्देश्यों के लिए हैं, तो मैं उन्हें अलग कर दूंगा। उदाहरण के लिए, यदि वे उपयोगकर्ता के मुखपृष्ठ, उनके स्वास्थ्य बीमा प्रदाता की वेब साइट और उनकी पसंदीदा समाचार साइट के लिए एक लिंक हैं, तो मैं शायद उन्हें एक साथ समूहित नहीं करूंगा क्योंकि वे असंबंधित प्रतीत होते हैं। लेकिन 3 सोशल मीडिया साइटों के लिए, ऐसा लगता है कि उन्हें एक ऐप में समान रूप से व्यवहार किया जाएगा, और जैसे कि संभवतः एक साथ समूहीकृत किया जाना चाहिए। मैं Linksहालांकि अधिक विवरणात्मक नाम का उपयोग करूंगा । (किस प्रकार के लिंक? आपके ऐप में किस उद्देश्य के लिए?)

मैं # 2 पर आपकी सोच से सहमत हूं। जैसा कि ऊपर उल्लेख किया गया है, यदि संख्या बढ़ती या परिवर्तनशील हो जाती है, तो एक सूची या अन्य संग्रह एक अच्छा विकल्प होगा, लेकिन आपके द्वारा वर्णित परिदृश्य के लिए नहीं।

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

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