2012-06-16 15 views
11

स्कैला में ऑब्जेक्ट संरचना व्यक्त करने के लिए दो यंत्र हैं: मूल स्व-प्रकार की अवधारणा और अच्छी तरह से ज्ञात छोटी संरचना। मैं curios हूँ कि मुझे किस स्थितियों का उपयोग करना चाहिए जिसमेंरचना और स्व-टाइपिंग उपयोग-मामलों में अंतर कैसे करें

उनकी प्रयोज्यता में स्पष्ट अंतर हैं। स्व-प्रकार के लिए आपको लक्षणों का उपयोग करने की आवश्यकता होती है। ऑब्जेक्ट संरचना आपको विभिन्न घोषणाओं के साथ रन-टाइम पर एक्सटेंशन बदलने की अनुमति देती है।

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

वह नियम पूर्ण नहीं हैं। आप इस तकनीक के बीच कोड को कन्वर्ट करने के लिए अतिरिक्त काम कर सकते हैं। जैसे आप उत्पाद 4 पर स्वयं-टाइपिंग के साथ 4 पहियों की संरचना को प्रतिस्थापित कर सकते हैं। आप केक पैटर्न निर्भरताओं के लिए Cake { this : MyType => } के बजाय Cake[T <: MyType] {part : MyType} का उपयोग कर सकते हैं। लेकिन दोनों मामले उलझन में लगते हैं और आपको अतिरिक्त काम देते हैं।

हालांकि सीमावर्ती उपयोग के मामले बहुत सारे हैं। एक-से-एक संबंधों का निर्णय लेना बहुत मुश्किल है। क्या यह तय करने के लिए कोई आसान नियम है कि किस प्रकार की तकनीक बेहतर है?

स्व-प्रकार आपको कक्षाओं को सार बनाता है, रचना आपके कोड वर्बोज़ बनाती है। स्व-प्रकार आपकी समस्याओं को मिश्रित नामस्थानों के साथ देता है और आपको मुफ्त में अतिरिक्त टाइपिंग भी देता है (आपको केवल दो तत्वों का कॉकटेल नहीं मिला बल्कि गैसोलीन-मोटर तेल कॉकटेल को पेट्रोल बम के रूप में जाना जाता है)।

मैं उनके बीच कैसे चयन कर सकता हूं? वहां क्या संकेत हैं?

अद्यतन:

एडाप्टर पैटर्न:

हमें निम्न उदाहरण पर चर्चा करें। दोनों सेल्ट-टाइपिंग और संरचना दृष्टिकोण के साथ इसका क्या लाभ है?

+0

ऐसा लगता है जैसे कि आपने अधिकांश व्यापार-बंद को कवर किया है। मैं जोड़ूंगा कि कम कुशल टीमों के लिए यह रचना अधिक परिचित होने की संभावना है। आप संरचना, ** या ** का उपयोग करने वाले सीमा मामलों में इसका उपयोग करने के लिए एक कारण के रूप में इसे ले सकते हैं, ताकि सीखने और विकास को प्रोत्साहित किया जा सके।सब कुछ बराबर है, मैं सिर्फ शब्दशः कारणों के लिए स्वयं टाइपिंग के साथ जाना जाता हूं। यहां बहुत मदद नहीं है, मुझे डर है, यही कारण है कि यह एक उत्तर के बजाय एक टिप्पणी है। उत्कृष्ट सवाल –

+0

क्या आपको संतोषजनक उत्तर मिला है? – Optimight

+0

मुझे तकनीकी सटीकता के बिना कुछ दार्शनिक उत्तर मिल गए हैं जिनका उपयोग कंप्यूटर * विज्ञान * में किया जाना चाहिए। प्रश्न स्वयं अनुचित है – ayvango

उत्तर

3

नीचे दिए गए संकेत हेरिस्टिक दृष्टिकोण से प्राप्त होते हैं (एक एल्गोरिदमिक दृष्टिकोण अव्यवहारिक रूप से उपयोग की जाने वाली समस्या निवारण की परीक्षण-और-त्रुटि विधि) और किसी भी सूत्र (गणितीय-आधारित तर्क) द्वारा समर्थित नहीं है।

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

(नीचे निम्नलिखित उल्लेख करते हुए संकेत, मुझे परवाह या शब्दाडंबर या कोड या प्रोग्रामिंग प्रयास आदानों की लाइनों की संख्या पर ध्यान केंद्रित नहीं है।)

संरचना (शब्दकोश अर्थ): भागों या तत्वों के संयोजन का कार्य एक पूरे (तुच्छ संरचना)

विशेषता (शब्दकोश अर्थ) बनाने के लिए: एक ख़ास विशेषता या गुणवत्ता

संकेत तुच्छ संरचना (जो सुपर द्वारा प्राप्त किया जा सकता है - उप वर्ग तंत्र या संघ संबंध) के लिए (जैसे कार और पहियों):

  • जिसे विघटित रूप से गिना जा सकता है (उदाहरण के लिए।पहियों)

  • कौन सा आगे वर्गीकृत किया जा सकता है (विभिन्न criterias के आधार पर) (जैसे पहियों - मिश्र धातु पहिया, इस्पात पहिया आदि)

  • कौन सा या जोड़ा जा सकता है हटा दिया (ध्यान दें:। जब हम कहते हैं पहिया बंद कर दिया, यह वास्तव में पहिया के रोटेशन की गति बंद कर दिया जाता है, जब हम कहते हैं कि दिल बंद कर दिया, यह वास्तव में है दिल की pulsating गति शून्य हो गया है)

  • आम तौर पर कुछ के लिए लागू (ब्रह्मांड में कुछ वाहन और कुछ मशीनरी पहियों) (कुछ कर सकते हैं 10-15 या लाखों भी हो - व्याख्या करने के लिए हमें बयान समझने दें: जब भूगर्भिक समय के बारे में बात करते हैं और कुछ समय पहले कहते हैं, यह कुछ लाख साल पहले का मतलब है, यह स्वयं प्रकार (विशेषता) (उदाहरण के लिए

संकेत वास्तविक विषय पर निर्भर करता है)। कार और स्पीड):

  • कौन सा एकआयामी है (भौतिक विज्ञान की दृष्टि से नहीं), (

  • एक नंबर लाइन पर साजिश रची जा सकता है जो कुछ भी भौतिक इकाई है) (जैसे गति) कौन से नहीं आगे स्वाभाविक रूप से वर्गीकृत किया जाना चाहिए (उदाहरण के लिए स्पीड) (या कम से कम आप इसे आगे वर्गीकृत नहीं करेंगे) यहां, स्वाभाविक रूप से शब्द का अर्थ यह है कि इसे वर्गीकृत करने के लिए आपको अपने स्वयं के मानदंडों पर निर्भर रहना होगा और इसे वर्गीकृत करने की एक निश्चित संभावना होगी लाखों उप प्रकारों में। कदम उठाएं, आपके पास लाखों चाल उप-गुण हो सकते हैं ... जैसे ज़िगज़ैग चाल, घूमना और आगे बढ़ना, ... (विभिन्न क्रमपरिवर्तन संयोजन के साथ मिलियन संभावना)।

  • कौन सा या बढ़ाया जा सकता है की कमी हुई या stoped (जैसे। गति, क्रोध, प्रेम आदि)

  • कौन सा आम तौर पर देखा जाता है/बहुत ही दूर रखा वर्गों (जैसे प्रकाश की गति, की गति में देखा जा सकता पृथ्वी, धावक की गति)

  • आम तौर पर लागू करने के लिए कई (ब्रह्मांड बहुमत (यहाँ में हर) वस्तु गति है)

    सॉफ्टवेयर विकास अपने स्वयं के ब्रह्मांड बनाने की तरह है और एक निर्माता आप सब कुछ परिभाषित के रूप में है। आपके डोमेन (अपने स्वयं के ब्रह्मांड) में दूर-दराज के वर्गों के बीच एक विशेषता देखी जाएगी।

कृपया ध्यान दें कि मैं किसी भी भाषा में किसी भी विशिष्ट शब्द (यहाँ विशेषता के लिए समकक्ष) नहीं देखा है हिस्सा जो तुच्छ संरचना के लिए प्रयोग किया जाता है के लिए (मैं बहुत कम लोग जानते हैं)।

आगे स्पष्टीकरण:

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

एक और चीज जो आपको चाहिए वह अर्थशास्त्र की गहरी समझ है (अर्थ का अध्ययन या अर्थ और रूप में परिवर्तनों की वर्गीकरण और जांच करके भाषाई विकास का अध्ययन) जिसका उपयोग हम वास्तविक दुनिया और खोजशब्दों के पीछे अर्थशास्त्र का वर्णन करने के लिए करते हैं (प्रोग्रामिंग भाषा में) हम प्रोग्रामर के रूप में उपयोग करते हैं।

मेरा मानना ​​है कि, जब हम कक्षा बनाते हैं तो हम असली दुनिया को सॉफ्टवेयर में प्रकट करना चाहते हैं।कक्षा असली दुनिया से कुछ का प्रतिनिधित्व हो जाती है, यह कार, मानव, स्टार, सपना, विचार या कल्पना आदि हो सकती है।

जब कोई "व्हील" कहता है, तो आपके आकार और एप्लिकेशन की स्पष्ट कट तस्वीर होगी और आप सड़क पर रोल करने वाले व्हील या पहियों को चलाने के बारे में सोच सकते हैं। व्हील हमेशा कुछ का हिस्सा बनें। इसे अलग संख्या में गिना जा सकता है। पहियों को आगे सामग्री, आवेदन, आकार इत्यादि जैसे मानदंडों के आधार पर वर्गीकृत किया जा सकता है। जैसे चीजें ट्रिविअल संरचना के लिए अर्हता प्राप्त करती हैं।

जब कोई "स्पीड" कहता है, तो आपके पास इसकी कोई स्पष्ट कट तस्वीर नहीं होगी ... कोई आकार नहीं ... कोई रंग नहीं ... लेकिन आप इसे ब्रह्मांड में किसी भी चलती (सापेक्षता) भाग से जोड़ सकते हैं। यह एक विशेषता, विशेषता है। गति कुछ भी नहीं है। यह वहां हो सकता है या यह वहां नहीं हो सकता है। इसे एक लाइन पर प्लॉट किया जा सकता है (या तो दिशा + या -)। "स्पीड" वर्गीकृत करना मुश्किल है। चीजों की तरह गति गुण के लिए अर्हता प्राप्त करता है।

मेरी राय में,

अगर हम एक वर्ग (वस्तु) के रूप में कार ले, विशेषताओं की तरह "स्पीड" स्केला में विशेषता के रूप में जाना चाहिए। और भागों की तरह "व्हील", घटकों को "ट्रिविअल कंपोज़िशन" के रूप में जाना चाहिए। विशेषताओं की तरह "गति" में प्राकृतिक वर्गीकरण नहीं होगा, जहां "पहियों" में कई वर्ग हो सकते हैं और वे स्वयं स्वतंत्र वस्तुओं (वास्तविकता में) हैं।

यदि हम मानव को कक्षा (ओजेक्ट) के रूप में लेते हैं, तो "क्रोध, रोना, हंसना आदि" व्यवहार की तरह विशेषता के रूप में जाना चाहिए और "हाथ, पैर, मस्तिष्क, दिल, आदि" "ट्रिविअल कंपोज़िशन" के रूप में जाना चाहिए क्योंकि वे स्वयं स्वतंत्र वस्तुओं (वास्तविकता में) हैं।

यदि हम नाम के बारे में सोचते हैं, तो इसे किसी भी और किसी को भी दिया जा सकता है यानी हमारे निकटतम सितारे का नाम "सूर्य" है, उच्चतम पर्वत का नाम "हिमालय" है, मेरे कुत्ते का नाम "रॉकी" है, नदी में एक नाम "अमेज़ॅन" .... "नाम" एक विशेषता है और इसे "ट्रिविअल कंपोज़िशन" के लिए नहीं माना जाना चाहिए।

यदि हम दिल के बारे में सोचते हैं, तो जानवरों का दिल उनके हिस्से के रूप में होता है। इसे "ट्रिविअल कंपोज़िशन" के लिए माना जाना चाहिए और एक विशेषता के रूप में नहीं।

कक्षा क्या है?

कक्षा एक विशेष वस्तु का विवरण या नीला प्रिंट है।

ऑब्जेक्ट क्या है?

ऑब्जेक्ट एक वास्तविकता है जिसे कक्षा परिभाषा द्वारा वर्णित किया जा सकता है।

(अंडे या मुर्गी? जो पहले आया था?) मेरा मानना ​​है कि सॉफ्टवेयर इंजीनियर पहले ऑब्जेक्ट्स के बारे में सोचता है और फिर (उन्हें वर्णन करने या उन्हें बनाने के लिए) (ब्लूप्रिंट से) कक्षा को परिभाषित करता है। (कृपया ध्यान दें कि ऑब्जेक्ट ओरिएंटेड मॉडलिंग और डिज़ाइन में - कक्षा और वस्तु एक-दूसरे के अस्तित्व का पूरक हैं।) ("अंडे या मुर्गी? जो पहले आया था? वर्ग और वस्तु के सह-अस्तित्व के लिए है और प्रसिद्ध मंडल-ग्रहण के साथ कोई प्रासंगिकता नहीं है समस्या (http://en.wikipedia.org/wiki/Circle-ellipse_problem) के रूप में बाद में विरासत या उप-प्रकार बहुरूपता के साथ संबंधित है)

इंटरफ़ेस:। एक बात यह है कि अलग है और कभी कभी असंगत तत्वों को प्रभावी ढंग से

समन्वय करने के लिए सक्षम बनाता है

सॉफ्टवेयर विकास आपके स्वयं के ब्रह्मांड को बनाने जैसा है और एक निर्माता के रूप में आप सबकुछ परिभाषित करते हैं। संरचना को विरासत पर प्राथमिकता दी जानी चाहिए। (चार की गैंग - डिजाइन पैटर्न)

+0

में सबसे अधिक कवर किया है, जिस बिंदु को "आगे वर्गीकृत किया जा सकता है" विशेषता विशेषता स्वयं-टाइपिंग के लिए भी काम करता है। जैसे हम विशेषता चलने योग्य और subtraits का उपयोग करते हैं जो स्ट्रेट चाल, घुमावदार चाल और इतने पर परिभाषित करता है। – ayvango

+0

रुकने में सक्षम होने से स्व-टाइपिंग की तुलना में संरचना के लिए बहुत कुछ है। आप का हिस्सा काम करना बंद नहीं कर सकता है (क्योंकि मानव बंद दिल से नहीं रह सकता है)। – ayvango

+0

बच्चे-अभिभावक संबंध में बहुत अंतर है। यदि पैरेंट संरचना के माध्यम से दो भागों में बनाया गया है जिसमें विधियों का आकार है() यह कुल आकार की गणना अधिकतम (a.size(), b.size()) या a.size() + b.size() और इसी तरह की गणना कर सकता है। यदि यह मामला स्व-टाइपिंग के साथ कवर किया गया है तो सभी हिस्सों बराबर हैं और स्टैकेबल विशेषता पैटर्न का उपयोग करना चाहिए – ayvango

संबंधित मुद्दे