2012-01-18 10 views
9

मैं रेखांकन का प्रतिनिधित्व javascript ऑब्जेक्ट का एक तरीका के लिए देख रहा हूँ ...यूएमएल?

मुझे पता है यूएमएल, लेकिन उदाहरण के लिए, कैसे श्रृंखला 2 के बीच वस्तुओं, जैसे प्रतिनिधित्व करने के लिए:

var a, b; 

a = {}; 
b = Object.create(a); 
Intuitively, मैं कुछ इस तरह आकर्षित होता

:

+-----+ 
|b | 
|-----| 
|  | 
+--+--+ 
    |  +-----+ 
    +---->|a | 
     |-----| 
     |  | 
     +-----+ 

लेकिन वहाँ यूएमएल में एक सभ्य प्रतिनिधित्व है?

और मिक्सिन के बारे में क्या?

c = $.extend({}, a, b) 

+-----+   +-----+ 
|a |   |b | 
|-----|   |-----| 
|  |<----------|  | 
+-----+   +-----+ 
    +  +-----+ 
    |  |c | 
    |  |-----| 
    +---->|  | 
     +-----+ 

उत्तर

3

ऐसा लगता है कि आप क्लास आरेख में ऑब्जेक्ट इंस्टेंस के बीच संबंध दिखाने की कोशिश कर रहे हैं। यह वास्तव में काम नहीं करेगा; आप शायद यूएमएल इंस्टेंस आरेख का उपयोग करना चाहते हैं (ऑब्जेक्ट आरेख भी कहा जा सकता है)। एक वर्ग आरेख प्रणाली अवधारणाओं, उनकी संरचना और उनके संबंधों को एक स्थिर तरीके से पकड़ने के लिए है। यह कक्षा आरेख से शुरू करने में मदद कर सकता है और उसके बाद एक आवृत्ति आरेख पर जा सकता है जहां आप "स्लॉट्स" या गुणों के गुणों में कुछ मान प्लग कर सकते हैं ताकि यह देखने के लिए कि आपके वर्ग आरेख में मॉडल काम करता है या नहीं।

6

सबसे पहले आपको यह जानने की आवश्यकता है कि जावास्क्रिप्ट prototype-based inheritance का उपयोग करता है। इसका मतलब है कि अन्य ओओ भाषाओं (जैसे जावा) में कक्षाओं और उदाहरणों के बीच कोई अंतर नहीं है। केवल वस्तुएं हैं। इसका एक निहितार्थ यह है कि class और object diagrams के बीच अंतर को समझ में नहीं आता है।

अपना पहला उदाहरण के लिए

:

var a, b; 

a = {}; 
b = Object.create(a); 

यह विरासत है - वस्तु b वस्तु a के गुणों इनहेरिट करती है।

object b inherits from object a

mixins एकाधिक वंशानुक्रम के रूप में देखी जा सकती है, वस्तु c वस्तु a और b, आरेख से गुण विरासत में है: यूएमएल में इस मॉडल के लिए

सही तरह से इस वर्ग/वस्तु चित्र है उस के लिए इस प्रकार दिखाई देंगे:

object c inherits from a and b

+1

पूरी तरह सटीक नहीं है कि किसी ऑब्जेक्ट और उसके वर्ग के बीच कोई अंतर नहीं है। कम से कम एक प्रकार के सैद्धांतिक दृष्टिकोण से नहीं। किसी भी वस्तु का एक दिया प्रकार है। एक ही प्रोटोटाइप वाला कोई भी ऑब्जेक्ट उसी प्रकार से होता है और उसी प्रोटोटाइप वाले किसी ऑब्जेक्ट से मिलता है और उसी ऑब्जेक्ट गुणों का एक ही प्रकार होता है। तो आप वास्तव में प्रकारों की तुलना में अधिक वस्तुओं की संभावना हो सकती है। यही कारण है कि हालांकि अपनी बात :) –

+0

हुए कहा कि यह जावास्क्रिप्ट में वर्ग के कोई प्रतिनिधित्व है कि वहाँ है की एक अधिक तकनीकी रूप से सही तरह से अमान्य नहीं है। – ArtB

+0

चूंकि इस पोस्ट के बाद से कुछ सालों रहे हैं। मैं इसे स्पष्ट करता हूं कि जो कोई भी यह पढ़ता है कि ईसीएमएस्क्रिप्ट 2015 में अब कक्षाएं शामिल हैं और प्रोटोटाइप-आधारित विरासत से दूर नहीं जाती हैं। [कड़ी] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) – Nightforce2

0

आपका उदाहरण का प्रतिनिधित्व संबंधों हैं ऑब्जेक्ट्स के बीच कूल्हों, कक्षाओं में नहीं, इसलिए यूएमएल ऑब्जेक्ट आरेख जाने का तरीका है (जैसा कि रॉबर्टएमएस ने पहले ही बताया है)।

वस्तुओं अर्थ में एक दूसरे से जुड़े हुए हैं (पहले मामले में) वस्तु है कि a वस्तु b की प्रोटोटाइप है। मैं इसके लिए निर्भरता संबंध का उपयोग करूंगा। विकिपीडिया में यूएमएल निर्भरता नोटेशन here का अच्छा विवरण है।

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

मैं स्टीरियोटाइप "< < आद्य >>" के साथ निर्भरता लेबल होगा।

यूएमएल आपको बहुत लचीलापन देता है, हालांकि यह सम्मेलन का पालन करना अच्छा है।

this page by Scott Ambler पर ऑब्जेक्ट आरेखों का एक अच्छा उपचार है।

jQuery के extend फ़ंक्शन का उपयोग करके, आपके दूसरे उदाहरण में, आपके पास कोई वास्तविक प्रोटोटाइप संबंध नहीं है, लेकिन आप कुछ ऑब्जेक्ट्स से अन्य ऑब्जेक्ट में गुण विलय कर रहे हैं। इस मामले में, मुझे यकीन नहीं है कि इसके लिए एक विशिष्ट अतिव्यापी मॉडलिंग शब्द है। यद्यपि यहां एक तरह की निर्भरता है। मैं मानक यूएमएल निर्भरता लकीर के फकीर की सूची (उपर्युक्त विकिपीडिया पृष्ठ पर सूचीबद्ध) के माध्यम से देख सुझाव है और देखते हैं अगर कुछ भी अपने विशिष्ट आवेदन में समझ में आता है। शायद < < परिष्कृत >> आपके लिए काम करता है?

+0

क्यों नहीं विरासत का उपयोग करें? मेरा मानना ​​है कि यह इस मामले में अधिक उपयुक्त है, क्योंकि विरासत केवल निर्भरता की तुलना में दो वस्तुओं के बीच घनिष्ठ संबंध दर्शाती है। मैं अनदेखा करता हूं कि आपको कक्षा आरेखों का उपयोग नहीं करना चाहिए, यूएमएल को प्रोटोटाइप-आधारित विरासत के साथ दिमाग में डिजाइन नहीं किया गया था। – romario333

+0

मैं ओपी के उदाहरण _if_ जे एस के लिए यूएमएल विरासत का उपयोग _would_ कर दिया जाता था, उदा एक आकार ctor w/एक प्रोटोटाइप और एक सर्किल ctor जिसका प्रोटोटाइप आकार.प्रोटोटाइप से जुड़ा हुआ था! लेकिन ओपी ने केवल व्यक्तिगत वस्तुओं को दिखाया, और कभी भी ऐसा कुछ नहीं दिखाया जो मुझे उप-वर्ग जैसा दिखता था। मैं देख सकता था कि वस्तुएं अन्य वस्तुओं से प्राप्त की जा रही थीं। यदि कुछ भी पहले उदाहरण में, यह अधिक की तरह 'A'" प्रकार "है और' b' "उदाहरण" है (कि कैसे 'Object.create' प्रयोग किया जाता है)। कोई उपclassing नहीं। हालांकि, मैं आपसे सहमत हूं कि हमें यूएमएल की लचीलापन का फायदा उठाना चाहिए और जहां आवश्यक हो वहां अनदेखा करना चाहिए। –

+0

का उपयोग कर विरासत सिर्फ 'Object.create' काफी [आम बात] है (http://javascript.crockford.com/prototypal.html)। एक अन्य कारण यह है कि मेरा मानना ​​है कि विरासत यहां बेहतर दृष्टिकोण है कि वस्तु 'ए' के ​​भीतर कोई भी संपत्ति 'बी' द्वारा "विरासत में" है, वे बी के इंटरफेस का हिस्सा बन जाते हैं। – romario333

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